javascript - 除非在设置之前查询 DOM 样式属性,否则将忽略过渡时间

标签 javascript css browser

我正在使用 JavaScript 创建一个 div 并将其插入到页面中。我通过更改父 div 的 transform: translateY 将其向上移动 div 的高度,插入 div,然后将其向下滑动来做到这一点。

基本代码如下:

attachTo.style.transform = 'translateY(-' + divHeight + 'px)';
attachTo.insertBefore(div, attachTo.firstElementChild);
attachTo.style.transition = 'transform 2s';
attachTo.style.transform = 'translateY(0)';

使用该代码,转换时间将被忽略,添加的 div 将正常弹出。但是,如果我将其更改为这样的内容:

attachTo.style.transform = 'translateY(-' + divHeight + 'px)';
attachTo.insertBefore(div, attachTo.firstElementChild);

// Either of these can be used, as can any statement or expression that queries an element's CSS styles. 
console.log(document.body.clientHeight);
var foo = pageWrap.offsetParent;

attachTo.style.transition = 'transform 2s';
attachTo.style.transform = 'translateY(0)';

div 将正确设置动画。对我来说不足为奇的是,我还可以在零长度超时中包装最终转换和转换更改。

Firefox 和 Chromium 中的行为相同。

我的问题是为什么会这样,为什么代码没有同步执行?我认为它与浏览器的执行队列有关,如 this question 中所述关于零长度超时,但我不仅想知道确实如此,我还想解释为什么使用 DOM 元素的 style 属性可以达到相同的效果(我猜它会在执行过程中造成轻微的停顿).

最佳答案

当 javascript 运行一系列命令时,浏览器不会重绘元素,直到它完成,或者如果有人告诉它,并且由于最后一个命令重置一切,没有任何反应。

许多其他编程语言也是如此。

所以要么必须将它放在一个函数中,在本例中使用 setTimeout,要么在两者之间调用例如 window.scrollHeight,以使浏览器重绘.

为什么使用属性是因为 javascript 没有方法,例如 Dot.Net 中的 Application.DoEvents();

来源:What forces layout / reflow in a browser

关于javascript - 除非在设置之前查询 DOM 样式属性,否则将忽略过渡时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41925351/

相关文章:

javascript - 回不回有什么区别?

javascript - 使用预定义函数从 mongodb/mongoose 获取数据

javascript - 引导效果平滑 anchor 滚动?

Javascript Date.now() 跨机器/时区的一致性

android - 如何使用 appium 在 android 上自动化浏览器?

javascript - 隐藏表格列依赖于多个动态json数组中的按钮

javascript - "loading gif"背景图像问题 (IE/Edge)

jquery - 如何使用 jQuery 将 min-height 应用于 DIV?

javascript - 在 jQuery 中更改 CSS 类

javascript - 为所有浏览器编码时要注意的标签?