原生支持无JS折叠展开,但必须满足为首个子元素、避免结构非法、正确使用布尔属性open,否则点击无效;Safari旧版需用setAttribute('open', ''),微信WebView兼容性差,动画须用max-height模拟。

直接用 + 就能创建折叠展开详情,不需要写 JavaScript,但必须满足 DOM 结构和浏览器行为前提,否则点不动、不收起、动画卡顿都是常见结果。
为什么点不开?
不是代码写错,而是触发机制被悄悄破坏了:
-
必须是的第一个子元素;中间插个、注释、甚至换行空白符,都会让折叠失效- Safari 15.4 及更早版本不响应
el.open = true这类 JS 赋值,得用el.setAttribute('open', '')才可靠- 微信或 QQ 内置 WebView(尤其安卓旧版)可能始终展开或完全无响应,真机测试不能跳过
- 父容器设了
overflow: hidden且高度固定,展开内容会被直接裁掉——这不是 bug,是 CSS 规则生效了怎么让
里的图标和箭头可控?原生箭头无法直接改内容,但可以清空再重绘,关键是跨浏览器兼容写法:
- 先清除默认:用
summary::marker { content: ""; }(Chrome/Firefox 有效),Safari 需额外加summary::-webkit-details-marker { display: none; } - 自定义图标推荐用
summary::before,配合transform: rotate(0deg)和transition实现旋转动效 - 展开时加样式:用
details[open] summary::before { transform: rotate(90deg); } - 禁止在
里嵌套或其他可点击元素——它们会吞掉 click 事件,就收不到
max-height动画替代height: auto的实操坑CSS 过渡不支持
height: auto,硬写transition: height 0.3s会导致抖动或无效,必须用max-height模拟:- 安全做法:预估最大高度(比如最多 6 行 × 行高 ≈ 300px),设
max-height: 300px;收起时设max-height: 0,同时加overflow: hidden - 别对
本身设max-height动画——要作用于内容区,即details[open] > *:not(summary) - 如果内容高度动态变化(比如 JS 后续插入新项),
max-height值可能不够,需重新计算并更新样式,此时建议换 JS 方案
真正难的不是写出来,而是判断什么时候该坚持原生
,什么时候必须切到 JS 控制——比如需要 URL 参数驱动初始状态、多级联动、或内容高度不可预估时,max-height的硬编码就成瓶颈了。 - Safari 15.4 及更早版本不响应
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











