重绘和重排
渲染的基本流程: 解析HTML构建DOM树——构建渲染树——渲染树布局——绘制渲染树。
回流与重绘
注意:回流必将引起重绘,而重绘不一定会引起回流。 回流何时发生: 当页面布局和几何属性改变时就需要回流。下述情况会发生浏览器回流: 1、添加或者删除可见的DOM元素; 2、元素位置改变; 3、元素尺寸改变——边距、填充、边框、宽度和高度 4、内容改变——比如文本改变或者图片大小改变而引起的计算值宽度和高度改变; 5、页面渲染初始化; 6、浏览器窗口尺寸改变——resize事件发生时; 浏览器怎么做的: 回流的花销也不小,如果每句JS操作都去回流重绘的话,浏览器可能就会受不了。所以很多浏览器都会优化这些操作,浏览器会维护1个队列,把所有会引起回流、重绘的操作放入这个队列,等队列中的操作到了一定的数量或者到了一定的时间间隔,浏览器就会flush队列,进行一个批处理。这样就会让多次的回流、重绘变成一次回流重绘。 虽然有了浏览器的优化,但有时候我们写的一些代码可能会强制浏览器提前flush队列,这样浏览器的优化可能就起不到作用了。当你请求向浏览器请求一些 style信息的时候,就会让浏览器flush队列,比如:
当你请求上面的一些属性的时候,浏览器为了给你最精确的值,需要flush队列,因为队列中可能会有影响到这些值的操作。即使你获取元素的布局和样式信息跟最近发生或改变的布局信息无关,浏览器都会强行刷新渲染队列。 如何减少回流、重绘 减少回流、重绘其实就是需要减少对render tree的操作(合并多次多DOM和样式的修改),并减少对一些style信息的请求,尽量利用好浏览器的优化策略。具体方法有:
// 不好的写法 var left =1; var top =1; el.style.left = left +"px"; el.style.top = top +"px";// 比较好的写法 el.className +=" className1"; // 比较好的写法 el.style.cssText +="; left:" + left + "px; top:" + top + "px;";
a) 使用DocumentFragment进行缓存操作,引发一次回流和重绘; 3.不要经常访问会引起浏览器flush队列的属性,如果你确实要访问,利用缓存 // 别这样写,大哥 for(循环){ el.style.left = el.offsetLeft +5+"px"; el.style.top = el.offsetTop +5+"px"; } // 这样写好点 var left = el.offsetLeft, top = el.offsetTop, s = el.style; for(循环){ left +=10; top +=10; s.left = left +"px"; s.top = top +"px"; }
$("#block1").animate({left:50}); $("#block2").animate({marginLeft:50}); 二: 有两个CSS语句能起到隐藏节点的作用 1、visibility; 规定了元素是否可见,即使不可见也会占用上面的空间,在这里就是在指它与display的不一样了 2、display; 这个属性用于定义建立布局时元素生成的显示框类型。对于 HTML 等文档类型,如果使用 display 不谨慎会很危险,因为可能违反 HTML 中已经定义的显示层次结构。对于 XML,由于 XML 没有内置的这种层次结构,所有 display 是绝对必要的。 3、对比这两个他们都有相同的功能就是隐藏。 不同点: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |