和是原生语义化折叠方案,但必须为的首个直接子元素,否则点击失效;open是布尔属性,仅靠存在与否生效,不可赋值;禁止在内嵌交互元素,样式需用::marker或::before安全定制。

<details></details> 和 <summary></summary> 不是“可选技巧”,而是原生支持、语义清晰、无需 JS 就能工作的折叠交互方案。但写错一两个位置或属性,就会出现点击无反应、内容塌陷、焦点失效等问题。
为什么<summary></summary>必须是<details></details>的第一个子元素
浏览器强制校验 DOM 结构:<summary></summary> 如果不是直接子元素,或前面有文本、空格、<p></p> 等其他节点,整个 <details></details> 的展开逻辑会静默失效——不报错,但点击没反应。
- ❌ 错误示例:
<details><p>多余段落</p> <summary>标题</summary><p>内容</p><div class="aritcle_card flexRow artxards"> <div class="artcardd flexRow"> <a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill6712" title="Wechat HTML Publisher"><img src="https://img.php.cn/upload/skill/000/000/081/179109368394970.jpg" alt="Wechat HTML Publisher" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a> <div class="aritcle_card_info flexColumn"> <a rel="nofollow" href="/xiazai/skill6712" title="Wechat HTML Publisher" class="overflowclass">Wechat HTML Publisher</a> <p class="overflowclass">直接上传HTML富文本到微信公众号草稿箱。支持完整的HTML格式,无需Markdown转换。</p> </div> <a rel="nofollow" href="/xiazai/skill6712" title="Wechat HTML Publisher" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div></details> - ✅ 正确结构:
<details><summary>标题</summary><p>内容</p></details> - ⚠️ 注意:HTML 解析时会把换行+缩进视为空白文本节点,所以写成多行时也要确保
<summary></summary>紧贴<details></details>开始标签,或用注释消除空白(如<details><!-- --><summary></summary></details>)
open 属性怎么设才有效
open 是布尔属性,只看是否存在,不看值。写 open="false" 或 open="" 都等同于 open,都会默认展开。
- ✅ 默认关闭(推荐):
<details><summary>…</summary></details> - ✅ 默认展开:
<details open><summary>…</summary></details> - ❌ 无效写法:
<details open="false"></details>、<details open="0"></details>、<details :open="false"></details>(Vue 模板中也需用 v-bind 绑定布尔值,而非字符串) - ? JS 控制要用
.open属性:el.open = true或el.toggleAttribute('open'),不能用setAttribute('open', 'open')模拟
summary里能放按钮或链接吗?
可以,但会破坏键盘操作链和语义。原生 <summary></summary> 自带焦点、空格/回车触发、屏幕阅读器朗读为“可展开区域”,一旦在里面嵌套 <button></button> 或 @#@#@#@#@#@#@#@#@#@0
tabindex="-1" + 手动绑定 click 和 keydown(监听 Space/Enter),并加 aria-label 说明作用样式重置后小三角消失怎么办
很多 CSS 重置库(如 normalize.css)或自定义样式会清掉 list-style 或 appearance,导致小三角不见,但点击仍有效——用户感知不到可交互性。
- ✅ 推荐修复:
summary { list-style: none; } summary::marker { content: "▶ "; } summary[open]::marker { content: "▼ "; } - ✅ 更现代方案:
summary { appearance: none; } summary::before { content: "▶ "; },再用[open]::before切换图标 - ⚠️ 别用
outline: none直接干掉 focus 样式——这会让键盘用户失去视觉反馈;改用outline: 2px solid #007bff等高对比样式替代
最常被忽略的是 DOM 结构刚性——它不像 div 那样宽容。哪怕一个看不见的空格、一次错误的 Vue 条件渲染顺序、或 SSR 与 CSR 的 HTML 差异,都可能导致 <summary></summary> 失效。上线前务必在无 JS 环境下手动测试点击和键盘操作。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










