最可靠纯CSS实现FAQ折叠是用input[type="checkbox"]的:checked状态联动兄弟元素显隐,需正确DOM顺序、max-height过渡动画、无障碍支持及伪元素重绘箭头。
用
控制折叠状态最可靠
纯 CSS 实现 FAQ 折叠,核心是利用 checkbox 的
状态联动兄弟元素的显示/隐藏。不用 JS 不仅轻量,还能保留在表单提交中(如果需要)或支持键盘空格切换。
常见错误是直接对
或
加
,结果发现点击没反应——因为没绑定 checkbox 的状态变化。必须让 checkbox 是触发源,且目标内容是它的后续兄弟元素(用
或
选择器)。
必须放在每个 FAQ 条目前,并设
要用
属性关联该
,或包裹 checkbox(更稳妥)
被折叠的内容需紧跟在 checkbox 后(同级),用
控制显隐
别忘了加
隐藏原生 checkbox,再用伪元素重绘“箭头”
折叠动画要用
+
,不是
直接写
→
不会动画,因为
无法计算过渡起点终点。
是唯一能平滑过渡的替代方案。
典型坑是设
→
,但内容实际高度超 500px 就会截断;或者忘了配
,导致内容溢出可见。
立即学习
“
前端免费学习笔记(深入)
”;
使用HTML,CSS,JavaScript开发Android应用程序 英文文字pdf版附源文件
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
下载
给折叠容器设
、
、
展开时设一个足够大的
值(如
),确保内容完全可见
不要用
单独做折叠——它不占布局空间,但用户仍可聚焦/操作内部元素
若内容含图片或异步加载,高度可能动态变化,此时 CSS 动画会不准,得换 JS
和
的 DOM 顺序不能错
很多初学者把
放在
外面、或嵌套错层,导致
选择器失效。CSS 里没有“父选择器”,只能靠兄弟/后续兄弟关系驱动。
正确结构必须是:
→
→
(三者同级),或
→
(
包裹
,
紧跟
)。
推荐写法:
这样就能用
精准控制
如果用
,那
必须是
的下一个兄弟,不能写在
内部
移动端点击热区小?给
加
和足够 padding,别只依赖文字区域
无障碍和键盘支持不能靠运气
纯 CSS 方案默认不支持键盘空格/回车切换,也不通知屏幕阅读器状态变化。这不是“锦上添花”,而是基本可用性门槛。
常见疏忽是只写了视觉切换,但
没同步,或者没给
加
,导致键盘用户卡住。
在
上加
和
用
初始化,JS 或伪类配合更新(纯 CSS 无法改属性,需少量 JS 补齐)
若坚持零 JS,至少加
到折叠内容上,并随
切换
别忽略焦点管理:展开后,按 Tab 应能进入
内部可聚焦元素(如链接)
事情说清了就结束。真正难的不是怎么动起来,而是让动得自然、切得准确、读得明白——尤其是当内容高度不固定、屏幕阅读器要报读、用户还习惯按空格的时候。
input[type="checkbox"]:checkedlabeldivdisplay: none~+input[type="checkbox"]idlabelforidinput:checked ~ .answerappearance: nonemax-heightoverflowheightheight: 0height: autoautomax-heightmax-height: 0max-height: 500pxoverflow: hiddenmax-height: 0overflow: hiddentransition: max-height 0.3s ease-outmax-height600pxopacitylabelinputinputlabel~inputlabel.answerinput.answerlabelinput.answerlabel
回答内容input#faq1:checked ~ .answerlabel > input.answerlabellabellabeldisplay: blockaria-expandedlabeltabindex="0"labelrole="button"tabindex="0"aria-expanded="false"aria-hidden="true":checked.answer