有时,当通过JavaScript应用样式时,这些更改不可见,因为它们出现在一个动画帧中。
示例:
$('.foo').style('color', 'red');
$('.foo').style('color', 'blue');
(请注意,此示例仅用于此问题中的演示目的,而不是真实示例。)
在上面的示例中,颜色将立即变为蓝色,而红色永远不可见。有些人使用setTimeout来解决这个问题:
$('.foo').style('color', 'red');
setTimeout(function () {
$('.foo').style('color', 'blue');
}, 1);
由于这不是一个好习惯,我想知道在下一帧中强制改变风格哪个更好?
选项1:clientLeft hack
请求DOM元素的clientLeft值将导致浏览器重新布局。
$('.foo').style('color', 'red');
var bar = $('.foo')[0].clientLeft; // hack to force relayout
$('.foo').style('color', 'blue');
选项2:requestAnimationFrame
$('.foo').style('color', 'red');
requestAnimationFrame(function () {
$('.foo').style('color', 'blue');
});
答案 0 :(得分:1)
我发现两个解决方案都不完美,因为IE9(以及更旧版本)不支持requestAnimationFrame,而且clientLeft hack是..好吧,这是一个黑客攻击。
所以,我使用Paul Irish's polyfill for requestAnimationFrame,现在我拥有两全其美:
setTimeout()
requestAnimationFrame()
来电
requestAnimationFrame
对我来说是完美的解决方案。