我需要用javascript编写的jQuery slideUp()中的setTImeout()函数吗

我需要用javascript编写的jQuery slideUp()中的setTImeout()函数吗,javascript,jquery,css,Javascript,Jquery,Css,这是一个javascript/浏览器的理论问题。我的同事和我正在尝试用vanilla JS编写jQuery slideUp方法。功能体的重要部分如下所示: // initial height needs to be set if (!element.style.height) { element.style.height = `${element.scrollHeight}px`; } element.style.overflowY = 'hidden'; element.style

这是一个javascript/浏览器的理论问题。我的同事和我正在尝试用vanilla JS编写jQuery slideUp方法。功能体的重要部分如下所示:

// initial height needs to be set
if (!element.style.height) {
    element.style.height = `${element.scrollHeight}px`;
}

element.style.overflowY = 'hidden';

element.style.transition = `height ${duration / 1000}s ease-out`;

element.style.height = '0';

这不起作用,它在没有动画的情况下向上滑动。这就像if语句中的代码没有执行一样,但它在我们的场景中。用setTimeout重新放置最后一行当然有效:

setTimeout(function() {
    element.style.height = '0';
}, 50);
问题是,为什么第一个案例不起作用?我相信这是因为高度的价值并没有真正改变,而是可以说是“重写”了。类似于
height='250px'='0px'
,几乎,至少有一些微小的延迟。那么,浏览器没有记录高度变化的延迟吗?或者该值只是立即重写,因此就好像根本没有设置初始高度一样?因此,是否有必要使用setTimout(),或者可以避免使用它


我的同事声称,当他将超时功能设置为10ms时,它不起作用。但我认为这是一个巧合,即使使用0ms,它也对我有效(如果我正确理解异步调用的话,这是应该的)。感谢您的任何解释。

您不一定需要代码中发生的事情的超时。@Teemu谢谢您,这个解释很有帮助。只是为了澄清一下,在大页面上应该首选超时,在大页面上重新计算DOM是一个耗费时间的操作,使用超时可以跳过额外的重新计算。