reflow(重排/回流)、repaint(重绘)及其优化
原文地址:https://blog.csdn.net/u013100656/article/details/79888106
浏览器拿到HTML之后的渲染过程:
- 生成dom树;
- 生成render树;
- 执行reflow(在render树的基础上计算页面真实显示dom的位置);
- 执行repaint(为真实显示的dom绘制不影响dom位置的样式,如设置dom的color等)。
reflow:
当页面发生的某些变化影响了布局,需要倒回去重新渲染,该过程称为reflow(重排/回流)。reflow几乎是无法避免的。现在界面上流行的一些效果,比如树状目录的折叠、展开(实质上是元素的显示与隐藏)等,都将引起浏览器的reflow。只要这些变化引起了页面上某些元素的占位面积、定位方式、边距等属性的变化,都会引起它内部、周围甚至整个页面的重新渲染。通常我们无法预估浏览器到底会reflow哪一部分的代码,它们彼此相互影响。
repaint:
如果页面的变化只是改变某个元素的背景色、文字颜色、边框颜色等等不影响它周围或内部布局的属性,将只会引起浏览器repaint(重绘)。
简而言之,如果页面的变化会导致dom的位置发生变化,则会触发reflow,如果不会导致dom的位置发生变化,则会触发repaint。如果触发了reflow则一定会触发repaint,而触发repaint则不一定会触发reflow。另外,reflow的成本比repaint高很多,dom树里每个结点的reflow都可能触发其子结点、祖先结点、兄弟结点的reflow。reflow过于频繁是导致页面性能下降的关键因素之一(也是页面性能优化的主要方向)。
要降低触发reflow的频率,首先要明确哪些情况会触发reflow,以下是会触发reflow的几种动作:
- 改变窗囗大小;
- 改变文字大小;
- 添加/删除样式表;
- 内容的改变,如用户在输入框中输入信息;
- 激活伪类,如:hover;
- 操作class属性;
- 脚本操作dom;
- 获取dom的offsetWidth和offsetHeight;
- 设置style属性。
reflow的优化:
- 尽可能限制reflow的影响范围,修改dom层级较低的结点。不要通过父级元素影响子元素样式。最好直接加在子元素上。改变子元素样式尽可能不要影响父元素和兄弟元素的尺寸;
- 不要一条一条的修改dom的样式,最好通过设置class的方式。 避免重复触发reflow和repaint;
- 经常reflow的元素,比如动画,position设为fixed或absolute,使其脱离文档流,不影响其它元素的布局;
- 权衡速度的平滑。比如实现一个动画,以1px为单位移动这样最平滑,但reflow就会过于频繁,CPU很快就会被完全占用。如果以3个像素为单位移动就会好很多;
- 不要用tables布局。tables中某个元素一旦触发reflow就会导致table里所有的其它元素reflow。在适合用table的场合,可以设置table-layout为auto或fixed,这样可以让table一行一行的渲染,这种做法也是为了限制reflow的影响范围;
- 避免使用css expression(每次都会重新计算);
- 减少不必要的dom层级(DOM depth)。改变dom树中的一级会导致所有层级的改变,上至根部,下至被改变节点的子节点。这导致大量时间耗费在执行reflow上面;
- 避免不必要的复杂的css选择器,尤其是后代选择器(descendant selectors),因为为了匹配选择器将耗费更多的cpu;
- 尽量不要频繁的增加、修改、删除元素,可以先把dom节点抽离到内存中进行复杂的操作然后再display到页面上。(display:none的节点不会被加入render树,而visibility:hidden会;display:none会触发reflow,而visibility:hidden只会触发repaint,因为layout没有变化)。
reflow(重排/回流)、repaint(重绘)及其优化相关推荐
- javascript --- [读书笔记] 回流与重绘 前端优化小结
1. 浏览器渲染原理 请说出: 从用户在浏览器地址输入网址,到看整个页面,中间都发生了哪些事情? HTTP请求阶段 HTTP响应阶段 浏览器渲染阶段 1.1 可能用到的知识 1.1.1 进程 Proc ...
- repaint(重绘)和reflow(回流)
文章目录 前言 reflow(回流) repaint(重绘) 总结 前言 repaint(重绘)和reflow(回流),其实是老生常谈的事情,一直从没正式写过总结,晚上偶然想起,不如简单写一下. 首先 ...
- android 重绘如何能不闪一下屏幕_回流和重绘
浏览器的渲染过程 本文先从浏览器的渲染过程来从头到尾的讲解一下回流重绘,如果大家想直接看如何减少回流和重绘,优化性能,可以跳到后面.(这个渲染过程来自MDN) 从上面这个图上,我们可以看到,浏览器渲染 ...
- 解剖课-回流与重绘篇
浏览器的渲染过程 一. 首先我们要知道什么是HTML? HTML:是文本也是一个字符串,它很多的根标签比如:html,head,body,都是手写的字符串些字符串最后都会转换为DOM树 二.DOM树如 ...
- 浏览器的回流与重绘 (Reflow Repaint)
参考<极客学院--浏览器工作原理与实践> 渲染流程大致可总结为如下: 1. 渲染进程将 HTML 内容转换为能够读懂的 DOM 树结构. 2. 渲染进程将 CSS 样式表转化为浏览器可以理 ...
- reflow(回流)和repaint(重绘)
文章目录 目录 前言 一.什么是reflow和repaint ? 二.reflow(回流)和repaint(重绘) 1.reflow(回流) 2.repaint(重绘) 3.尽量减少reflow 总结 ...
- 回流和重绘的介绍以及优化方法
文章目录 一.浏览器的渲染机制 1.生成渲染树的过程 二.回流和重绘 1.回流(reflow) 2.重绘(repaint) 3.何时发生回流.重绘 三.减少回流和重绘 1.浏览器的优化机制 2.使用浏 ...
- 前端性能优化—回流与重绘
前端性能优化-回流与重绘 一.回流 当渲染树中部分或者全部元素的尺寸.结构或者属性发生变化时,浏览器会重新渲染部分或者全部文档的过程就称为回流. 下面这些操作会导致回流: 页面的首次渲染 浏览器的窗口 ...
- 性能优化之回流_重绘
回流与重绘 当render树中的元素发生尺寸.布局.隐藏等变化时就需要重新构建.当页面布局和几何属性发生变化时就需要回流. 当render树中的一些元素更新属性,而属性只是影响外观风格时,不会影响布局 ...
- 页面渲染之回流与重绘讲解
文章目录 浏览器的渲染过程 生成渲染树(Render Tree) 回流(Layout或Reflow) 重绘(Painting) 何时发生回流重绘 浏览器的优化机制 减少回流和重绘 合并样式的修改 批量 ...
最新文章
- 亿级流量系统架构之如何设计承载百亿流量的高性能架构【石杉的架构笔记】...
- Android中AIDL的使用详解
- cart2pol函数
- 上传到docker hub_docker 创建image上传到 docker hub并下载
- MapReduce的优点
- hdu 4090(搜索+可行性剪枝)
- eureka之EurekaInstanceConfig接口的作用
- 如何写_如何写博士论文?博士生如何写期刊论文?
- 【渝粤教育】国家开放大学2018年春季 3780-22T燃气设备操作与维护 参考试题
- metasploit 中文系统安装失败问题
- c语言指针的地址存放,c语言 - *指针 和 地址
- Scrapy_LinkExtractor
- php js特效代码如何用,phpstorm编写代码增加代码爆炸效果
- jsp网上零食销售网站系统
- linux下性能测试分析命令,Linux性能测试分析命令_top
- vivo手机光环助手下载游戏怎么打不开_“点亮夜色,点亮你”——全新5G自拍手机,vivo S6系列正式发布...
- java毕业设计蜗牛兼职网mybatis+源码+调试部署+系统+数据库+lw
- 第46讲 Android Camera2 API AWB自动白平衡
- Go开发之如何破解安装GoLand编译器?
- 《图解番茄工作法》读后感