《高性能javascript》- 重绘与重排序

前端之家收集整理的这篇文章主要介绍了《高性能javascript》- 重绘与重排序前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

遇到的场景

加载更多时,动态插入表单数据,以及tab切换ajax请求来的数据进行重新渲染

重绘与重排

重绘

拿到请求资源DOM树、css树、渲染树,然后同步建立,建立完成后,对应渲染时就开始绘制页面元素

布局不变即重绘

  1. 颜色
  2. transport

重排(影响性能严重)

浏览器是根据送入的渲染树进行绘制这个网页,你所看到的网页其实本质是一个图片。那么每个元素都拥有自己所在的坐标。

重排,就是 这个元素的几何属性或者坐标发生了改变,所以会造成重排,其实就是浏览器因为几何变化造成这个变化的节点会影响到所有节点的坐标,从而需要重新计算所有渲染树上元素的坐标,所以才需要重排所有节点以便gpu重新绘制。重排在我看来主要是需要重新计算每个节点绘制的坐标造成的(为了重新生成RenderLayerTree)。

  1. 添加删除可见的元素(对应优化,设置为不可见)
  2. 元素位置的改变
  3. 元素尺寸的改变(盒子模型)
  4. 内容的改变,文本长度,图片大小
  5. 页面渲染初始化
  6. 浏览器窗口改变(滚动条)
  7. 莫名其妙的重排:因为浏览器队列优化修改并批量执行来优化,谁让你要请求强制刷新队列去获取布局信息(body.currentStyle):
scrollTop/Left/Width/Height

clientTop/Left/Width/Height

getComputedStyle(),or currentStyle in IE

优化方案

  1. 不单独设置css属性,如
  1. 如果一定通过js修改样式有以下两种方法
修改
document.body.className = 'newClass'; // 修改class来实现最小次数重排
  1. 通过display:none来将节点脱离文档流,在修改完节点之后再显示,这样只有隐藏,显示两次。
  2. 将会立刻造成重排的属性数据存入临时变量中。
  3. position:absolute,fixed 会将节点脱离文档流,避免整个dom tree重排
  4. 移动通过translate来实现
    浏览器原理中,(root节点,css position:relative,absolute,transform,有节点溢出overflow,alpha mask,reflection,css filter,2dCanvas,WebGl,video)都会为这些元素创造一个新的Layer以便浏览器加速渲染,这些元素的修改只会涉及自己重排重绘。
  5. 事件委托

猜你在找的JavaScript相关文章