+ 可零js实现原生展开收起,支持无障碍与默认open状态;需用css自定义箭头而非删除marker;safari 12.1+才支持transition动画,否则需js+max-height方案。

用 <details></details> + <summary></summary> 零 JS 实现最简展开收起
浏览器原生支持,无障碍友好,不用写一行 JS 就能工作。关键不是“能不能”,而是“要不要兼容旧版 Safari”。
实操建议:
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
-
<details></details>默认收起,<summary></summary>是唯一可点击区域,内容写在<summary></summary>之后、之前 - 加
open属性可默认展开:<details open></details> - 想改箭头图标?用 CSS 覆盖
summary::marker,别删它——否则屏幕阅读器会丢语义 - Safari 12.1+ 才支持
transition动画;若需动画,得 fallback 到 JS 方案
用 max-height + overflow:hidden 做带过渡的 JS 展开
这是目前最稳妥的动效方案,但容易因高度计算不准导致截断或卡顿。
实操建议:
- 初始状态设
max-height: 80px(值要略大于折叠时行高 × 行数),overflow: hidden - 展开态设
max-height: 500px(必须是具体数值,不能是none或auto) - 务必加
transition: max-height 0.3s ease-in-out,且只对max-height过渡 - 文本含
<img>或异步加载内容时,展开后调用el.offsetHeight强制触发重排,再设目标max-height
用 display: none 切换时为什么初始状态总不对
因为 element.style.display 只读内联样式,没设过就返回空字符串,不是 "none"。
实操建议:
- CSS 中先写
.content { display: none; },JS 里只负责el.style.display = "block"或"none" - 别用
if (el.style.display === "none")判断,改用getComputedStyle(el).display === "none" - 如果用 class 切换,确保对应 CSS 规则带
!important或足够 specificity,否则可能被其他样式覆盖
文本里有 <ul></ul>、<strong></strong> 或浮动元素时怎么避免展开后底部被截
子元素布局方式会影响父容器真实高度计算,max-height 动画就会失准。
实操建议:
- 容器用
display: block(默认即可),禁用position: absolute和float子项 - 若有
flex子项,加align-items: flex-start,防止基线对齐把高度撑高 - 避免在展开容器里用
height: 100%或min-height,它们和max-height冲突
<details></details> 能覆盖 70% 场景;剩下 30% 需要动画或兼容 IE 的,才上 JS + max-height。很多人卡在“展开后文字突然跳出来”或“收不回去”,问题几乎都出在高度没预留、没强制重排、或者用了 height 过渡。前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










