如何获取溢出的真实.height():隐藏或溢出:滚动div?


160

我有一个关于如何获得div高度的问题。我知道.height()innerHeight(),但是在这种情况下,它们都没有为我完成这项工作。关键是在这种情况下,我有一个div溢出宽度为div:滚动,并且div具有固定的高度。

如果我使用.height()innerHeight(),它们都给了我可见区域的高度,但是如果我要考虑溢出的情况,该怎么办?

Answers:


292

使用.scrollHeightDOM节点的属性:$('#your_div')[0].scrollHeight


3
根据此处评论.scrollHeightDOM功能将在IE <8.0(developer.mozilla.org/en/DOM/element.scrollHeight
TMS 2012年

5
scrollHeight当它被隐藏(或它的父对象被隐藏)时,有时也会令人讨厌地返回零。
西蒙东

28
更正确地使用$('#your_div')。prop('scrollHeight');
Lyubimov Roman

2
@Simon在我的情况下,它只返回元素中可见像素的数量overflow: hidden:/
Pere

3
纯javascript:document.getElementById('your_div').scrollHeight
stambikk 2015年

7

有关.scrollHeight属性的更多信息,请参阅docs

所述Element.scrollHeight只读属性是一个元素的内容的高度的测量,包括由于溢出内容在屏幕上不可见的。scrollHeight值等于元素所需的最小clientHeight,以便在不使用垂直滚动条的情况下适合视点中的所有内容。它包括元素填充,但不包括其边距。


3

另一种可能性是将html放置在屏幕的“ overflow:hidden”元素中,例如“绝对顶部”和“左侧”,然后是5000px,然后读取此元素的高度。它很丑,但是效果很好。


1
我不建议将其用于SEO事务,对于屏幕阅读器来说似乎很奇怪。如果这样做,则仅在阅读时将HTML放入div中,然后使用javascript立即将其删除。但是,对于这种情况,可接受的答案更好
Yann Chabot 2015年

1

我刚刚为此准备了另一种解决方案,不再需要使用-多到高-最大高度值。它需要几行JavaScript代码来计算折叠后的DIV的内部高度,但在那之后,全部是CSS。

1)提取和设置高度

获取折叠元素的内部高度(使用scrollHeight)。我的元素有一个类.section__accordeon__content,实际上我是在forEach()循环中运行它来设置所有面板的高度,但是您明白了。

document.querySelectorAll( '.section__accordeon__content' ).style.cssText = "--accordeon-height: " + accordeonPanel.scrollHeight + "px";

2)使用CSS变量来扩展活动项目

接下来,max-height当项目具有.active类时,使用CSS变量设置值。

.section__accordeon__content.active {
  max-height: var(--accordeon-height);
}

最后的例子

因此,完整示例如下所示:首先遍历所有Accordeon面板并将其scrollHeight值存储为CSS变量。接下来,使用CSS变量作为max-height元素的活动/扩展/打开状态的值。

Javascript:

document.querySelectorAll( '.section__accordeon__content' ).forEach(
  function( accordeonPanel ) {
    accordeonPanel.style.cssText = "--accordeon-height: " + accordeonPanel.scrollHeight + "px";
  }
);

CSS:

.section__accordeon__content {
  max-height: 0px;
  overflow: hidden;
  transition: all 425ms cubic-bezier(0.465, 0.183, 0.153, 0.946);
}

.section__accordeon__content.active {
  max-height: var(--accordeon-height);
}

那里有。仅使用CSS和几行JavaScript代码(无需jQuery)的自适应最大高度动画。

希望这对将来的人(或我将来的自我)有所帮助。


0

对于那些没有溢出但以负边距隐藏的对象:

$('#element').height() + -parseInt($('#element').css("margin-top"));

(很难看,但到目前为止仍然有效)


-1

另一个简单的解决方案(不是很优雅,但也不太丑)是放置一个内部,div / span然后获取其高度($(this).find('span).height())。

这是使用此策略的示例:

$(".more").click(function(){
if($(this).parent().find('.showMore').length) {
$(this).parent().find('.showMore').removeClass('showMore').css('max-height','90px');
$(this).parent().find('.more').removeClass('less').text('More');
} else {
$(this).parent().find('.text').addClass('showMore').css('max-height',$(this).parent().find('span').height());
$(this).parent().find('.more').addClass('less').text('Less');
}
});
* {transition: all 0.5s;}
.text {position:relative;width:400px;max-height:90px;overflow:hidden;}
.showMore {}
.text::after {
  content: "";
    position: absolute; bottom: 0; left: 0;
        box-shadow: inset 0 -26px 22px -17px #fff;
    height: 39px;
  z-index:99999;
  width:100%;
  opacity:1;
}
.showMore::after {opacity:0;}
.more {border-top:1px solid gray;width:400px;color:blue;cursor:pointer;}
.more.less {border-color:#fff;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div>
<div class="text">
<span>
Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
</span></div>
<div class="more">More</div>
</div>

(此特定示例使用此技巧为max-height设置动画,并避免折叠时动画延迟(当对max-height属性使用高数字时)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.