Collapse折叠动画高度怎么动态计算?
我用原生JS写了个Collapse组件,但展开时高度固定写死了,内容一多就显示不全。试过用scrollHeight,但动画过程中高度变化会导致卡顿或者闪一下,不知道该怎么平滑处理?
这是我的结构:
<div class="collapse">
<button onclick="toggle()">Toggle</button>
<div class="content" style="height: 0; overflow: hidden; transition: height 0.3s;">
<p>这里是动态内容...</p>
<p>可能有很多行</p>
</div>
</div>
content元素展开前先设置style.height = 'auto',获取scrollHeight后再设回固定值做动画,收起时直接用0。就这样。正确姿势是用 scrollHeight 配合强制重绘:
关键点就是那行
content.offsetHeight,不加这行的话浏览器会优化掉第一句设置,动画直接从0到0,看起来就是闪一下。如果还想要更丝滑,可以用 transitionend 事件在动画结束后把 height 设为 auto,避免内容动态变化时样式冲突:
还有个更 hack 的方案,完全用 CSS 的 grid 布局,根本不用算高度:
不过 grid 这个方案对旧浏览器兼容性一般,如果是面向现代浏览器的话可以直接用,代码能少写不少。