需要在页面上找到隐藏 div 的高度(设置为 display:none)

IT技术 javascript html css yui
2021-03-13 01:23:52

我需要测量隐藏元素内部的 div 的 offsetHeight。

<div id="parent" style="display: none;">
    <div id="child">Lorem Ipsum dolor sit amet.</div>
</div>

父 div必须设置为“ display:none”。我对此无能为力。我意识到子 div 的 offsetHeight 将是 0。我需要找到一个解决方法。

我玩过的东西是当页面加载时,我复制父节点的子节点,在设置为“ visiblity:hidden的页面上注入一个 div 然后我测量这些元素的高度,并在完成后移除节点。

还有其他想法吗?

更新: 我最终不得不做的是:

使用 YUI 2,在页面加载时,我发现给定类名的所有元素要么设置为 display:none,要么高度和宽度为 0(这是测量元素是否存在的一种方法,或者父项设置为显示:没有任何)。然后我将该元素设置为 display:block。然后我检查了它的父级是否相同,并显示了它的父级,直到它找到一个可见的父级。一旦最高显示:无祖先设置为显示:块,我可以测量我的元素。

测量完所有元素后,我将所有元素重置回 display:none。

6个回答

你需要做元素的父可见的,而你得到元素的尺寸是一个非常短暂的瞬间。在通用解决方案中,通常会遍历所有祖先并使其可见。然后将它们的display值设置回原始值。

当然还有性能问题。

我们认为在执行的Prototype.js这种做法,但结束了getWidthgetHeight 制造只有实际的元素可见,而无需遍历祖先。

替代解决方案的问题——比如从“隐藏”父元素中取出元素——是一旦元素脱离了它的“常规”层次结构,某些样式可能不再适用于该元素。如果你有这样的结构:

<div class="foo" style="display:none;">
  <div class="bar">...</div>
</div>

和这些规则:

.bar { width: 10em; }
.foo .bar { width: 15em; }

那么从其父元素中取出元素实际上会导致错误的尺寸。

为什么不直接调用 window.getComputedStyle(elem).getPropertyValue("height"),即使隐藏也能工作!
2021-04-20 01:23:52
我考虑过这个...这似乎可能非常占用资源...你怎么看?
2021-04-24 01:23:52
编辑帖子以回答您的担忧(以及对替代方法的一些想法)。
2021-04-27 01:23:52
在精细地显示元素时,我看不到任何闪烁。我采取了只在获取高度时显示它然后隐藏它的方法。这也是 jQuery 的 slideToggle() 所做的。它工作得很好。+1
2021-04-27 01:23:52
@Ashwin Prabhu 完美运行!只要定义了 css 高度,而不是自动 .. 很好!
2021-05-10 01:23:52

如果使用style.display = "none",元素的宽度和高度将为 0,
但使用style.visibility = "hidden",元素的宽度和高度将由浏览器计算(与正常情况一样)。

我认为这将是最好的解决方案。如果隐藏元素妨碍了您,您甚至可以设置 z-index。
2021-05-05 01:23:52
在将可见性设置为隐藏后,某些用户可能会遇到隐藏 div 的透明方块(因为 div 的高度没有改变)。您可以添加 max-height:0;overflow:hidden; 然后使用元素的 scrollHeight
2021-05-13 01:23:52

您可以克隆元素,将其绝对定位在 -10000,-10000,测量克隆并销毁它。

@rinogo 这可能会导致屏幕中不必要的闪烁,因为元素显示的时间很短。使用绝对位置克隆它是一个更好的解决方案,因为您根本不接触原始元素。
2021-04-22 01:23:52
甜的!谢谢我想我可以实现这一点。+1 :)
2021-05-04 01:23:52
卓见。把它变成一个 jQuery 函数:stackoverflow.com/a/12463110/373345
2021-05-10 01:23:52
好主意!但是,如果元素已经设置为display: none,为什么不对元素本身进行必要的临时更改,测量它,然后撤消更改以将其移回原始位置?
2021-05-10 01:23:52
是的,你必须 - 理想情况下,在原始之后,所以任何 CSS 仍然完好无损。
2021-05-12 01:23:52

制作了一个没有 Jquery 和没有克隆的纯 js 解决方案(我猜这更快)

var getHeight = function(el) {
    var el_style      = window.getComputedStyle(el),
        el_display    = el_style.display,
        el_position   = el_style.position,
        el_visibility = el_style.visibility,
        el_max_height = el_style.maxHeight.replace('px', '').replace('%', ''),

        wanted_height = 0;

    // if its not hidden we just return normal height
    if(el_display !== 'none' && el_max_height !== '0') {
        return el.offsetHeight;
    }

    // the element is hidden so:
    // making the el block so we can meassure its height but still be hidden
    el.style.position   = 'absolute';
    el.style.visibility = 'hidden';
    el.style.display    = 'block';

    wanted_height     = el.offsetHeight;

    // reverting to the original values
    el.style.display    = el_display;
    el.style.position   = el_position;
    el.style.visibility = el_visibility;

    return wanted_height;
}

这是演示 https://jsfiddle.net/xuumzf9k/1/

如果你能找到任何改进,请告诉我(因为我在我的主要项目中使用它)

你最好想想它的祖先jsfiddle.net/rantiev/xuumzf9k/2
2021-04-16 01:23:52
使用绝对定位(隐藏时)特别是不影响任何其他布局该位置在元素获得其原始可见性之前被恢复。
2021-05-03 01:23:52
仍然是一段不错的代码;我喜欢简单。感谢分享!虽然我使用 scrollHeight 而不是 offsetHeight,但感觉它可能更适合我的情况。我不确定这是否是最明智的做法。我觉得取决于用例,即使是混合也会很好……无论哪种方式,我都希望为此拥有一个可配置的规范方法。
2021-05-12 01:23:52
绝对定位似乎没有必要并且会影响高度,至少在 Chrome 中使用具有默认浏览器样式的段落时是这样。
2021-05-14 01:23:52
注意:此方法从计算出的样式元素(即已经应用的 css 类)中恢复样式属性。因此,如果您从元素中删除特定类,它仍将具有已删除类的样式。
2021-05-14 01:23:52

一种解决方法是height0

.hidden { 
  height: 0; 
  overflow: hidden; 
}

然后获取元素scrollHeight

document.querySelector('.hidden').scrollHeight

尽管元素没有出现,scrollHeight 将正确地为您提供高度。我也不认为它会影响元素流。

示例:https : //jsfiddle.net/de3vk8p4/7/
参考:https : //developer.mozilla.org/en-US/docs/Web/API/CSS_Object_Model/Det​​ermining_the_dimensions_of_elements#How_big_is_the_content.3F

它并没有完全回答问题 ( display: none),但它帮助我解决了类似的问题。要知道实际高度,您可能还需要考虑填充。
2021-04-21 01:23:52