【问题标题】:Why is there a delay for the transition of my pseudo elements?为什么我的伪元素的过渡会有延迟?
【发布时间】:2020-10-05 12:55:36
【问题描述】:

我需要为元素及其伪元素设置动画。

然后我注意到,当我悬停时,一切都很好。但随后我停止悬停,Home 首先动画,然后伪元素 Link 开始动画。

为什么会这样?有没有办法让它们同时动画?

这是我的问题的简化再现:

a {
  color: blue;
  transition: all 1s;
  text-decoration: none;
}

a:hover {
  color: red;
  font-size: 48px;
}

a:hover::before {
  color: green;
  font-size: 32px;
}

a::before {
  content: 'Link:';
  transition: all 1s;
}
<a href="javascript: void(0)">Home</a>

我正在使用带有 Chrome 的 MacOS Version 83.0.4103.97 (Official Build) (64-bit)

如果你不能重现问题,这里是它的屏幕截图:

【问题讨论】:

  • 我可以在 Windows 上用 Chrome 重现该问题,但 不能 用 Firefox。假设这取决于浏览器处理超链接转换的方式。
  • @ObsidianAge 太奇怪了,我试过 FireFox 也很好用。

标签: css css-transitions pseudo-element


【解决方案1】:

我还将默认值分配给::before,并且工作正常。我认为它试图继承默认值并且令人困惑。

a {
  color: blue;
  transition: all 1s;
  text-decoration: none;
}

a:hover {
  color: red;
  font-size: 48px;
}

a::before {
  content: 'Link:';
  transition: all 1s;
  font-size: 1rem;
  color: blue;
}

a:hover::before {
  color: green;
  font-size: 32px;
}
<a href="javascript: void(0)">Home</a>

【讨论】:

  • 另外,颜色过渡也会延迟。也许我只需要定义动画所需的所有默认属性。
【解决方案2】:

我找到了一个关于鼠标悬停的解决方案,它有点难看,但至少它工作顺利

a {
  color: blue;
  transition: all 1s;
  text-decoration: none;
}

a::before {
  content: 'Link:';
/*   transition: all 1s; */
}
a:hover {
  color: red;
  font-size: 48px;
}
a:hover::before {
  transition: all 1s;
  color: green;
  font-size: 32px;
}
<a href="javascript: void(0)">Home</a>

【讨论】:

    【解决方案3】:

    因为伪元素没有默认的font-size,所以伪元素将inherit 的字体大小为a。这是正在发生的事情:

    1. 我们最初在font-size X 有两个元素(X 基于您的其他属性,16px 此处)
    2. 悬停时伪元素将具有32pxa 将具有48px
    3. 当您取消悬停时(这是技巧),伪元素将暂时继承a (48px) 的font-size,因此您的转换将从32px48px - y,其中@ 987654336@ 正在更改 du 到应用于 a 的转换,直到 48px - y 回到 X

    同样的逻辑也适用于着色,因为它也是继承的。只需设置默认的font-sizecolor

    a {
      color: blue;
      transition: all 1s;
      text-decoration: none;
    }
    
    a:hover {
      color: red;
      font-size: 48px;
    }
    
    a:hover::before {
      color: green;
      font-size: 32px;
    }
    
    a::before {
      content: 'Link:';
      transition: all 1s;
      font-size:16px;
      color:blue;
    }
    <a href="javascript: void(0)">Home</a>

    【讨论】:

    • 感谢您的解释。但这并不能解释为什么它在 Firefox 中运行良好。也许他们使用不同的技术来解释样式继承?
    • @HaoWu 我会说它在 Firefox 中效果不佳。您需要区分您希望它如何工作和它应该如何工作。对我来说,正如我解释的那样,它在 Chrome 上运行良好,而 Firefox 失败或在继承方面做了其他事情。
    猜你喜欢
    • 2021-12-27
    • 1970-01-01
    • 2016-02-22
    • 1970-01-01
    • 2018-09-28
    • 2014-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多