每隔一段时间,Chrome都会错误地呈现完全有效的HTML / CSS或根本不呈现 . 通过DOM检查器深入挖掘通常足以让它实现其方式的错误并正确地重绘,因此可以证明标记是好的 . 这种情况在我正在进行的项目中经常(并且可预测地)发生,因为我已经将代码放在适当位置以在某些情况下强制重绘 .
这适用于大多数浏览器/操作系统组合:
el.style.cssText += ';-webkit-transform:rotateZ(0deg)'
el.offsetHeight
el.style.cssText += ';-webkit-transform:none'
在调整一些未使用的CSS属性时,请求一些强制重绘的信息,然后取消对该属性的破坏 . 不幸的是,Chrome for Mac背后的聪明团队似乎找到了一种方法来获得offsetHeight而无需重绘 . 从而杀死一个有用的黑客 .
到目前为止,我在Chrome / Mac上获得同样效果的最佳方法就是这个丑陋:
$(el).css("border", "solid 1px transparent");
setTimeout(function()
{
$(el).css("border", "solid 0px transparent");
}, 1000);
实际上,强制元素跳跃一点,然后冷却一秒钟然后再跳回来 . 更糟糕的是,如果你将超时时间降低到500毫秒以下(不太明显),它往往不会产生预期的效果,因为浏览器在返回其原始状态之前不会重新绘制 .
任何人都想提供一个更好的版本的重绘/刷新黑客(最好是基于上面的第一个例子),适用于Chrome / Mac?
18 回答
这似乎对我有用 . 此外,它根本没有显示 .
仅限CSS . 这适用于删除或添加子元素的情况 . 在这些情况下,边框和圆角可能会留下瑕疵 .
这是我的解决方案,适用于消失的内容......
这对我有用 . Kudos go here .
在IE上为我工作的方法(我无法使用显示技术,因为有一个输入不能松散焦点)
如果你有0边距(改变填充也可以)
我对IE10 IE11的修复 . 基本上会发生的是你在一个必须重新计算的包装元素中添加一个DIV . 然后把它取下来瞧瞧奇迹般有效 :)
我们最近遇到过这种情况并发现将受影响的元素提升为composite layer并使用translateZ修复了该问题而无需额外的javascript .
由于这些绘画问题主要出现在Webkit / Blink中,并且此修复主要针对Webkit / Blink,因此在某些情况下更为可取 . 特别是因为许多JavaScript解决方案导致reflow and repaint,而不仅仅是重新绘制 .
大多数答案都需要使用异步超时,这会导致恼人的眨眼 .
但我想出了这个,因为它同步是顺利的:
不确定你到底想要实现什么,但这是我过去使用的一种方法,成功迫使浏览器重绘,也许它会对你有用 .
如果这个简单的重绘不起作用,你可以尝试这个 . 它会在元素中插入一个空文本节点,以保证重绘 .
编辑:为响应ŠimeVidas,我们在这里取得的成就将是强制回流 . 你可以从主人那里了解更多信息http://paulirish.com/2011/dom-html5-css3-performance/
我今天在OSX El Capitan使用Chrome v51遇到了这个挑战 . 有问题的页面在Safari中运行良好 . 我在这个页面上几乎尝试了所有的建议 - 没有一个正常 - 都有副作用...我最终实现了下面的代码 - 超级简单 - 没有副作用(仍然像以前一样在Safari中工作) .
解决方案:根据需要在有问题的元素上切换类 . 每个切换都会强制重绘 . (为方便起见,我使用了jQuery,但是vanilla JavaScript应该没问题......)
jQuery类切换
CSS类
就是这样......
注意:您必须在“整页”下面运行代码段才能看到效果 .
$( 'article.child')重绘() . // <==糟糕的主意
500毫秒后调用此函数 .
上述答案都不适合我 . 我注意到调整窗口大小确实会导致重绘 . 所以这对我来说:
我遇到了类似的问题,这个简单的JS系列帮助解决了这个问题:
就我而言,在扩展程序中更改CSS后,Chrome扩展程序无法重绘页面 .
如果要保留声明到样式表中的样式,最好使用以下内容:
注意:使用最新的webkit / blink时,为了触发重绘,必须存储
offsetHeight
的值,否则VM(出于优化目的)可能会跳过该指令 .更新:添加了第二个
offsetHeight
读取,有必要阻止浏览器排队/缓存以下CSS属性/类更改并恢复display
值(这样一个CSS应该遵循可以遵循的过渡)此解决方案没有超时!真的 force 重绘!适用于Android和iOS .
隐藏元素然后在setTimeout 0中再次显示它将强制重绘 .
调用
window.getComputedStyle()
应该强制重排