添加到 DOM 的元素在 jQuery 中没有宽度或高度?

Posted

技术标签:

【中文标题】添加到 DOM 的元素在 jQuery 中没有宽度或高度?【英文标题】:Elements added to the DOM have no width or height in jQuery? 【发布时间】:2016-03-04 08:55:48 【问题描述】:

我在 DOM 中添加了一个块级元素,例如 p 标记。它的尺寸应该是自动计算的(例如自动)。但是,至少在最初,我不能用 jQuery 检索它的高度。过了一段时间后(大概是进行了一些布局处理),我可以检索高度。

除了将元素添加到 DOM 中以使其计算出的高度可检索之外,还必须发生什么才能使元素实际可测量?

具体来说,我有一个 select 元素和一些 option 元素,每个元素都附加了图像 URL 数据。我调用了一个image-picker plugin,它读取option 标记数据,隐藏select 元素,并将选项转换为一个带有div 元素的容器,如下所示:

<div class='container' style='width:800px'>
    <div class='convertedOptionElement' style='width:33.33%'>
        <div class='thumb' style='width:100%'>
            <img src="https://lh3.ggpht.com/hhG6g0m8Q6QqZnloQJHV9uXFdsDjpzD0vJdkbra5e_PiwOjVXuBdVR0D2L0RPmwb1zw=h900">
            <p>Image Title</p>
        </div>
    </div>
</div>

所以我有一个固定宽度的容器,它将填充 33.33% 宽度的 div 元素(产生 3 列)。这些 div 中的每一个都代表转换后的选项元素之一。在每一个中,都有一个宽度为 100% 的 div 元素,其中包含一个 imgp 标记。

此外,我正在使用 imagesLoaded 插件和 masonry 插件来布置图像。在每个图像加载后运行的 imagesLoaded progress 事件中,我可以清楚地看到 img 元素的高度和宽度均不为零。但是,它的容器没有,p 标记也没有。

唯一可能发生的特殊情况是,在使用图像选择器插件创建元素后,我立即使用$('.convertedOptionElement').detach() 分离它们,然后在imagesLoadedprogress 事件中触发在加载每个图像时,我将它们附加到容器并调用 masonry.appended method 以便它执行布局。这就是问题出现的地方,因为尽管所有内容都在 DOM 中,但计算出的高度为零。

请注意,即使我提供了精确的宽度(例如 250 像素而不是 33.33% 和 100%),然后在同一个加载的事件处理程序中,我通过计算现有的缩放高度在 jQuery 中显式设置宽度和高度图片尺寸(即所有父元素都有明确的尺寸)...段落标签的高度仍然为零。

这是我的代码,但这是有效的。它在我使用的确切上下文中不起作用,我不知道为什么。 http://jsfiddle.net/p7cgahro/7/

【问题讨论】:

从您的代表来看,您已经在这里待了足够长的时间,并且看到了足够多的问题,知道这不是它的做法。我们需要查看您的代码才能开始诊断任何问题。 一般来说,在没有内容或样式的情况下是没有维度的:jsfiddle.net/p7cgahro 好吧,正如我所说,没有理由不使用您提供的基本信息。如果您愿意为我们提供一个实际尝试的示例,我相信有人会花一些时间来帮助您。 您不能附加到document - 使用body。 jsfiddle.net/p7cgahro/1 他做到了。你试过他的小提琴吗? 【参考方案1】:

给定您的代码:

$(document).append('<p>Hello</p>');
console.log($(document).find('p').height()); //zero, why?

您正试图将 html 附加到无效的 document。请改用body 元素:

$('body').append('<p>Hello</p>');
console.log($('body').find('p').height());

Working example

【讨论】:

那是一个例子,不要从字面上理解为添加到文档中。 @Triynko 需要发布一个代码示例来演示您在说什么,因为 Rory 提供的示例反驳了您的说法。【参考方案2】:

问题是一个父元素有'display:none;',这是我没想到的。

事实证明,在对话框上调用引导程序的modal('show') 后,它实际上并没有立即改变任何东西。

例如,在调用modal('show') 之后,对话框仍然有CSS 类fade(没有类in),它的显示样式仍然是none。一段时间后,添加了in 类,它基本上覆盖了fade 类的零不透明度并将其设置为1(使用CSS 动画)。 display:none 样式也被移除。

本质上,问题归结为这样一个事实,即在我们尝试进行测量时,父元素要么有display:noneopacity:0。特别是,display:none 值导致了测量结果的偏差。

有趣的是,这个问题可以在我的问题的原始版本中直接回答,无需一行代码,因为我只是问“除了添加元素之外,必须发生什么才能使元素真正可测量到 DOM,以便可以检索其计算的高度?”

答案是……没有一个父元素可以有 'display:none'。

【讨论】:

以上是关于添加到 DOM 的元素在 jQuery 中没有宽度或高度?的主要内容,如果未能解决你的问题,请参考以下文章

AngularJS - 在没有 jQuery 的指令中将 HTML 元素添加到 dom

jQuery中DOM操作

jQuery 如何获取到隐藏元素的高度?或者在dom元素可见性改变时能触发个事件也行。

是否可以将元素添加到 React 的虚拟 DOM 但使用 jQuery 附加到真实 DOM?

jquery - dom 操作

jquery获取不到动态加载的dom元素是一种啥样的体验