为啥这个 CSS 转换队列?

Posted

技术标签:

【中文标题】为啥这个 CSS 转换队列?【英文标题】:Why does this CSS transition queue?为什么这个 CSS 转换队列? 【发布时间】:2015-07-17 20:34:18 【问题描述】:

当我将鼠标悬停在div 上时,div 内容上会发生颜色变化之前颜色变化会影响span。为什么会这样,我怎样才能让两个动画同时发生? * transition: ... 的原因是,网站的每个元素都默认设置动画,以防其属性发生变化。

http://jsfiddle.net/wf63jquz/

html

<div>
    <span>Hello</span>
    Hola
</div>

CSS:

*,
*:before,
*:after

    -moz-transition: 2s;
    -o-transition: 2s;
    -webkit-transition: 2s;
    transition: 2s;


div 
    color: red;


div:hover

    color: green;

*编辑*

哎呀,没想到要检查其他浏览器。新问题:为什么 Chrome 做错了,我该如何为 Chrome 解决它?我想这可能是一般的 webkit 问题,但我无法快速访问 Safari 进行检查。

【问题讨论】:

在什么浏览器中?在这里工作正常(Win7 + FF31) 我真的不明白你在这里问什么,只有一个动画? add div:hover > span 到 div:hover 块,使它们在悬停时同时改变颜色,但它们仍然会在不同的时间淡出,因为你的 span 标签实际上有两个转换应用到它。 刚刚更新了我的问题,原来这可能是 Chrome (webkit?) 唯一的问题。 这样的事情就是为什么这么多年后Transitions仍然处于草案中的原因。需要考虑的边缘情况太多。 【参考方案1】:

因为 * .. 如果你使用下面的代码,它会给你想要的结果:

div:before,div:after
-moz-transition: 2s;
-o-transition: 2s;
-webkit-transition: 2s;
transition: 2s;

【讨论】:

【参考方案2】:

试试这个

*,
*:before,
*:after

    -moz-transition: 2s;
    -o-transition: 2s;
    -webkit-transition: 2s;
    transition: 2s;


div, span 
    color: red;


div:hover, span:hover

    color: green;
<div>
    <span>Hello</span>
    Hola
</div>

【讨论】:

这实际上相当不错,尽管它具有能够悬停span 并看到它动画但div 保持红色的不良效果(在Chrome 中)。我将其更改为将原来的span 设置为红色(请参阅jsfiddle.net/wf63jquz/6)效果更好,除非您在两个单词之间滑动鼠标,否则动画会彻底混乱。【参考方案3】:

这似乎是 Chrome 的一个问题,因为它首先对所有标准 HTML 元素进行动画处理,然后再处理其余内容。

为了解决这个问题,似乎将标签外的内容包装在一个标签内,这是可行的。所以你的 HTML 将是:

<div>
    <span>Hello</span>
    <span>Hola</span>
</div>

DEMO

正如@Boltclock 所说,这些“怪癖”归结于过渡仍在草稿中这一事实,因为似乎没有人将它们做得非常完美 :)

【讨论】:

这看起来对时间做了一些非常奇怪的事情。我将它延长到 5 秒(参见 jsfiddle.net/wf63jquz/9),它似乎要等待很长时间,然后在更短的时间内过渡。 @Chris 这看起来像是在堆叠动画(每个层次结构),所以它似乎等待了 10 秒(div 转换为 5 秒,span 为 5 秒)。这里发生了一些奇怪的事情。我的建议是不要将*transition 结合使用!

以上是关于为啥这个 CSS 转换队列?的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个 CSS 过渡没有按预期工作? [复制]

为啥使用 javascript / jQuery 添加类时 css 转换不起作用?

我不明白为啥 CSS 转换在 keydown 上不起作用 [重复]

为啥 CSS 转换翻译会将表格行的边框留在原来的位置?

为啥在 ng-repeat 列表中 unshift() 而不是 shift() 会发生 CSS 转换?

使用三次贝塞尔计时函数,在一些 JS 中随着时间的推移在 CSS 中交错转换元素不透明度,为啥它只工作一次?