问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何减少浏览器repaint和reflow(上)

发布网友 发布时间:2022-05-07 08:49

我来回答

2个回答

懂视网 时间:2022-04-21 10:07

1.避免在document上直接进行频繁的DOM操作,如果确实需要可以采用off-document的方式进行,具体的方法包括但不完全包括以下几种:
(1). 先将元素从document中删除,完成修改后再把元素放回原来的位置
(2). 将元素的display设置为”none”,完成修改后再把display修改为原来的值
(3). 如果需要创建多个DOM节点,可以使用DocumentFragment创建完后一次性的加入document
2.集中修改样式
(1). 尽可能少的修改元素style上的属性
(2). 尽量通过修改className来修改样式
(3). 通过cssText属性来设置样式值
3. 缓存Layout属性值
对于Layout属性中非引用类型的值(数字型),如果需要多次访问则可以在一次访问时先存储到局部变量中,之后都使用局部变量,这样可以避免每次读取属性时造成浏览器的渲染。
var width = el.offsetWidth; var scrollLeft = el.scrollLeft;
4.设置元素的position为absolute或fixed
在元素的position为static和relative时,元素处于DOM树结构当中,当对元素的某个操作需要重新渲染时,浏览器会渲染整个页面。将元素的position设置为absolute和fixed可以使元素从DOM树结构中脱离出来独立的存在,而浏览器在需要渲染时只需要渲染该元素以及位于该元素下方的元素,从而在某种程度上缩短浏览器渲染时间,这在当今越来越多的Javascript动画方面尤其值得考虑。

热心网友 时间:2022-04-21 07:15

页面在加载的过程中,需要对文档结构进行解析,同时需要结合各种各样的样式来计算这个页面长什么样子,最后再经过浏览器的渲染页面就出现了。这整个过程细说起来还是比较复杂,其中充满了repaint和reflow。对于DOM结构中的各个元素都有自己的盒子(模型),这些都需要浏览器根据各种样式(浏览器的、开发人员定义的等)来计算并根据计算结果将元素放到它该出现的位置,这个过程称之为reflow;当各种盒子的位置、大小以及其他属性,例如颜色、字体大小等都确定下来后,浏览器于是便把这些元素都按照各自的特性绘制了一遍,于是页面的内容出现了,这个过程称之为repaint。以上提到的只是在页面加载时必然会出现的repaint和reflow,除此之外,在页面加载完成后,用户的一些操作、脚本的一些操作都会导致浏览器发生这种行为,具体在后文阐述。另外,关于浏览器渲染的更为详细的资料可以参考以下,涵盖了IE以及Firefox:Understanding Internet Explorer Rendering BehaviourNotes on HTML Reflow 二、什么情况下会触发浏览器的repaint/reflow?除了页面在首次加载时必然要经历该过程之外,还有以下行为会触发这个行为:DOM元素的添加、修改(内容)、删除( Reflow + Repaint) 仅修改DOM元素的字体颜色(只有Repaint,因为不需要调整布局) 应用新的样式或者修改任何影响元素外观的属性 Resize浏览器窗口、滚动页面 读取元素的某些属性(offsetLeft、offsetTop、offsetHeight、offsetWidth、scrollTop/Left/Width/Height、clientTop/Left/Width/Height、getComputedStyle()、currentStyle(in IE)) 在继续下面的文章之前,先介绍一款强大的性能分析工具-dynaTrace,借助该功能能够清晰的得到页面中的资源消耗情况,从而对症下药。另外,更细节的方面是它可以跟踪每个函数调用所造成的CPU消耗、Repaint/Reflow。接下来就借助该工具来测试一下以上描述的几点情况。 DOM元素的增删改先看代码HTML:这里是第1个节点这里是第2个节点这里是第3个节点Javascript: function $(id){ return document.getElementById(id); } function addNode(){ var n = document.createElement('div'); n.innerHTML = 'New Node'; $('test1').appendChild(n); } function modNode(){ $('test2').innerHTML = 'hello'; } function delNode(){ $('test3').parentNode.removeChild($('test3')); } 在依次点击完每一个按钮后,我们来看看dynaTrace的情况,首先是一目了然的点击事件分布 放大之后来看一下每个事件的repaint/reflow情况: 增加节点: 修改节点:删除节点:图中的绿色部分表示的是reflow和repaint过程,其中比较短的绿条标示的reflow过程,后面长条部分表示的是repaint过程。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
有类似xxxholic和恐怖宠物店的漫画吗 沂水滑雪场怎么走 沂水天然地下画廊景区交通指南 m果实能力 脑血管造影适应症 重仓大盘蓝筹股的基金,或加指数基金? 文言文 理穷言他 有托其妻子于其友而之楚游者的有是什么意思 有托其妻子于其友而之楚... 猫吃了毒老鼠,吐白沫,惊叫,走不稳 内存对手机性能有多重要 尊师的日记5篇150字 淘宝支付时接收短信的手机号怎么改 一名合格的Android工程师的知识结构是怎样的 5篇 150字——200字日记 不要暑假丶寒假的 粘鼠板粘在头发上怎样清理掉 求5篇150字的暑假日记,有谁帮我? js 什么是repaint和reflow 如何优化网页从dom css js 日记五篇 大约150字 如何减少浏览器的repaint和reflow 日记150字 5篇 多以篇加5分 最多加100分 垃圾的不回 如何减少页面prepaint和reflow exo为什么最近的活动中都没有lay和tao了? 如何减少浏览器repaint和reflow 为什么用lay不用lays LAY打算什么时候退出EXO,(如果LAY退出EXO,EXO会解散吗?) Layloader.exe 怎么清除 求5篇150字的日记,要有质量,不要流水账 lia,lay辨析 牛宝宝哪个月份出生好 5篇150字的暑假日记 (>﹏<) 毛被不小心被粘鼠板粘上,怎么才能把粘鼠板上的胶洗掉呢? 手机发什么短信可以修改淘宝账号登录密码 淘宝密码知道但需要短信认证,问题是手机号码换了改密码又改不了登又登不上,怎么弄? 傅莹丈夫是谁 许巍和朴树他们俩的歌为什么好多都一样啊 用手机发短信注册的淘宝,密码是什么? 女大使傅莹的父亲是谁啊? 淘宝付款时有手机短信验证码,那个手机号码怎么换 淘宝账号我可以设置登陆需要手机短信验证,修改密码什么的不能用手机号验证吗? 傅莹父亲是谁 发言人傅莹是谁 关于执业医师考试的书籍推荐? 我准备考执业医师考试,今年买哪一本书最好,最全? 执业医师考试用什么版的参考书 市面上有太多执业医师考试用书了,向大家请教一下,你们是怎样选择执业医师考试辅导书的? 执医考试哪种辅导书好? 2013年中医执业医师考试,复习用书有什么比较好。请已经拿到执业医师资格的朋友回答一下,谢谢! 执业医师考试用书哪里的比较好?推荐一个 今年执业医师考试用哪一版的教材