浏览器运行机制图:

浏览器的运行机制:layout:布局;

1、构建DOM树(parse):渲染引擎解析HTML文档,首先将标签转换成DOM树中的DOM node(包括js生成的标签)生成内容树(Content Tree/DOM Tree);

2、构建渲染树(construct):解析对应的CSS样式文件信息(包括js生成的样式和外部css文件),而这些文件信息以及HTML中可见的指令(如<b></b>),构建渲染树(Rendering Tree/Frame Tree);

3、布局渲染树(reflow/layout):从根节点递归调用,计算每一个元素的大小、位置等,给出每个节点所应该在屏幕上出现的精确坐标;

4、绘制渲染树(paint/repaint):遍历渲染树,使用UI后端层来绘制每个节点。

重绘(repaint或redraw):当盒子的位置、大小以及其他属性,例如颜色、字体大小等都确定下来之后,浏览器便把这些原色都按照各自的特性绘制一遍,将内容呈现在页面上。

            重绘是指一个元素外观的改变所触发的浏览器行为,浏览器会根据元素的新属性重新绘制,使元素呈现新的外观。

  触发重绘的条件:改变元素外观属性。如:color,background-color等。

注意:table及其内部元素可能需要多次计算才能确定好其在渲染树中节点的属性值,比同等元素要多花两倍时间,这就是我们尽量避免使用table布局页面的原因之一。

重排(重构/回流/reflow):当渲染树中的一部分(或全部)因为元素的规模尺寸,布局,隐藏等改变而需要重新构建, 这就称为回流(reflow)。每个页面至少需要一次回流,就是在页面第一次加载的时候。

重绘和重排的关系:在回流的时候,浏览器会使渲染树中受到影响的部分失效,并重新构造这部分渲染树,完成回流后,浏览器会重新绘制受影响的部分到屏幕中,该过程称为重绘。

          所以,重排必定会引发重绘,但重绘不一定会引发重排。

  触发重排的条件:任何页面布局和几何属性的改变都会触发重排,比如:

  1、页面渲染初始化;(无法避免)

  2、添加或删除可见的DOM元素;

  3、元素位置的改变,或者使用动画;

  4、元素尺寸的改变——大小,外边距,边框;

  5、浏览器窗口尺寸的变化(resize事件发生时);

  6、填充内容的改变,比如文本的改变或图片大小改变而引起的计算值宽度和高度的改变;

  7、读取某些元素属性:(offsetLeft/Top/Height/Width, clientTop/Left/Width/Height, scrollTop/Left/Width/Height, width/height, getComputedStyle(), currentStyle(IE) )

重绘重排的代价:耗时,导致浏览器卡慢。

优化:  

1、浏览器自己的优化:浏览器会维护1个队列,把所有会引起回流、重绘的操作放入这个队列,等队列中的操作到了一定的数量或者到了一定的时间间隔,浏览器就会flush队列,进行一个批处理。这样就会让多次的回流、重绘变成一次回流重绘。

2、我们要注意的优化:我们要减少重绘和重排就是要减少对渲染树的操作,则我们可以合并多次的DOM和样式的修改。并减少对style样式的请求。

(1)直接改变元素的className

(2)display:none;先设置元素为display:none;然后进行页面布局等操作;设置完成后将元素设置为display:block;这样的话就只引发两次重绘和重排;

(3)不要经常访问浏览器的flush队列属性;如果一定要访问,可以利用缓存。将访问的值存储起来,接下来使用就不会再引发回流;

(4)使用cloneNode(true or false) 和 replaceChild 技术,引发一次回流和重绘;

(5)将需要多次重排的元素,position属性设为absolute或fixed,元素脱离了文档流,它的变化不会影响到其他元素;

(6)如果需要创建多个DOM节点,可以使用DocumentFragment创建完后一次性的加入document;

var fragment = document.createDocumentFragment();var li = document.createElement('li');
li.innerHTML = 'apple';
fragment.appendChild(li);var li = document.createElement('li');
li.innerHTML = 'watermelon';
fragment.appendChild(li);document.getElementById('fruit').appendChild(fragment);

(7)尽量不要使用table布局。

转载于:https://www.cnblogs.com/cencenyue/p/7646718.html

重绘(redraw或repaint),重排(reflow)相关推荐

  1. Qt重绘之update,repaint详解

    Qt里面的重绘和Windows编程里面的重绘差不多.但是Qt的重绘更有特色,更加智能. 在讲之前,先说说paintEvent() paintEvent()是一个虚函数槽(slot),子类可以对父类的p ...

  2. qt repaint 用法_Qt重绘之update,repaint详解

    Qt里面的重绘和Windows编程里面的重绘差不多.但是Qt的重绘更有特色,更加智能. 在讲之前,先说说paintEvent() paintEvent()是一个虚函数槽(slot),子类可以对父类的p ...

  3. qt repaint 用法_Qt重绘之update,repaint详解(转)

    Qt里面的重绘和Windows编程里面的重绘差不多.但是Qt的重绘更有特色,更加智能. 在讲之前,先说说paintEvent() paintEvent()是一个虚函数槽(slot),子类可以对父类的p ...

  4. 重排(reflow) 重绘(repaint)

    在页面的生命周期中:至少会发生一次渲染,在用户访问的过程中,还会不断的触发重排(reflow)重绘(repaint) 重绘和重排都会影响性能,尤其是重排,会使我们付出高昂的性能代价. 页面生成的过程( ...

  5. 重排 (reflow) 与重绘 (repaint)

    前言 本文依旧是日常学习总结篇,主要是要理解浏览器的重排与重绘. 一.浏览器解析渲染页面过程 当浏览器获得一个 html 文件时,会 "自上而下" 加载,并在加载过程中进行解析渲染 ...

  6. reflow(重排、回流)和repaint(重绘)

    reflow和repaint的区别: reflow:浏览器需要去渲染,当它发现某个dom发生了变化不仅仅改变自身,会导致后面的元素位置全部改变并且影响了布局,则需要倒回去重新渲染: repaint:不 ...

  7. 重绘(repaint)与渲染(reflow)

    2019独角兽企业重金招聘Python工程师标准>>> repaint(重绘),repaint发生更改时,元素的外观被改变,且在没有改变布局的情况下发生,如改变outline.vis ...

  8. reflow(回流)和repaint(重绘)

    文章目录 目录 前言 一.什么是reflow和repaint ? 二.reflow(回流)和repaint(重绘) 1.reflow(回流) 2.repaint(重绘) 3.尽量减少reflow 总结 ...

  9. repaint(重绘)和reflow(回流)

    文章目录 前言 reflow(回流) repaint(重绘) 总结 前言 repaint(重绘)和reflow(回流),其实是老生常谈的事情,一直从没正式写过总结,晚上偶然想起,不如简单写一下. 首先 ...

最新文章

  1. 一步一步写自己的SqlHelper类库
  2. Kotlin极简教程:第7章 面向对象编程
  3. mongodb php 报错,PHP5 mongodb 切换db报错 Authentication failed on database admin-汗血宝马
  4. P3805 【模版】manacher算法(manacher)
  5. 一文读懂阿里云数据库Autoscaling是如何工作的
  6. SAP CRM Survey调查问卷的模型设计原理解析
  7. 5_Windows下利用批处理切换IP地址
  8. python - easy_install的安装和使用
  9. 在CentOS 7中安装Jetty服务器
  10. 2020年最值得关注的28款区块链游戏
  11. 阿里本地生活电话面试
  12. 文本去重的技术方案讨论(一)
  13. 电脑连接不上手机热点-始终显示无法连接到该网络的解决办法(亲测管用)
  14. 是面试官放水,还是公司太缺人?这都没挂,kotlin常用语法
  15. HyperLynx(二十六)电源完整性之AC去耦仿真实例(一)
  16. 2013年第十九届全国青少年信息学奥林匹克联赛初赛
  17. 朋友居然将显示屏幕翻转过来放!——屏幕倒置的解决方法
  18. javascript基础:元素增删改操作
  19. 【爬虫学习笔记day65】7.7. scrapy-redis实战-- IT桔子分布式项目1
  20. 2016 DevOps现状调查报告

热门文章

  1. 剑指|| offer1整数除法
  2. 修改oracle安装目录权限设置权限,oracle rac环境,安装目录权限被修改乱了,怎么恢复?...
  3. java多线程按行读取文件_“java”中多线程按行读取txt且每个线程读的内容不能重复,这么求“demo”?...
  4. Linux怎么修改用户密码
  5. 如何用css显示一个图片中多个小图标
  6. div背景图自适应占满
  7. Tomcat的虚拟目录映射常用的几种方式
  8. oracle model类型,Oracle SQL高级编程——Model子句全解析-Oracle
  9. python数据结构教程_python入门基础教程随笔1-python数据结构-列表
  10. 第七章节 类的抽象(抽象类和接口的区别)