悬停时的边框动画,透明部分从左向右移动

Border animation on hover with a transparent section moving left to right

我有这段代码试图在悬停时制作动画。像这样:

TextLink      hover: TextLink
--------             --  ----

我正在尝试让“透明”部分看起来像是从 左侧移动到文本 末尾的动画。

body {
  margin: 0;
  background: #16263d;
}

div {
  padding: 30px;
}

a {
  color: #fff;
  text-decoration: none;
  display: block;
  margin-top: 24px;
  transition: all 0.75s ease-in-out;
}

a span {
  border-bottom: 2px solid #fff;
}

a:hover:after {
  opacity: 1;
  -ms-filter: none;
  filter: none;
  transform: translateX(100%);
}

a:after {
  content: '';
  width: 35px;
  height: 2px;
  background: #16263d;
  display: block;
  position: relative;
  opacity: 1;
  transform: translateX(-35px);
  transition: all 0.75s ease-in-out;
}
<div>
  <a href="#"><span>Text Link and something more than this</span></a>
</div>

问题是没有考虑到 100% 的转换过渡...似乎只有 100px 是。

尝试使用渐变:

span {
 --g:40px; /* the gap */

 font-size:40px;
 background:
   linear-gradient(90deg,
      black   calc(50% - var(--g)/2),
      #0000 0 calc(50% + var(--g)/2), 
      black 0
   ) right bottom/calc(200% + var(--g)) 3px /* 3px = thickness */
   no-repeat;
}

span:hover {
  background-position: left bottom;
  transition:0.5s;
}
<span>Some text</span>

首先,您需要了解变换的百分比值是元素边界框(大小)的一部分,而不是父元素的一部分。
由于伪元素的宽度为 35px,因此转换将其移动了 35px。 (see MDN for more info)

也就是说,您可以在伪元素上为“透明”部分使用边框,如下所示:

body {
  background: #16263d;
}

a {
  font-size:20px;
  position:relative;
  color: #fff;
  text-decoration: none;
  display: inline-block;
  padding:.2em 0;
  border-bottom: 2px solid #fff;
}
a:after {
  content: '';
  position:absolute;
  bottom:-2px;
  right:100%;
  width:100%;
  height: 2px;
  border-right: 35px solid #16263d;
  transition: transform 0.75s ease-in-out;
}

a:hover:after {
  transform: translateX(100%);
}
<a href="#">Text Link and something more than this</a>