【问题标题】:restart/reset and replay a transition css?重新启动/重置并重播过渡 css?
【发布时间】:2016-09-23 04:53:13
【问题描述】:

我需要使用 javascript 重放 css 转换。 当我重置 div 的 css 样式并应用新的转换时,什么也没有发生...

我认为这两个代码都是在同一个执行框架中执行的,通过优化,它不会改变任何东西......

例如:https://jsfiddle.net/f0s8a8jp/2/

test.css({transition: 'none', height: '0px'});
test.css({transition: 'height 1s linear', height: '100px'});

我目前找到的唯一解决方案(对我来说不是很干净),是在属性重置和新过渡应用之间使用 setTimeout :https://jsfiddle.net/f0s8a8jp/3/

欢迎更好的想法?!

【问题讨论】:

    标签: javascript css transition


    【解决方案1】:

    过渡将应用于元素的计算尺寸。设置 CSS 属性不会计算它。因此,设置和返回属性就像让它保持不变。它是在浏览器需要重排元素时计算的。

    setTimeout 最终会让浏览器有时间同时计算回流。您可以使用requestAnimationFrame 来实现同样的效果而不会闪烁。

    另一个 hack 是在更改 CSS 属性后强制浏览器重排,例如使用 test[0].offsetWidth;。 然后正确执行转换:https://jsfiddle.net/f0s8a8jp/9/

    可以在此处找到有关回流(和重绘)的更深入讨论:http://www.phpied.com/rendering-repaint-reflowrelayout-restyle/

    【讨论】:

      【解决方案2】:

      试试这个:

      https://jsfiddle.net/f0s8a8jp/4/

      我让它在click上运行,所以你需要点击它才能看到结果。

      我真正改变的唯一一件事是代码的顺序。

      【讨论】:

      • 我的问题不是“第一个 setTimeout”,而是第二个^^ 在我的用例中,转换的重放是由另一种方法触发的,而不是由 setTimeout ;)
      • 好吧,你需要告诉我它是由什么触发的。
      • 这是用户的操作,就像您的点击一样,但在这里并不重要^^问题是,如何在一帧中重置和更改相同的属性 CSS
      • 所以你的意思是没有setTimeout?那就去掉吧。没有它就像一个魅力。 jsfiddle.net/f0s8a8jp/6 如果你告诉我需要什么函数来触发它,我可以帮你更精确地编写代码。
      • 不适合我...我正在使用 FF。不要在铬上工作......可能是你在手机上。如果 CPU 太慢,它可能会起作用,但这不是解决方案;)
      猜你喜欢
      • 1970-01-01
      • 2020-11-01
      • 2022-01-18
      • 2018-02-08
      • 1970-01-01
      • 2013-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多