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

Posted

技术标签:

【中文标题】如何获得溢出的真实 .height():隐藏或溢出:滚动 div?【英文标题】:How do I get the real .height() of a overflow: hidden or overflow: scroll div? 【发布时间】:2011-02-01 03:06:01 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

我刚刚为此制定了另一个解决方案,不再需要使用 -much 到 high- max-height 值。它需要几行 javascript 代码来计算折叠 DIV 的内部高度,但之后,它都是 CSS。

1) 获取和设置高度

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

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

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

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

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

最终示例

所以完整的例子是这样的:首先循环遍历所有的手风琴面板并将它们的 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)的自适应最大高度动画。

希望这对将来的某个人(或我未来的自我供参考)有所帮助。

【讨论】:

这在 Chrome 中对我不起作用。在 Chrome 中,scrollHeight 的字面意思似乎是启用滚动时的高度。隐藏溢出后,scrollHeight 总是返回等于 clientHeight。【参考方案2】:

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

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

(丑陋但目前只有一个有效)

【讨论】:

【参考方案3】:

另一个简单的解决方案(不是很优雅,但也不太丑)是放置一个内部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>

(这个具体的例子是使用这个技巧来动画最大高度并避免折叠时的动画延迟(当对最大高度属性使用高数字时)。

【讨论】:

【参考方案4】:

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

【讨论】:

根据comment here,.scrollHeight DOM 函数在 IE developer.mozilla.org/en/DOM/element.scrollHeight) 中不起作用 scrollHeight 有时在隐藏(或其父项被隐藏)时也会返回零,这很烦人。 更正确地使用 $('#your_div').prop('scrollHeight'); @Simon 在我的例子中它只返回元素中可见像素的数量overflow: hidden :/ 纯javascript:document.getElementById('your_div').scrollHeight【参考方案5】:

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

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

【讨论】:

【参考方案6】:

其他可能性是将 html 放置在非溢出中:隐藏元素放置在屏幕“外”,例如绝对顶部和左侧小于 5000 像素的位置,然后读取此元素高度。它很丑,但效果很好。

【讨论】:

我不建议将它用于 SEO 问题,这对于屏幕阅读器来说可能看起来很奇怪。如果你这样做,你只需要在你阅读它的时候把 HTML 放在一个 div 中,然后用 javascript 立即删除它。但是对于这种情况,公认的答案更好

以上是关于如何获得溢出的真实 .height():隐藏或溢出:滚动 div?的主要内容,如果未能解决你的问题,请参考以下文章

隐藏溢出的响应式垂直中心

文字溢出隐藏

文本溢出隐藏

使用溢出时如何移动图像的 POV:隐藏?

隐藏溢出不适用于图像

溢出:隐藏不适用于图像