为什么getComputedStyle返回'auto'用于元素创建后的像素值

Why does getComputedStyle return 'auto' for pixels values right after element creation?

本文关键字:像素 创建 auto getComputedStyle 返回 为什么 用于 元素      更新时间:2023-09-26

我使用Mustache生成一些HTML,并使用insertAdjacentHTML将其放置在页面上。它显然转换为DOM结构,因为我可以通过使用document.querySelector('.contentarea')调用之后得到它的句柄。但是,如果我试图获得宽度或高度的像素值,它会不断抛出'auto'

认为这可能只是一个问题与getComputedStyle,我尝试使用.getBoundingClientRect.offsetWidth代替。两者都返回0。如果我将调用放在setTimeout(function(){}, 1)中稍微延迟一下,它就可以工作,但这对于我的生产代码来说是不实际的,因为它需要进入同步构造函数中。

这在Firefox (Aurora)和Chrome中都发生了。我记得读过一篇关于Mozilla如何通过使用延迟框架结构来提高DOM操作性能的文章,并认为可能会有一个框架有点延迟的错误,但由于它也发生在Chrome中,这似乎不太可能。

有没有人对这里发生了什么或者如何解决它有任何想法?我真的需要在插入HTML后立即获得像素高度/宽度信息。

PS:任何浏览器做HTML到DOM解析/构建在一个单独的线程?我在想这可能也会导致这种行为。

没关系:这是我自己的错。我只是没有注意到在代码试图获得测量之前设置的display: none;样式。

有几个因素会导致"auto"的结果。你找到了其中一个;display: none。如果元素是内联的,它也会返回auto.

本质上它必须是blockinline-block元素,并且必须呈现

根据我的经验,许多浏览器(IE, Chrome, Firefox)故意延迟计算布局,直到Javascript线程结束或通过超时调用产生。

我知道的唯一解决方案是屈服于浏览器,然后重新启动。您使用setTimeout的方法效果很好。