Collapse折叠组件的过渡动画为什么只在第一次展开时有效?
我在用Vue写Collapse折叠组件时,给max-height加了transition,但发现动画只在第一次展开时有效,之后收起和再次展开都变成瞬时切换了。试过把高度设成100%也不行,控制台没报错但效果不对,求大佬帮忙看看哪里漏了?
.collapse-content {
overflow: hidden;
max-height: 0;
transition: max-height 0.3s ease;
}
.collapse-content.active {
max-height: 1000px; /* 我猜这是问题所在 */
}
现在发现如果手动把max-height的具体像素值改小,有时候又能生效,但这样写太不灵活了。难道是过渡属性没有正确绑定到动态高度吗?
max-height的过渡动画需要一个明确的数值范围才能正常工作。你现在的写法中用了1000px,这确实不够灵活,而且可能导致浏览器无法正确计算动态高度。更好的写法是通过 JavaScript 动态设置
max-height,这样就能确保每次展开时都用上正确的高度值。下面是一个简单的实现:然后在模板里加上引用:
CSS 部分保持不变:
这样写的好处是:每次展开时都会根据内容的实际高度动态设置
max-height,而不是用固定的1000px。收起时直接清空max-height,过渡动画就能一直正常工作了。顺便说一句,如果不想手写这么多逻辑,也可以考虑用 Vue 的内置
<transition>组件,结合v-show来实现更简洁的折叠效果。不过如果你对控制细节有要求,上面这种方式会更适合。