【问题标题】:Is it possible to make these changes with one reflow? [duplicate]是否可以通过一次回流来进行这些更改? [复制]
【发布时间】:2019-10-19 23:19:46
【问题描述】:

我一直在阅读 google 向我提供的一些指南和结果,但我仍然不确定如何将以下更改减少到一次回流。

var el1 = document.getElementById("one");
var el2 = document.getElementById("two");
var el3 = document.getElementById("three");
var variable1 = getSomeDynamicValue();

function doChanges() {
  el1.style.cssText = "width: " + variable1 + "px;";
  el2.style.cssText = "top:50px; left: 50px; position: fixed;";
  el3.style.cssText = "";
}

doChanges();

据我了解,cssText 会导致重排,所以使用此代码会有三个重排?还是取决于其他情况?

编辑:文章和类似帖子并没有真正给出我的问题的明确答案。是否可以?方法是什么?

【问题讨论】:

  • 为什么不只是el1.style.width = "10px"
  • 这些只是举例说明我需要进行哪些类型的更改。话虽如此,如果需要清除元素上的任何其他现有内联样式,使用 cssText 声明一个属性会很有用。
  • 虽然更改页面通常会导致重排,但它们通常会延迟并在多个内容更改后折叠成单个重排。很少(如果你适当地避免它),reflows are forced to occur immediately 代码

标签: javascript css


【解决方案1】:

根据this site

任何改变用于构建渲染树的输入信息都可能导致重绘或回流,例如:

  • 添加、删除、更新 DOM 节点
  • 通过显示隐藏 DOM 节点:无(重排和重绘)或可见性:隐藏(仅重绘,因为没有几何形状更改)
  • 在页面上移动、动画化 DOM 节点
  • 添加样式表,调整样式属性
  • 用户操作,例如调整窗口大小、更改字体大小或(哦,天哪,不!)滚动

在网站底部,它解释了避免多次回流的最佳方法:

  • 不要一一更改个别样式。最好的理智和可维护性是更改类名而不是样式。但这假设是静态样式。如果样式是动态的,请编辑 cssText 属性,而不是为每一个小的更改都触摸元素及其样式属性。
  • 批量 DOM 更改并“脱机”执行。离线意味着不在实时 DOM 树中。
  • 不要过度要求计算样式。如果您需要使用计算值,请获取一次,缓存到本地 var 并使用本地副本。

请自己阅读,他们提供了不错的例子

【讨论】:

  • 不要更改个别样式”和“离线执行 DOM 更改”与避免多次重排无关。
  • 虽然我同意使用类是最佳实践,但“编辑cssText 属性”部分似乎已经过时了。使用style 属性更具声明性和可维护性,我怀疑它会产生性能差异。你引用的那篇文章是从什么时候开始的?
  • 我更喜欢使用类,但问题是我可能需要对某些值使用动态变量。我应该在我的例子中提到这一点。
  • @Bergi 似乎在 2013 年末左右,这似乎已经过时了——尽管这个问题是重复的,但在 2014 年得到了回答..
猜你喜欢
  • 1970-01-01
  • 2020-05-12
  • 2021-05-07
  • 1970-01-01
  • 2020-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多