CSS 中的文本下划线动画 - 最简单的方法?

Text underline animation in CSS - the simplest way?

当用户指向我网站上的链接时,我有动画下划线效果。下划线比文本本身宽一点,因为有一点水平填充。

这是我想要达到的效果并且我做到了:

我在想是否可以简化我的代码。经过反复试验,我在下划线元素上使用了负数 margin-left 并使用 calc() 来计算其 width100% + 2 * padding。在我看来,它是一个过于复杂的解决方案。如果没有 calc() 并且也许没有负边距,是否可以实现相同的效果?

请注意,添加包装器元素不是一个选项。它需要是一个普通的 <a> 元素。

:root {
    --link-color: #f80;
    --link-underline-padding: .5em;
}

a {
    color: var(--link-color);
    display: inline-block;
    padding: 0 var(--link-underline-padding);
    text-decoration: none;
}

a:after {
    background-color: var(--link-color);
    content: '';
    display: block;
    height: .1em;
    margin-left: calc(var(--link-underline-padding) * -1);
    margin-top: .2em;
    transition: width .5s;
    width: 0;
}

a:hover:after {
    width: calc(100% + var(--link-underline-padding) * 2);
}
I find <a href="#">dogs</a> pretty cool.

如果将 a 设置为 position: relative;,则可以使用 position: absolute;left: 0px; 将其推过填充,然后只需使用 width: 100% 即可让它延伸整个长度。

:root {
    --link-color: #f80;
    --link-underline-padding: .5em;
}

a {
    position: relative;
    color: var(--link-color);
    display: inline-block;
    padding: 0px var(--link-underline-padding);
    text-decoration: none;
}

a:after {
    position: absolute;
    left: 0px;
    background-color: var(--link-color);
    content: '';
    display: block;
    height: .1em;
    margin-top: .2em;
    transition: width .5s;
    width: 0;
}

a:hover:after {
    width: 100%;
}
I find <a href="#">dogs</a> pretty cool.

一个简单的背景动画就可以做到:

a {
  background: linear-gradient(currentColor 0 0) 
    bottom left/
    var(--underline-width, 0%) 0.1em
    no-repeat;
  color: #f80;
  display: inline-block;
  padding: 0 .5em 0.2em;
  text-decoration: none;
  transition: background-size 0.5s;
}

a:hover {
  --underline-width: 100%;
}
I find <a href="#">dogs</a> pretty cool.

相关: