Reflow及Repaint

上一篇 / 下一篇  2014-11-17 14:27:26 / 个人分类:兼容性测试

1.reflow和repaint

说到页面为什么会慢?那是因为浏览器要花时间、花精力去渲染,尤其是当它发现某个部分发生了点变化影响了布局,需要倒回去重新渲染,内行称这个回退的过程叫reflow

(注:webkit内核称为layout,geoko内核称为reflow)

    reflow几乎是无法避免的。现在界面上流行的一些效果,比如树状目录的折叠、展开(实质上是元素的显示与隐藏)等,都将引起浏览器的reflow。鼠标滑过、点击……只要这些行为引起了页面上某些元素的占位面积、定位方式、边距等属性的变化,都会引起它内部、周围甚至整个页面的重新渲染。通常我们都无法预估浏览器到底会reflow哪一部分的代码,它们都彼此相互影响着。

  另外,有个和reflow看上去差不多的术语:repaint,中文叫重绘。如果只是改变某个元素的背景色、文字颜色、边框颜色等等不影响它周围或内部布局的属性,将只会引起浏览器repaintrepaint的速度明显快于reflow(在IE下需要换一下说法,reflow要比repaint更缓慢)。

 reflow问题是可以优化的,我们可以尽量减少不必要的reflow。比如<img>图片载入问题,这其实就是一个可以避免的reflow——给图片设置宽度和高度就可以了。这样浏览器就知道了图片的占位面积,在载入图片前就预留好了位置。

2.可能出现的bug

最主要的是想说说可能会遇到的bug

·因图片未设置宽和高而又加载失败时可能会影响到页面样式;

·未设置宽高的图片在加载完后需reflow会影响页面性能;

·待页面未完全加载完时去操作页面最重要的功能,可能会因JS加载顺序问题无法正确执行,从而功能异常;

·操作浏览器放大缩小resize窗口,可能会出现样式问题;

·是否有遇到某一个样式或图片在加载过程中闪现,但是加载完后就消失了。

3.出现reflow的原因

Reflow的成本比Repaint的成本高得多的多。DOM Tree里的每个结点都会有reflow方法,一个结点的reflow很有可能导致子结点,甚至父点以及同级结点的reflow。所以过多的reflow会导致CPU性能问题。

基本上来说,reflow有如下的几个原因:

·网页初始化增加、删除、修改DOM结点时

·移动DOM位置或操作动画时

·一些Javascript在操作DOM Tree

·Resize窗口或滚屏时

·CSS的样式发生变化时

·修改网页默认字体时

但是display:none会触发reflow,而visibility:hidden只会触发repaint,因为没有发现位置变化

 

 

 

TAG:

 

评分:0

我来说两句

Open Toolbar