用transition配合max-height实现平滑折叠的关键是动态设置max-height:展开前用scrollHeight获取真实高度并内联设置,收起时先移除类名、延迟一帧再设为0;过渡推荐ease-out(展开)和ease-in(收起),时长250–350ms,并确保overflow:hidden及合理处理子元素间距。
用 transition 配合 max-height 实现折叠列表的平滑收起,关键不在“加不加 transition”,而在于 max-height 的取值是否合理——设得太小会提前截断、设得太大又导致动画拖沓或卡顿。
固定值在内容高度变化时会失效:内容少时动画“空跑”半天,内容多时直接被裁切。正确做法是动态匹配真实高度,但 CSS 本身无法读取 JS 计算的高度,所以需配合 JS 获取并内联设置:
element.scrollHeight 获取容器实际高度style.maxHeight(例如 el.style.maxHeight = el.scrollHeight + "px")如果收起时直接设 max-height: 0,浏览器可能因渲染优化跳过过渡,导致瞬间消失。稳妥做法是:
setTimeout 或 requestAnimationFrame 延迟一帧,再设置 maxHeight = "0"
默认 ease 在开头太快、结尾太慢,容易显得“收不干净”。推荐:
ease-out:起始快,收尾稳,感知更自然ease-in:缓慢启动,避免突兀消失max-height 过渡生效的前提是容器有 overflow: hidden,否则内容会撑开布局;另外子项的上下 margin 和 padding 会影响 scrollHeight 计算,建议:
overflow: hidden
padding-top/bottom 替代 margin(margin 会塌陷,影响高度测量)box-sizing: border-box,减少计算误差基本上就这些。不复杂但容易忽略细节,调通一次,后续复用就很顺了。