每隔一段时间,Chrome就会错误地或根本不正确地呈现完全有效的HTML/CSS。深入挖掘DOM检查器通常足以让它认识到其方法的错误并正确地重新绘制,因此可以证明标记是好的。在我正在进行的项目中,这种情况经常发生(而且可以预见),我已经将代码放在适当的位置,以便在某些情况下强制重画
这适用于大多数浏览器/操作系统组合:
el.style.cssText+=”-webkit变换:旋转(0度)'
远视
el.style.cssText+='-webkit转换:无'
如中所示,调整一些未使用的CSS属性,然后询问一些强制重画的信息,然后取消该属性。不幸的是,为Mac开发Chrome的聪明团队似乎已经找到了一种方法,可以在不重新绘制的情况下实现这一点。从而杀死了一个有用的黑客
到目前为止,为了在Chrome/Mac上获得同样的效果,我想到的最好的方法就是这件丑陋的东西:
$(el).css(“边框”,“实心1px透明”);
setTimeout(函数()
{
$(el.css(“边框”,“实心0px透明”);
}, 1000);
如中所示,实际上强制元素跳跃一点,然后冷却一秒钟并将其向后跳跃。更糟糕的是,如果你把超时时间降到500毫秒以下(到不太明显的地方),它通常不会产生预期的效果,因为浏览器在返回到原始状态之前不会重新绘制
有没有人愿意提供一个更好的版本,可以在Chrome/Mac上运行的重画/刷新黑客(最好基于上面的第一个例子)
不确定你到底想达到什么目的,但这是我过去成功地使用的一种方法,它可以迫使浏览器重新绘制,也许对你有用
//在jquery中
$('#要绘制的元素的父元素').hide().show(0);
//用简单的js
document.getElementById('parentofelementtoberedraw').style.display='none';
document.getElementById('parentofelementtoberedraw').style.display='block';
如果这个简单的重画不起作用,你可以试试这个。它在元素中插入一个空文本节点,以保证重新绘制
var forceRedraw=函数(元素){
if(!element){return;}
var n=document.createTextNode(“”);
var disp=element.style.display;//不用担心以前的显示样式
元素。子元素(n);
element.style.display=’none’;
setTimeout(函数(){
element.style.display=disp;
n、 parentNode.removeChild(n);
},20);//您可以使用此超时使其尽可能短
}
编辑:作为对西蒙·维达斯的回应,我们在这里实现的是强制回流。你可以从大师那里了解更多http://paulirish.com/2011/dom-html5-css3-performance/