在网页开发中,列表的折叠与展开是非常常见的交互场景。如果仅仅通过切换显示状态,内容会瞬间出现或消失,视觉效果比较突兀。借助css transition,我们可以为高度、透明度和间距等属性添加过渡,让列表展开和收起过程更加平滑自然。

为什么直接用display会失效
不少初学者喜欢用display:none和display:block来控制列表显示,但display属性本身不在transition的可动画属性范围内,浏览器无法对其做中间帧插值,所以加上transition也不会产生动画。正确的思路是使用可过渡的属性,例如height、opacity、transform等。
使用max-height模拟高度动画
由于height从auto过渡到具体数值无法被浏览器计算,通常采用max-height代替height。展开时把max-height设为一个足够大的值,收起时设回0,再配合overflow hidden即可。
/* 列表容器基础样式 */
.list {
max-height: 0;
opacity: 0;
overflow: hidden;
transition: max-height 0.3s ease, opacity 0.3s ease;
}
/* 展开状态 */
.list.open {
max-height: 500px;
opacity: 1;
}
结合JavaScript切换状态
我们可以用一段简单的脚本为按钮绑定点击事件,通过切换class触发过渡:
// 获取按钮和列表
var btn = document.querySelector('.toggle-btn');
var list = document.querySelector('.list');
// 点击切换展开类
btn.addEventListener('click', function () {
list.classList.toggle('open');
});
注意事项与优化建议
- max-height设定值应略大于内容实际高度,过大会导致收起时有延迟感。
- 如果列表项动态增减,可考虑使用ResizeObserver计算真实高度并赋值给height。
- 移动端可适度缩短过渡时间,避免操作拖沓。
小结
通过css transition控制max-height与opacity,就能以很低的成本优化列表折叠展开动画。实际项目中请根据内容长度微调参数,让交互更顺滑。
css_transition列表动画折叠展开修改时间:2026-07-29 20:18:15