如何使用 jQuery 获取 div 全部内容的高度?

Posted

技术标签:

【中文标题】如何使用 jQuery 获取 div 全部内容的高度?【英文标题】:How do I get the height of a div's full content with jQuery? 【发布时间】:2011-10-14 18:16:42 【问题描述】:

我正在尝试创建自己的滚动条。我已经尝试了大多数 jquery 滚动条插件,但它们似乎都不适合我,所以我决定创建自己的。我有一个带有可滚动内容的溢出区域。如果我能够计算出可滚动内容区域的高度,我可以让滚动条工作。我已经尝试过 .scrollHeight() 并且浏览器甚至无法识别它。溢出区域有一个固定的位置。

【问题讨论】:

【参考方案1】:

scrollHeight is a property 的 DOM object,不是函数:

元素滚动视图的高度;它包括元素内边距,但不包括边距。

鉴于此:

<div id="x" style="height: 100px; overflow: hidden;">
    <div style="height: 200px;">
        pancakes
    </div>
</div>

这产生 200:

$('#x')[0].scrollHeight

例如:http://jsfiddle.net/ambiguous/u69kQ/2/(在 javascript 控制台打开的情况下运行)。

【讨论】:

在我读到关于 scrollHeight 的每一个地方,都没有人说过需要 [0] 并且 scrollheight 不是一个函数。我假设,在尝试这个之后,我得到了正确的高度。在我实现滚动条的计算之前,我不会知道。但是,你得到了积分。谢谢! @mtlca401:您需要[0] 从 jQuery 对象中提取底层 DOM 对象,这为您提供与document.getElementById() 相同的功能。你也可以使用jQuery的get函数。 我在 chrome 中得到 4260px,在 Firefox 中得到 4300px,但我假设这可能是因为填充?这是正确的吗? @mtlca401:可能有很多东西(边距、填充、行高、字体渲染差异……),~1% 的差异并没有那么大。 如果你想要实际的 scrollTop 高度,你需要 scrollLength = $('#x')[0].scrollHeight - $('#x').height();【参考方案2】:

如果您能帮上忙,请勿使用 .scrollHeight

.scrollHeight 在某些情况下(在滚动时最显着)在不同浏览器中不会产生相同类型的结果。

例如:

<div id='outer' style='width:100px; height:350px; overflow-y:hidden;'>
<div style='width:100px; height:150px;'></div>
<div style='width:100px; height:150px;'></div>
<div style='width:100px; height:150px;'></div>
<div style='width:100px; height:150px;'></div>
<div style='width:100px; height:150px;'></div>
<div style='width:100px; height:150px;'></div>
</div>

如果你这样做了

console.log($('#outer').scrollHeight);

您将在 Chrome、FireFox 和 Opera 中获得 900 像素。太好了。

但是,如果你在#outer 上附加了一个wheelevent / wheel 事件,当你滚动它时,Chrome 会给你一个900px 的常量值(正确),但是FireFox 和Opera 会将它们的值更改为你向下滚动(不正确)。

一个非常简单的方法就是这样(有点作弊,真的)。 (此示例在向#outer 动态添加内容时也有效):

$('#outer').css("height", "auto");
var outerContentsHeight = $('#outer').height();
$('#outer').css("height", "350px");

console.log(outerContentsHeight); //Should get 900px in these 3 browsers

我选择这三个浏览器的原因是因为在某些情况下,这三个浏览器都可能不同意 .scrollHeight 的值。我在制作自己的滚动窗格时遇到了这个问题。希望这对某人有所帮助。

【讨论】:

既然 scrollHeight 是一个 DOM 属性,你不应该改用 $('#outer').get(0).scrollHeight 吗?【参考方案3】:

我们也可以使用 -

$('#x').prop('scrollHeight') <!-- Height -->
$('#x').prop('scrollWidth')  <!-- Width -->

【讨论】:

【参考方案4】:

Element.scrollHeight 是属性,而不是函数,如 here 所述。如here 所述,仅在 IE8 之后才支持 scrollHeight 属性。如果您需要它在此之前工作,请将 CSS overflowheight 临时设置为 auto,这将导致 div 占据它所需的最大高度。然后获取高度,并将属性改回原来的样子。

【讨论】:

developer.mozilla.org/en-US/docs/Web/API/Element.scrollHeight 说 IE 8 是它支持的最低版本,所以应该是“IE7 之后”或“IE8 及更高版本”【参考方案5】:

您可以通过.outerHeight() 获取它。

有时,它会返回0。为获得最佳结果,您可以在 div 的就绪事件中调用它。

为了安全起见,您不应将div 的高度设置为x。您可以保持其高度 auto 以使用正确的高度正确填充内容。

$('#x').ready( function()
// alerts the height in pixels
alert($('#x').outerHeight());
)

你可以找到详细的帖子here。

【讨论】:

【参考方案6】:
    使用scrollHeight 不仅有问题,而且当您的容器具有硬编码的高度时(这可能是大多数情况下,因为您想在不使用container.height() 本身的情况下获得内容高度)时也不起作用 @shazboticus-s-shazbot 解决方案很好,因为您可以临时调整容器高度/使用硬编码高度。 另一种解决方案是:

$('#outer')
    // Get children in array format, as we'll be reducing them into a single number
    .contents().toArray()
    // Filter out text and comment nodes, only allowing tags
    .filter(el => el.nodeType === 1)
    // Sum up all the children individual heights
    .reduce((accumulator, el) => $(el).outerHeight(true) + accumulator, 0);

当然,后一种选择仅在#outer 没有占用空间且您想要测量的直接文本子项时才有效。这是我的 2 美分。

    如果你想测量展开的文本,我建议修改你的 DOM 树并有一个内部 &lt;div&gt;,你可以通过 $('#outer').children().height() 轻松测量它

【讨论】:

以上是关于如何使用 jQuery 获取 div 全部内容的高度?的主要内容,如果未能解决你的问题,请参考以下文章

如何copy全部的div内容到另外一个div上

怎么用JQuery读取<div>里面的IMG标签的属性

jquery如何获取子标签的IDŀ

如何在java中用js和jquery截取一个网页文本域中的内容。(获取的是部分内容,包括div布局等)

如何通过使用 jQuery 移动单击 div 来请求页面内容?

jquery 操作div内容插入到另一个div