《高性能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修改样式有以下两种方法
  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. 事件委托

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


kindeditor4.x代码高亮功能默认使用的是prettify插件,prettify是Google提供的一款源代码语法高亮着色器,它提供一种简单的形式来着色HTML页面上的程序代码,实现方式如下: 首先在编辑器里面插入javascript代码: 确定后会在编辑器插入这样的代码: <pre
这一篇我将介绍如何让kindeditor4.x整合SyntaxHighlighter代码高亮,因为SyntaxHighlighter的应用非常广泛,所以将kindeditor默认的prettify替换为SyntaxHighlighter代码高亮插件 上一篇“让kindeditor显示高亮代码”中已经
js如何实现弹出form提交表单?(图文+视频)
js怎么获取复选框选中的值
js如何实现倒计时跳转页面
如何用js控制图片放大缩小
JS怎么获取当前时间戳
JS如何判断对象是否为数组
JS怎么获取图片当前宽高
JS对象如何转为json格式字符串
JS怎么获取图片原始宽高
怎么在click事件中调用多个js函数
js如何往数组中添加新元素
js如何拆分字符串
JS怎么对数组内元素进行求和
JS如何判断屏幕大小
js怎么解析json数据
js如何实时获取浏览器窗口大小
原生JS实现别踩白块小游戏(五)
原生JS实现别踩白块小游戏(一)