有两个线程:一个线程JavaScript解析,一个线程是UI渲染,这两个其实是互斥的两个线程。
会的,频繁触发重绘与回流,会导致UI频繁渲染,最终导致js变慢。
触发页面重布局的属性:
1、盒子模型相关属性会触发重布局:width ,height,padding,margin,display,border-width,border,min-heigh。
2、定位属性及浮动也会触发重布局:top,bottom,left,right,position,float,clear
3、改变节点内部文字结构也会触发重布局:text-align,overflow-y,font-weight,overflow,font-family,line-height,vertival-align,white-space,font-size
只触发重绘的属性:
color
border-style
border-radius
visibility
text-decoration
background
background-image
background-position
background-repeat
background-size
outline-color
outline
outline-style
outline-width
box-shadow
总结:回流必将引起重绘,而重绘不一定会引起回流
1. 获取DOM后分割为多个图层
2. 对每个图层的节点计算样式结果(Recalculate style--样式重计算)
3. 为每个节点生成图形和位置(Layout--回流和重布局)
4. 将每个节点绘制填充到图层位图中(Paint Setup和Paint--重绘)
5. 图层作为纹理上传至GPU
6. 符合多个图层到页面上生成最终屏幕图像(Composite Layers--图层重组)
将频繁重绘回流的DOM元素单独作为一个独立图层,那么这个DOM元素的重绘和回流的影响只会在这个图层中。
1、避免使用触发重绘、回流的CSS属性
2、将重绘、回流的影响范围限制在单独的图层之内
如何手动创建图层l两种方法:
Chrome浏览器的more tools下面的Layers能查看图层信息,rendering能查看浏览器页面正在重绘的元素。
用图层可以减少重绘和回流,但是图层会有合成的消耗,因此两者之间需要一个balance!
原文:https://www.cnblogs.com/QianDingwei/p/11028362.html