使用transition-behavior: allow-discrete实现手风琴内容过渡遇阻求助
解决方案建议
方案1:正确结合 @starting-style 与 transition-behavior 修复打开动画
问题根源是元素从display:none切换到display:grid时,浏览器没有初始的0fr布局状态可过渡,导致打开动画无法触发。通过@starting-style显式定义展开状态的起始样式,就能让过渡生效:
.accordion-content { display: none; grid-template-rows: 0fr; overflow: hidden; /* 防止内容溢出 */ transition: grid-template-rows 500ms, display 500ms allow-discrete; &[aria-hidden="false"] { display: grid; grid-template-rows: 1fr; } /* 为展开状态定义起始过渡样式 */ @starting-style { &[aria-hidden="false"] { grid-template-rows: 0fr; } } }
关键说明:
overflow: hidden必须保留,否则内容在0fr状态下仍会显示@starting-style会告诉浏览器:当元素切换到aria-hidden="false"状态时,从grid-template-rows:0fr开始过渡到1fr- 此方案仅支持Chrome/Edge 115+、Safari 16.4+,Firefox暂不支持
transition-behavior
方案2:兼容Firefox的无障碍优化方案
如果需要兼容Firefox,放弃display:none的离散过渡,改用visibility配合grid-template-rows,同时通过aria-hidden确保无障碍:
.accordion-content { display: grid; grid-template-rows: 0fr; visibility: hidden; overflow: hidden; transition: grid-template-rows 500ms, visibility 500ms; &[aria-hidden="false"] { grid-template-rows: 1fr; visibility: visible; } }
关键说明:
visibility: hidden的元素不会被键盘Tab键选中,解决无障碍问题- 动画全程保持
display:grid,所以打开/关闭过渡都能正常触发 - 完全兼容所有现代浏览器,包括Firefox
额外无障碍优化建议
- 确保手风琴触发按钮绑定正确的
aria-expanded属性,与内容的aria-hidden状态同步 - 触发按钮应支持键盘回车/空格触发展开/关闭操作
- 内容区域的
aria-hidden必须与视觉状态严格一致,确保屏幕阅读器正确识别
内容的提问来源于stack exchange,提问作者Luca Detomi
相关产品推荐
相关产品推荐

