details默认不支持水平排列,需用css设display: inline-flex并调整summary为inline-flex或inline-block,同时处理点击热区、展开内容换行及可访问性。

details标签默认不支持水平排列,必须用CSS干预
details 是语义化折叠组件,浏览器原生只提供垂直展开行为。它内部的 summary 是块级元素,默认独占一行,所以多个 details 并排显示会自动换行。想让它“水平排列”,本质是让父容器启用弹性布局或 inline 布局,并压制 summary 的块级表现。
用 display: inline-flex 实现紧凑横排
最稳妥的方式是把每个 details 包在 span 或 div 里,再统一设为 display: inline-flex;或者直接对 details 自身设 display: inline-flex(需注意 Safari 对该组合的支持较晚,iOS 16.4+ 才稳定):
details {
display: inline-flex;
flex-direction: column;
margin-right: 8px;
}
summary {
display: inline-flex;
align-items: center;
padding: 4px 12px;
cursor: pointer;
}
details[open] summary {
border-bottom: 1px solid #ccc;
}
关键点:
-
details设inline-flex后,多个能自然并排,但子元素仍按 flex column 排列(summary 在上、content 在下) -
summary必须显式设display: inline-flex或display: inline-block,否则默认块级会撑宽整个details - 不要给
summary设width: 100%,否则横排失效
展开区域内容不换行?用 white-space 控制
如果展开后的内容(details 的子节点,除 summary 外的部分)被压缩成单行或文字溢出,常见原因是父级 details 宽度受限,或内容自身有 white-space: nowrap。解决方式:
- 确保
details没有意外的width或max-width限制 - 对展开内容区域加样式:
details[open] > *:not(summary) { white-space: normal; } - 若内容含
pre或代码块,需单独重置:details[open] pre { white-space: pre-wrap; }
移动端点击区域小、误触多?补足点击热区
summary 默认点击区域仅限文字范围,在横排时容易点不中。尤其 iOS Safari 对 summary 的点击检测较严格:
- 给
summary加padding(至少 12px 上下) - 用
::after伪元素扩展可点击区:summary::after { content: ""; position: absolute; inset: -6px; }(需父级position: relative) - 避免在
summary内嵌套button或a,会干扰原生展开逻辑
真正难的不是让它们横着排,而是让横排后每个组件仍保持可访问、可聚焦、可键盘操作——summary 的 tabindex 和 role 不会自动继承,别忘了测试 Enter/Space 键是否还能触发展开。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











