【发布时间】:2011-10-14 18:16:42
【问题描述】:
我正在尝试创建自己的滚动条。我已经尝试了大多数 jquery 滚动条插件,但它们似乎都不适合我,所以我决定创建自己的。我有一个带有可滚动内容的溢出区域。如果我能够计算出可滚动内容区域的高度,我可以让滚动条工作。我已经尝试过 .scrollHeight() 并且浏览器甚至无法识别它。溢出区域有一个固定的位置。
【问题讨论】:
我正在尝试创建自己的滚动条。我已经尝试了大多数 jquery 滚动条插件,但它们似乎都不适合我,所以我决定创建自己的。我有一个带有可滚动内容的溢出区域。如果我能够计算出可滚动内容区域的高度,我可以让滚动条工作。我已经尝试过 .scrollHeight() 并且浏览器甚至无法识别它。溢出区域有一个固定的位置。
【问题讨论】:
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 控制台打开的情况下运行)。
【讨论】:
[0] 从 jQuery 对象中提取底层 DOM 对象,这为您提供与document.getElementById() 相同的功能。你也可以使用jQuery的get函数。
如果您能帮上忙,请勿使用 .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 的值。我在制作自己的滚动窗格时遇到了这个问题。希望这对某人有所帮助。
【讨论】:
$('#outer').get(0).scrollHeight 吗?
我们也可以使用 -
$('#x').prop('scrollHeight') <!-- Height -->
$('#x').prop('scrollWidth') <!-- Width -->
【讨论】:
【讨论】:
您可以通过.outerHeight() 获取它。
有时,它会返回0。为获得最佳结果,您可以在 div 的就绪事件中调用它。
为了安全起见,您不应将div 的高度设置为x。您可以保持其高度 auto 以使用正确的高度正确填充内容。
$('#x').ready( function(){
// alerts the height in pixels
alert($('#x').outerHeight());
})
你可以找到详细的帖子here。
【讨论】:
scrollHeight 不仅有问题,而且当您的容器具有硬编码的高度时(这可能是大多数情况下,因为您想在不使用container.height() 本身的情况下获得内容高度)时也不起作用$('#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 美分。
<div>,你可以通过 $('#outer').children().height() 轻松测量它
【讨论】: