余姚本地网站排名,国内较好的网站设计公司,网站收录做关键词排名,网络公司官网在讨论页面重绘、回流之前。需要对页面的呈现流程有些了解#xff0c;页面是怎么把html结合css等显示到浏览器上的#xff0c; 下面的流程图显示了浏览器对页面的呈现的处理流程。可能不同的浏览器略微会有些不同。但基本上都是类似的。 1. 浏览器把获取到的HTML代码解析成1…在讨论页面重绘、回流之前。需要对页面的呈现流程有些了解页面是怎么把html结合css等显示到浏览器上的 下面的流程图显示了浏览器对页面的呈现的处理流程。可能不同的浏览器略微会有些不同。但基本上都是类似的。 1. 浏览器把获取到的HTML代码解析成1个DOM树HTML中的每个tag都是DOM树中的1个节点根节点就是我们常用的document对象。DOM树里包含了所有HTML标签包括display:none隐藏还有用JS动态添加的元素等。 2. 浏览器把所有样式(用户定义的CSS和用户代理)解析成样式结构体在解析的过程中会去掉浏览器不能识别的样式比如IE会去掉-moz开头的样式而FF会去掉_开头的样式。 3、DOM Tree 和样式结构体组合后构建render tree, render tree类似于DOM tree但区别很大render tree能识别样式render tree中每个NODE都有自己的style而且 render tree不包含隐藏的节点 (比如display:none的节点还有head节点)因为这些节点不会用于呈现而且不会影响呈现的所以就不会包含到 render tree中。注意 visibility:hidden隐藏的元素还是会包含到 render tree中的因为visibility:hidden 会影响布局(layout)会占有空间。根据CSS2的标准render tree中的每个节点都称为Box (Box dimensions)理解页面元素为一个具有填充、边距、边框和位置的盒子。 4. 一旦render tree构建完毕后浏览器就可以根据render tree来绘制页面了。 回流与重绘 1. 当render tree中的一部分(或全部)因为元素的规模尺寸布局隐藏等改变而需要重新构建。这就称为回流(reflow)。每个页面至少需要一次回流就是在页面第一次加载的时候。在回流的时候浏览器会使渲染树中受到影响的部分失效并重新构造这部分渲染树完成回流后浏览器会重新绘制受影响的部分到屏幕中该过程成为重绘。 2. 当render tree中的一些元素需要更新属性而这些属性只是影响元素的外观风格而不会影响布局的比如background-color。则就叫称为重绘。 注意回流必将引起重绘而重绘不一定会引起回流。 回流何时发生 当页面布局和几何属性改变时就需要回流。下述情况会发生浏览器回流 1、添加或者删除可见的DOM元素 2、元素位置改变 3、元素尺寸改变——边距、填充、边框、宽度和高度 4、内容改变——比如文本改变或者图片大小改变而引起的计算值宽度和高度改变 5、页面渲染初始化 6、浏览器窗口尺寸改变——resize事件发生时 聪明的浏览器 我们也知道回流的花销也不小如果每句JS操作都去回流重绘的话浏览器可能就会受不了。所以很多浏览器都会优化这些操作浏览器会维护1个队列把所有会引起回流、重绘的操作放入这个队列等队列中的操作到了一定的数量或者到了一定的时间间隔浏览器就会flush队列进行一个批处理。这样就会让多次的回流、重绘变成一次回流重绘。 虽然有了浏览器的优化但有时候我们写的一些代码可能会强制浏览器提前flush队列这样浏览器的优化可能就起不到作用了。当你请求向浏览器请求一些 style信息的时候就会让浏览器flush队列比如 1. offsetTop, offsetLeft, offsetWidth, offsetHeight 2. scrollTop/Left/Width/Height 3. clientTop/Left/Width/Height 4. width,height 5. 请求了getComputedStyle(), 或者 IE的 currentStyle 当你请求上面的一些属性的时候浏览器为了给你最精确的值需要flush队列因为队列中可能会有影响到这些值的操作。即使你获取元素的布局和样式信息跟最近发生或改变的布局信息无关浏览器都会强行刷新渲染队列。 如何减少回流、重绘 减少回流、重绘其实就是需要减少对render tree的操作合并多次多DOM和样式的修改并减少对一些style信息的请求尽量利用好浏览器的优化策略。具体方法有 1. 直接改变className如果动态改变样式则使用cssText考虑没有优化的浏览器 2. 让要操作的元素进行”离线处理”处理完后一起更新 a) 使用DocumentFragment进行缓存操作,引发一次回流和重绘b) 使用display:none技术只引发两次回流和重绘c) 使用cloneNode(true or false) 和 replaceChild 技术引发一次回流和重绘 3.不要经常访问会引起浏览器flush队列的属性如果你确实要访问利用缓存 4. 让元素脱离动画流减少回流的Render Tree的规模转载于:https://www.cnblogs.com/huoerheaven/p/8967258.html