回应赏金:
如果您不知道正在转换哪个属性,或者根本不认为强制 asetTimeout
触发动画是一个好习惯,您可以通过另一种方式强制回流。
首先起作用的原因setTimeout
是由于您同时导致整个文档重排,即使持续时间设置为0
. 这不是导致回流的唯一方法。
JavaScript
for (x = Math.ceil(Math.random() * 10), i=0;i<x;i++){
$('<div />').appendTo($('#container')).addClass('trans');
}
var divs = $('#container div');
var x = divs.eq(Math.ceil(Math.random() * divs.length));
x[0].offsetHeight;
x.addClass('wide');
使用这个 JavaScript,我们随机添加 1 到 10 个div
元素,然后随机选择其中一个并添加wide
类。
您会注意到其中有一行奇怪的 JavaScript,即x[0].offsetHeight
. 这是整个操作的关键。调用offsetHeight
触发文档重排而不使用 setTimeout 或查询 CSS 值。
回流与 DOM 的关系是什么:
回流计算页面的布局。元素上的重排会重新计算元素的尺寸和位置,并且还会触发该元素的子元素、祖先元素和出现在 DOM 中的元素的进一步重排。然后它调用最终重绘。回流非常昂贵,但不幸的是它很容易触发。
因此,请谨慎使用这些功能。对大多数现代浏览器来说并不太担心(因为 jQuery 因触发多次重排而臭名昭著),但在在您的网站上添加类似此解决方案的内容之前仍然需要考虑一些事情。
重要提示:这并不比 setTimeout
call效率更高或更低。这不是一个灵丹妙药的解决方案,它在幕后做同样的事情。
这是相应的CSS,供参考:
.trans {
width: 20px;
height: 20px;
background-color: cyan;
-webkit-transition: all 5s ease;
-moz-transition: all 5s ease;
-o-transition: all 5s ease;
transition: all 5s ease;
}
.trans.wide {
width: 200px;
}