问题 为什么CSS动画和转换被JavaScript阻止?


更新2:

现在在Chrome 31.0.1650.34测试版中运行下面的JSFiddle 才不是 导致所描述的行为,即它不会“随着JavaScript的开始而冻结”。我只能假设他们已经将CSS转换放在一个与JavaScript不同的线程上,而其余的页面好消息!冻结/阻止转换仍然出现在Firefox 25.0中。

更新1:

@IvanCastellanos提到了CSS过渡和动画  已在Android Chrome上屏蔽这是非常有用的信息,部分推动了这个问题。

原始问题:

对于浏览器供应商来说,这可能是一个更大的问题,但这里说:到目前为止,我的印象来自于 这个视频 (以及其他人)转换CSS不透明度并不会真正受到影响 任何 性能问题。

在视频中,保罗爱尔兰特别给人的印象是过渡不透明不会成为一个问题,“任何告诉你的人都只是......错了”。

好吧,如果是这样的话, 这个小提琴让我错了

鉴于保罗的非凡主张,为什么CSS过渡被JavaScript阻止? 这也是动画的情况,发生了什么?

(对于那些你没有看到我正在看到的东西,或者懒得看到小提琴的人:我看到一个红色的方块使其大约是淡入过渡的1/5,然后随着JavaScript的开始冻结,然后广场跳转到完全不透明度的过渡结束,大概是因为在JavaScript执行期间已达到持续时间。)

鉴于stackoverflow需要我发布一些代码因为我链接到jsfiddle,这里是相关的JavaScript和CSS:

(function () {
    "use strict";

    var isVisible = false;

    function handleClick() {

        var fadingSquare = document.querySelector(".fadingSquare"),
            i;

        if (isVisible === false) {
            fadingSquare.className = fadingSquare.className + " active";

            // Do something intensive in JavaScript for a while
            setTimeout(function () {

                for(i = 0; i < 10000; i += 1) {
                    console.log(i);
                }

            }, 200);    // Make it occur midway through the CSS transition

            isVisible = true;
        } else {
            fadingSquare.className = fadingSquare.className.replace("active", "");
            isVisible = false;
        }

    }

    document.addEventListener("click", handleClick, false);
}());

和CSS:

.fadingSquare {
    width: 200px;
    height: 200px;
    background: #F00;
    opacity: 0;
    -webkit-transition-property: opacity;
    -webkit-transition-duration: 1s;
}

.fadingSquare.active {
    opacity: 1;
}

9772
2018-03-12 17:31


起源

“鉴于stackoverflow需要我发布一些代码,因为我链接到jsfiddle,这里是相关的JavaScript和CSS” 在任何情况下都是很好的做法。 - T.J. Crowder
然后政策工作! - Matt
好哇! ...... ;-) - T.J. Crowder


答案:


Javascript在浏览器的UI线程上运行。

整页 被Javascript阻止;不只是CSS过渡。


7
2018-03-12 17:35



在我听到Paul等人之前,这几乎是我的想法。声称不会有 任何 性能问题。 - Matt
@Matt转换不透明度时没有任何性能问题。编写垃圾JavaScript时存在性能问题。 - Adam
哈哈,touché。幸运的是,JavaScript不是我的,而是YouTubes(对你来说有点讽刺)。然而,上面引用的视频给出了关于性能和CSS的错误印象。我总是会使用CSS而不是JS动画,但它 不有自己的陷阱。 - Matt
BTW console.log非常昂贵。 - Ivan Castellanos
Android Chrome可以满足您的期望(在UI线程之外运行): phpied.com/css-animations-off-the-ui-thread - Ivan Castellanos


所选答案有点过时了。截至今天,OSX safari,firefox和chrome都在javascript的独立线程中运行css动画。


3
2018-05-24 22:21



有趣的是,FF 54.1更新刚刚为我和JavaScript代码打破了它 块 非布局转换。 - John Weisz
这根本不是真的。在循环完成之前,甚至没有动画的gif也能运行 - 没有,没有,nada。 - Bekim Bacaj
@BekimBacaj - 我担心你错了,已经运行CSS动画,CSS过渡和Web动画API动画,不需要逐帧布局和/或其他样式计算将继续运行,即使主线程是受阻。我们在我们这里使用它 webapp(AudioNodes),它适用于Chrome,FF,Edge。 - John Weisz
@Dave因为 left 需要布局,它在主线程上运行,因此被你的循环阻止(你真的不应该为布局相关的属性设置动画)。试试吧 transform,动画不会阻止。 - John Weisz