博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在webkit中如何避免触发layout(重排)
阅读量:6094 次
发布时间:2019-06-20

本文共 1565 字,大约阅读时间需要 5 分钟。

很多web开发者都已经意识到,在脚本执行中,DOM操作的用时可能比js本身执行时间要长很多,其中潜在的消耗基本上是由于触发了layout(即重排reflow:由DOM树构建为Render渲染树的过程),DOM结构越大越复杂,则操作的代价越昂贵。

目前一个保持页面敏捷快速的比较重要的技巧就是将对dom的不同操作合并在一起,然后批量一次性改变dom的结构状态,比如:

// 不推荐的方式,会引起两次重排(layout)var newWidth = aDiv.offsetWidth + 10; // 读取aDiv.style.width = newWidth + 'px'; // 更新样式var newHeight = aDiv.offsetHeight + 10; // 读取aDiv.style.height = newHeight + 'px'; // 更新样式// 推荐,仅触发1次重排var newWidth = aDiv.offsetWidth + 10; // 读取var newHeight = aDiv.offsetHeight + 10; // 读取aDiv.style.width = newWidth + 'px'; // 更新aDiv.style.height = newHeight + 'px'; // 更新

的这篇文章已对此作出了非常精彩的解释。

由此,经常会有人问:到底什么会触发layout? 。便于我自己理解,我将这些会导致layout的DOM的属性和方法弄成了一个列表,如下:

Element

clientHeight, clientLeft, clientTop, clientWidth, focus(), getBoundingClientRect(), getClientRects(), innerText, offsetHeight, offsetLeft, offsetParent, offsetTop, offsetWidth, outerText, scrollByLines(), scrollByPages(), scrollHeight, scrollIntoView(), scrollIntoViewIfNeeded(), scrollLeft, scrollTop, scrollWidth

Frame, Image

height, width

Range

getBoundingClientRect(), getClientRects()

SVGLocatable

computeCTM(), getBBox()

SVGTextContent

getCharNumAtPosition(), getComputedTextLength(), getEndPositionOfChar(), getExtentOfChar(), getNumberOfChars(), getRotationOfChar(), getStartPositionOfChar(), getSubStringLength(), selectSubString()

SVGUse

instanceRoot

window对象

getComputedStyle(), scrollBy(), scrollTo(), scrollX, scrollY, webkitConvertPointFromNodeToPage(), webkitConvertPointFromPageToNode()

列表并不完善,但算是一个开始吧,其实最好的方式,当然是在Timeline工具中去分析瓶颈。

 

转载于:https://www.cnblogs.com/ppoo24/p/6626960.html

你可能感兴趣的文章
怎样用Java编写一段代码引发内存泄露
查看>>
2012年终总结
查看>>
eclipse导出jar包
查看>>
windows系统下利用MySql命令行进入MySql数据库
查看>>
如何隐藏日历列表的重复和全天事件栏目-方法2
查看>>
Java NIO与IO的差别和比較
查看>>
HTTP/1.1 中 If-Modified-Since 和 If-Unmodified-Since 区别简记
查看>>
怎样炒掉你的创业合作伙伴?
查看>>
[计算机图形学] 基于C#窗口的Bresenham直线扫描算法、种子填充法、扫描线填充法模拟软件设计(一)...
查看>>
UNICODE编码表
查看>>
hadoop Mahout中相似度计算方法介绍(转)
查看>>
C语言嵌入式系统编程修炼之(三)内存操作
查看>>
IE和Firefox的Javascript兼容性总结
查看>>
c++ _int64 转成string
查看>>
Atitit. 悬浮窗口的实现 java swing c# .net c++ js html 的实现
查看>>
linux后台运行程序
查看>>
ADO,OLEDB,ODBC,DAO,RDO的区别说明
查看>>
RabbitMQ消息队列(一): Detailed Introduction 详细介绍[转]
查看>>
FDATool使用
查看>>
win7 vs2012/2013 编译boost 1.55
查看>>