jQuery Slidedown 如何在显示之前获取隐藏项的最终高度?

How does jQuery Slidedown get final height of hidden item before showing it?

我正在尝试在 GSAP 中复制 jQuery slideDown(),但我无法弄清楚 jQuery 如何计算当前隐藏的项目的高度,就像它一样被设置为 height:auto.

我试过搜索 GitHub 上的代码,但在它调用的 jQuery.fn.slideDownjQuery.fn.animate 中找不到任何似乎在执行此操作的代码。

SO上有几个类似的问题,提出了几个解决方案,好像都有自己的问题:

  1. 克隆元素,将其放置在屏幕外并计算其高度。

    如果元素或其任何子元素的高度由 CSS 样式设置,这要求元素位于 DOM 中的原始位置(例如,如果 .accordianItem 可能仅在其内部设置样式它 .accordian).

  2. 显示项目,删除height:0并快速计算高度,然后再次隐藏元素,然后播放动画。

    计算高度时可能会快速闪现内容

  3. 计算高度时用visibility:true显示到位

    这样就可以停止闪烁并仍然将元素保持在 DOM 中的相同位置以进行正确的高度计算,但它仍会将其下方的其他项目向下推,因为 visibility:false 项目仍然具有高度。

  4. 计算项目隐藏前的高度并将其存储在数据属性中,以便我们稍后在要打开项目时知道它。

    如果任何动态内容在隐藏时更改项目的高度,这将不起作用。

jQuery slideDown() "just works" 每次都这样,所以我真的很想知道 它是如何工作的, 但我就是不知道它在哪里这样做。我也很惊讶 GSAP 不能开箱即用,或者之前没有人分享过合适的解决方案。

如有任何帮助,我们将不胜感激。

事实证明,如果您使用 $.height() 来获取带有 display:none 的元素的高度,它不会像您期望的那样 return 0,它实际上设置 visibility:hiddenposition:absolute 等,并将 display 设置为 block 以返回正确的高度。我假设这是在进行下拉时在内部使用的内容。

这个回答对我帮助很大

jQuery: height()/width() and "display:none"

只是为了弄清楚这似乎是如何避免我原来问题中的所有问题的。它基本上是在执行数字 (3),但避免了将较低内容向下推到页面下方的问题,因为在计算高度时它也被设置为 position:absolute。一个非常简单优雅的解决方案