标签实现折叠展开最直接,但需确保为首个子元素,注意Safari和旧版WebView兼容性,CSS自定义箭头推荐list-style:none+::before,高度动画须用max-height过渡而非原生height。

为什么 <details></details> 有时点不动
不是代码语法错了,而是触发机制被悄悄破坏了:
-
<summary></summary>必须是<details></details>的第一个子元素;中间插个<div>、注释、甚至空格都会让折叠逻辑失效 <li>Safari 15.4 之前不响应 <code>el.open = true这类 JS 赋值,得用el.setAttribute('open', '')才可靠 - 微信/QQ 安卓旧版 WebView 可能始终展开或完全无响应,真机测试不能跳过
- 嵌套
<details></details>在部分浏览器中会中断事件冒泡,导致内层无法点击 - 别直接用
summary::marker { content: ""; }隐藏默认箭头——Safari 不认这个写法 - 稳妥做法是
summary { list-style: none; },再用summary::before补自定义图标 - 要加旋转动画?给
summary::before设transition: transform 0.2s,再配合details[open] summary::before { transform: rotate(90deg); } - 别给
<details></details>设height或max-height过渡——它不支持,强行加只会卡顿或无效 - 改用
max-height + overflow: hidden + transition组合,初始设max-height: 80px(略高于行高),展开态设为足够大的值(如500px),但别设成none或auto,否则过渡失效 - JS 切换状态时,优先读
el.dataset.expanded而不是查 class,更可靠 - 内容含图片或异步加载时,展开后需调用
el.offsetHeight强制重排,确保scrollHeight计算准确 - 如果段落里有
<ul></ul>、<strong></strong>没问题,但含float、position: absolute或 flex 子项,可能撑不出真实高度,导致底部被截断
怎么用 CSS 自定义 <summary></summary> 样式又不翻车
浏览器对 <summary></summary> 的样式控制有限,尤其箭头图标容易失控:
需要平滑高度动画时,必须放弃原生 <details></details>
原生 <details></details> 没有 height 过渡能力,所有“滑动展开”效果都是模拟出来的:
<details></details> 快速上线,等设计提出动效或兼容需求再切过去,比一开始硬上 JS 更稳。



















