偶尔,Chrome会不正确地渲染完全有效的HTML/CSS或者根本不渲染。通过DOM检查器深入了解,通常足以让它认识到错误并进行正确重绘,因此可以证明标记是正确的。在我正在处理的项目中,这种情况经常发生(而且是可预测的),因此我已经编写了代码,在特定情况下强制执行重绘。
这在大多数浏览器/操作系统组合中都起作用:
el.style.cssText += ';-webkit-transform:rotateZ(0deg)'
el.offsetHeight
el.style.cssText += ';-webkit-transform:none'
就是说,修改一些未使用的CSS属性,然后请求一些强制重绘的信息,最后再恢复原来的属性。但是不幸的是,Chrome团队为Mac版本找到了一种无需重绘即可获取offsetHeight的方法,这使得这个本来很有用的技巧失效了。
目前,我在Chrome/Mac上找到的替代方案非常丑陋:
$(el).css("border", "solid 1px transparent");
setTimeout(function()
{
$(el).css("border", "solid 0px transparent");
}, 1000);
实际上,强制使元素跳动一下,然后放松一会儿并将其跳回。更糟糕的是,如果把超时时间降低到500毫秒以下(以使其不那么明显),它经常不能产生预期的效果,因为浏览器在恢复到原始状态之前无法重新绘制。
有人愿意提供一个更好的重绘/刷新hack版本吗(最好基于上面的第一个示例),可以在Chrome/Mac上运行?