web页面的重构和回流【转载】
在了解什么是重构和回流之前,我们应该先看看浏览器是怎么渲染的?
浏览器的渲染过程:
1.处理HTML脚本,生成DOM树(DOM树里包含所有的HTML标签,包括display:none和js动态添加的元素等)
2.处理CSS脚本,生成CSSOM树(DOM和CSSOM是独立的数据结构)
3.将DOM树和CSSOM树合并为渲染树,render树中不包含定位和几何信息。虽然,render树与dom树类似但还是有区别的。render树中不包含隐藏的节点 (比如display:none的节点,还有head节点),因为这些节点不会用于呈现,而且不会影响呈现的,所以就不会包含到 render tree中。注意 visibility:hidden隐藏的元素还是会包含到 render tree中的,因为visibility:hidden 会影响布局(layout),会占有空间。
4.对render树中的内容进行布局,计算每个节点的几何外观
5.将渲染树中的每个节点绘制到屏幕中.
什么是重构和回流
重构:当元素的某些属性发生变化,这些属性又只影响元素的外观和风格,而不改变元素的布局、大小比如颜色、背景。此时触发的浏览器行为称作重构。
回流:当元素的布局、大小规模和显示方式发生改变时,触发的浏览器行为叫回流。而且,每个页面都会在第一次加载时触发回流。
注意:回流必将引起重绘,而重绘不一定伴随回流。同时,回流对性能的影响要大于重构。
什么操作会引起重绘、回流
其实任何对render tree中元素的操作都会引起回流或者重绘,比如:
- 添加、删除元素(回流+重绘)
- 隐藏元素,display:none(回流+重绘),visibility:hidden(只重绘,不回流)
- 移动元素,比如改变top,left(jquery的animate方法就是,改变top,left不一定会影响回- 流),或者移动元素到另外1个父元素中。(重绘+回流)
- 对style的操作(对不同的属性操作,影响不一样。比如,元素尺寸改变——边距、填充、边框、宽度和高度,内容改变——比如文本改变或者图片大小改变而引起的计算值宽度和高度改变;)
- 还有一种是用户的操作,比如改变浏览器大小,改变浏览器的字体大小等(回流+重绘)
浏览器对回流的优化
因为,回流花销很大,所以大部分浏览器对于回流都会进行优化,浏览器会维护1个队列,把所有会引起回流、重绘的操作放入这个队列,等队列中的操作到了一定的数量或者到了一定的时间间隔,浏览器就会flush队列,进行一个批处理。这样就会让多次的回流、重绘变成一次回流重绘。
虽然有了浏览器的优化,但有些代码可能会强制浏览器提前flush队列,这样浏览器的优化可能就起不到作用了。当你请求向浏览器请求一些 style信息的时候,就会让浏览器flush队列,比如:
- offsetTop, offsetLeft, offsetWidth, offsetHeight
- scrollTop/Left/Width/Height
- clientTop/Left/Width/Height
- width,height
- 请求了getComputedStyle(), 或者 IE的 currentStyle
当你请求上面的一些属性的时候,浏览器为了给你最精确的值,需要flush队列,因为队列中可能会有影响到这些值的操作。即使你获取元素的布局和样式信息跟最近发生或改变的布局信息无关,浏览器都会强行刷新渲染队列。
办公资源网址导航
https://www.wode007.com
如何减少回流、重绘
根据上面触发回流和重绘的操作,我们可以知道只要减少对render tree的操作(合并多次多DOM和样式的修改),并减少对一些style信息的请求,就能减少回流、重绘了,尽量利用好浏览器的优化策略。
具体做法有:
1.直接改变className,如果动态改变样式,则使用cssText(考虑没有优化的浏览器)
2.让要操作的元素进行”离线处理”,处理完后一起更新:
- 使用DocumentFragment进行缓存操作,引发一次回流和重绘;
- 使用display:none技术,只引发两次回流和重绘;
- 使用cloneNode(true or false) 和 replaceChild 技术,引发一次回流和重绘;
3.不要经常访问会引起浏览器flush队列的属性,如果你确实要访问,利用缓存
4.让元素脱离动画流,减少回流的Render树的规模(即让动画的元素脱离文档流,使用absolute定位等等)。
来源:https://segmentfault.com/a/1190000014050350
作者:青灯油纸
web页面的重构和回流【转载】的更多相关文章
- Microsoft.Office.Interop.Excel的用法以及利用Microsoft.Office.Interop.Excel将web页面转成PDF
1.常见用法 using Microsoft.Office.Interop.Excel; 1)新建一个Excel ApplicationClass ExcelApp = New A ...
- base64:URL背景图片与web页面性能优化
一.base64百科 Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,可用于在HTTP环境下传递较长的标识信息. 某人: 唉,我彻底废柴了,为何上面明明是中文,洒家却看不懂嘞,为什 ...
- 谷歌/微软/必应web页面免费翻译插件
随着网络时代的日益壮大,现在我们经常需要浏览一些各种外语的网页,或者是查阅资料帮助我们解决问题.更多的时候还是头疼在语言障碍上,正所谓"它认识你,你不认识它啊."谷歌和微软两个企业 ...
- 【转】Hadoop web页面的授权设定
转载自过往记忆(http://www.iteblog.com/)本文链接地址: <Hadoop web页面的授权设定>(http://www.iteblog.com/archives/98 ...
- 一天JavaScript示例-判定web页面的区域
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- 从插上网线到web页面请求,究竟发生了哪些过程?(计算机网络篇)
一.说在前头 好久没有更新博客了,汗颜,最近忙于各种实验与报告,但是还是要抽时间总结一下学的东西.欢迎转载,但是要注明出处哦(=^ ^=). 最近学了计算机网络,正好总结一下.本篇博客的大部分是跟计算 ...
- Zabbix Server 监控Web页面
Zabbix Server 监控Web页面 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 1>.选中一台可以连接互联网的主机 2>.创建一个web场景,点击“Crea ...
- 小tip: base64:URL背景图片与web页面性能优化——张鑫旭
一.base64百科 Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,可用于在HTTP环境下传递较长的标识信息. 某人: 唉,我彻底废柴了,为何上面明明是中文,洒家却看不懂嘞,为什 ...
- CSS垂直翻转/水平翻转提高web页面资源重用性——张鑫旭
一.CSS下兼容性的元素水平/垂直翻转实现 随着现代浏览器对CSS3的支持愈发完善,对于实现各个浏览器兼容的元素的水平翻转或是垂直翻转效果也就成为了可能.相关的CSS代码如下: /*水平翻转*/ .f ...
随机推荐
- Java实现硬币收集问题
1 问题描述 在n*m格木板中放有一些硬币,每格的硬币数目最多为一个,在木板左上方的一个机器人需要收集尽可能多的硬币并把它们带到右下方的单元格.每一步,机器人可以从当前的位置向右移动一格或向下移动一格 ...
- Java实现第九届蓝桥杯复数幂
复数幂 题目描述 设i为虚数单位.对于任意正整数n,(2+3i)^n 的实部和虚部都是整数. 求 (2+3i)^123456 等于多少? 即(2+3i)的123456次幂,这个数字很大,要求精确表示. ...
- java实现第六届蓝桥杯分机号
分机号 X老板脾气古怪,他们公司的电话分机号都是3位数,老板规定,所有号码必须是降序排列,且不能有重复的数位.比如: 751,520,321 都满足要求,而, 766,918,201 就不符合要求. ...
- Cypress系列(16)- 查找页面元素的基本方法
如果想从头学起Cypress,可以看下面的系列文章哦 https://www.cnblogs.com/poloyy/category/1768839.html 前端页面代码 后面写的 Cypress ...
- 超强教程!在树莓派上构建多节点K8S集群!
在很长一段时间里,我对于在树莓派上搭建Kubernetes集群极为感兴趣.在网络上找到一些教程并且跟着实操,我已经能够将Kubernetes安装在树莓派上,并在三个Pi集群中工作.然而,在master ...
- kernel list 实践
list.h /******* 链表实现,来自内核 **************************************************/ /** * container_of - c ...
- Python报错:SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape
运行python文件的时候报错: SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2 ...
- vj提交时常见问题
- wdcp如何添加反向代理功能
1.winscp进入目录 /www/wdlinux/httpd-x.x.x/conf/右键编辑 httpd.conf 这个文件 依次把下面文件名字前面的 # 号去掉 LoadModule proxy_ ...
- EIGRP-13-弥散更新算法-停滞在活动状态
如果一台路由器参与到了针对某个目的地的弥散计算中(即将相应路由置为活动状态,并发送查询包),它必须首先等待所有邻居都返回响应包,之后它才能执行自已的弥散计算,接着选出新的最优路径,最后开始发送自已的响 ...