- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我今天在阅读一些代码时遇到了这个 for 循环:
for (i=0; i<100; i++){
document.getElementById(elem + i).style.display="none";
}
我才刚刚开始了解浏览器回流;但是,我目前的理解是,此循环会导致它设置为不显示的 100 个元素中的每一个元素都发生回流。
这个循环对 DOM 有什么影响?这真的有我想的那么可怕吗?
此代码在渲染新页面时使用。
最佳答案
Chrome Developer Tools时间轴是测试这类问题的好方法,尤其是因为“我认为的那样可怕”是相当主观的。
我测试了您在此 fiddle 中发布的代码.将此称为测试 1。
为了控制,我通过将包装元素设置为 display:'none'
来有效地隐藏元素在动画帧中,使用 this fiddle 中的代码.将此称为测试 2。
因此经验答案是肯定的,与替代(理想)方法相比,测试代码需要 10 倍以上的计算时间来重排页面布局。在不了解提取它的代码的情况下,很难说所使用的方法是否合适或必要。
例如,如果要隐藏的元素没有整齐地包裹在它们自己的包装器中 <div>
,优化难度大。一种避免 for
的策略循环将是为元素分配一个“hideable
”类,并设置一个 CSS 规则,如 wrapper.hideChildren > .hideable { display:none; }
.然后,当我们将类“hideChildren
”分配给包装器时,标记的元素将被隐藏。 Using this strategy ,我只能将渲染时间缩短到 15ms,或者当包装器在操作之前从 DOM 分离并在之后重新附加时 10ms。换句话说,for
循环可能不会招致那么多的性能损失。请记住,17 毫秒大约是每秒 60 帧的动画的 1 帧。
如果您查看本文末尾的屏幕截图,您会注意到即使在测试 1 中,所有“脚本”(for
循环的执行)都发生在全部“rending”(重新流动)。因此,如果您的问题是“浏览器是否会在循环的每次迭代中交替执行脚本和渲染”,那么答案是不会,至少在 Chrome 50 中是这样。
至于评论中的 fridge_light 链接,链接的文档从未说明该设置 display:none
不会触发回流;它只包含它链接到的视频中的图表,没有图例。设置display:none
将改变布局:文档的高度可能会改变,隐藏元素下方的元素将移动到更靠近文档的顶部,与隐藏元素内联的元素将内联移动, float 元素会改变它周围的位置等。因此浏览器必然会完成一些计算。
您的问题有点困惑:DOM 不一定与页面重排相关。例如,重新调整浏览器窗口的大小可能会触发重新流动而根本不会影响 DOM!设置display
至 none
从页面布局/流程中删除元素,但将其保留在 DOM 中。
关于javascript - 显示 : none in a for loop and its affect on reflow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37494330/
我正在对 js 代码库进行代码检查,我得到了一些分配给它们自己的变量。我在 ui-bootstrap-tpls-0.5.0.js:445 中发现了一个奇怪的分配,它是: nextSlide.$elem
TD;DR 我花了一些时间跟踪我们的应用程序的性能,该应用程序实现了 highcharts。我发现,像 getBBox() 这样的函数确实经常触发“强制回流”。 如果您查看此列表 What force
有没有人有任何技巧来撤消长线换行? 我有一大段代码已经重排到 120 列,这是一个有效调试的雷区。 Edit0:我没有进行回流,而我正在与之合作的人...没有获得 CVS... EDIT1:Examp
我有一个 javascript 函数可以更改大量 dom 节点 (>5000) 的 css 显示 ('block', 'none')。我正在努力使它尽可能快。 IE 会中断 javascript 以回
我正在为我的网格样式显示使用 jQuery 瀑布。 为了解决常见的图像重叠问题,我将瀑布方法包装在 .load() 函数中,例如: $(window).load(function(){ $('#b
我今天在阅读一些代码时遇到了这个 for 循环: for (i=0; i ,优化难度大。一种避免 for 的策略循环将是为元素分配一个“hideable”类,并设置一个 CSS 规则,如 wrappe
阅读 DOM 元素的哪些属性会导致浏览器重绘(reflow)页面? (属性未修改) 内部HTML 风格 非常感谢! 最佳答案 如果您请求的属性有待更改,样式检查可能需要重排。例如,如果您设置父元素的宽
我有一个带有两个 YAx 的 Highcharts 图表。 其中之一是相反的。 在某个时刻(单击按钮()后),相对轴的一侧会更改为法线: $('#btn').click(function(){
我确定之前已经回答过这个问题,但我似乎无法在任何地方找到它。 我有一个带链接的工具栏: 一旦我调整了浏览器的大小,文本就会重排: 问题是如何在重排后将文本居中? text-align 在这里没有帮助,
有人可以向我证明给出的建议 here (在下面复制)关于在更改 dom 元素之前删除它们然后重新插入它们的速度更快。 通过证明,我希望看到一些数字。他们研究这个很好,但我认为这篇文章非常薄弱,没有包括
我在页面中添加了视差效果。现在我遇到了性能和 FPS 方面的问题以及许多问题:-) 我使用transform3d 和requestAnimationFrame 来实现它(像这样推荐http://www
从 Twitter 的 bootstrap 修改 bootstrap-modal jquery 插件,我看到他们使用 CSS 转换来实现淡入淡出的效果。 代码中让我感兴趣的一件事是这一行: that.
我创建了这个 jsFiddle: https://jsfiddle.net/j994tnu2/4/ if(textH (parentH + deviation)) { text.style.tr
通过所有演示,我听说 React 可能会在一个回流周期内更新 DOM,但我无法理解它如何使用 DOM API 完成。我是什么意思。例如,我需要为 p 标签更新 3 个属性。我将通过 DOM API 完
在this article一位作者谈到渲染的 4 个步骤: Styles -> Layout -> Paint -> Composite 我读过两个阶段:Reflow 和 Repaint。我想知道这四
我需要添加和删除多个节点从DOM,而滚动。为了添加节点,我找到了documentFragment的解决方案,它允许我只使用一个回流来添加多个节点。。但删除大量节点的成本也非常高,因此我正在寻找更快的解
伴随 jsFiddle 重现问题:http://jsfiddle.net/ComradeF/M9e94/ 我在一个项目中同时使用 Foundation 和 Knockout。我面临的挑战之一是当新的
我可以在多个不同设计的网站上重现这个问题。不幸的是,我无法在 jsfiddle 上重现它,因为它没有全屏显示。 在这两种情况下,都有一个 body 或 div 元素,内容如下: 并且页面在 200
我是一名优秀的程序员,十分优秀!