当前位置: 首页 > 知识库问答 >
问题:

前端 - 执行appendChild或removeChild时,会重新计算布局吗?什么时候重新计算布局?

谢骏奇
2023-12-26

执行appendChild或removeChild时,会重新计算布局吗?什么时候重新计算布局?

猜测:

  • 在事件循环中,有一阶段是留给渲染的,是否是在这时重新计算布局?appandChild或removeChild只是改变了dom。
  • 在渲染阶段根据改变的这个dom来重新计算布局。
  • 如果我添加了一个元素紧接着又删除了,渲染阶段是根本不知道的。即使这个元素上有动画也是不会出现的。

可以试一下这个例子codesandbox

其实应该是会重新计算布局的,可以检测一下添加该元素之前和之后其父元素的大小(offsetHeight ...),它的大小是会发生变化的。

添加类名(classList.add),也会触发重新布局(检测一下添加类名之后,大小或其他样式是否发生变化就可以验证了)。

有一个动画制作的方法flip,就用到了这个同步布局。

共有2个答案

卫招
2023-12-26

为什么要猜呢?直接性能面板看下有没有触发布局就可以了,下面这个我是在append之后打印了document.body.offsetHeight的执行栈,这里为什么会触发布局正是因为你获取了offsetHeight,你试想下如果浏览器不强制重新布局重绘一次你的程序怎么能获取到正确的值?所以你不能用这样来检测。如果你不做操作append之后立即remove你会发现执行栈里就没有布局这一任务
截屏2023-12-23 18.08.42.png

左丘曦
2023-12-26

执行 appendChildremoveChild 时,确实会触发重新计算布局(Recalculation of layout)。

DOM(文档对象模型)是一个编程接口,用于表示和交互网页内容。当您对 DOM 进行更改,如添加或删除元素时,浏览器需要重新计算元素的位置和大小,以确保页面的渲染是正确的。这个过程称为重新计算布局。

在执行 appendChildremoveChild 时,浏览器会立即触发重新计算布局。这是因为这些操作直接影响了 DOM 的结构,从而影响了元素的布局。

至于您提到的例子,如果在短时间内连续执行添加和删除操作,浏览器的重新计算布局机制只会对最后一次更改进行响应,之前的更改不会触发重新计算布局。这是因为浏览器会尽量减少不必要的重新计算布局以提高性能。

在事件循环中,确实有一阶段是留给渲染的。当 DOM 更改时,浏览器会将这些更改放入一个队列中,然后在适当的时候进行渲染。这就是为什么在某些情况下,即使立即执行了 DOM 更改,用户也看不到立即的效果。这是因为更改首先被放入队列中,然后在渲染阶段进行处理。

希望这个答案能帮助您更好地理解 DOM 和重新计算布局的过程!

 类似资料:
  • 这是小提琴。我想要的是在删除一行时重新计算总数。我试过这个,但不起作用: 下面是我的代码: null null 以下是工作的内容:http://jsfidle.net/joansuriel/qmhdl/50//

  • 我试图使应用程序在反应本机(不是与博览会,我创建了我的代码与反应本机init和运行与反应本机run-android),当我在代码中做出改变,他们并不总是考虑到:考虑到他们我有重新启动计算机。 我一天要做几次,很费时。我已经测试过从设备上删除应用程序测试,以使Thread缓存干净,但它不起作用,唯一起作用的是重新启动(如果它起作用的话,我使用的是Mac)。 是否有一个命令可以让我重置我不知道的缓存并

  • 我有一个小游戏,当用户按下暂停按钮时,我需要暂停计时器,然后恢复计时器,并在用户按下恢复按钮时继续增加秒数。我研究了很多,我尝试了不同的解决方案,但没有一个对我有效。你能帮我实现这个功能吗?下面是我的代码: 谢谢你读这篇文章。

  • 我有一个运行在iOS8下的,我在故事板中使用来自约束的自动单元格高度。 我的一个单元格包含一个,我需要它根据用户输入收缩和展开-点击可收缩/展开文本。 我通过向文本视图添加运行时约束并根据用户事件更改约束上的常量来实现这一点: 执行此操作时,我将其包装在更新中,并调用: 当我执行此操作时,我的单元格确实会展开(并在进行此操作时设置动画),但我会收到一条约束警告: 388是我计算的高度,上的其他约束

  • 问题内容: 我正在用flexbox构建一个计算器。我想要它的一个键是高度的两倍,另一个键是宽度的两倍。 我对此进行了很多搜索,但找不到一起找到这两种情况。 对于高度的两倍关键,只有答案,我发现是使作为。但是在那种情况下,我将无法制作双倍宽度的键。 这是我的代码(在codepen.io上)。请帮忙。 问题答案: 将凹凸不平的钥匙包装在自己的伸缩容器中,然后从那里去。 笔记: 在/ 计算中包括填充和边

  • 我想对什么时候(忽略可用内存空间)存储比较结果而不是重新计算比较结果是有意义的有一个坚实的理解。什么是证明存储所产生的时间成本的临界点?是2次、3次还是4次比较?更多? 例如,在这种特殊情况下,哪个选项(通常)在速度方面会表现得更好? 备选办法1: 备选案文2: 我知道这没什么大不了的,大多数时候这种差异可以忽略不计。然而,我是一个完美主义者,我真的很想解决这个特殊的问题,这样我就可以继续我的生活