查看: 110|回复: 1

HTML5 details标签:用纯HTML+CSS实现无JS展开收缩交互

[复制链接]
发表于 3 小时前 | 显示全部楼层 |阅读模式
在传统的前端开发中,实现展开/收缩区域通常依赖JavaScript监听点击事件,控制元素的display或height。HTML5引入的details标签提供了一种纯声明式的解决方案,无需任何脚本即可实现可折叠内容区域。配合summary标签定义标题,用户点击标题时内部内容自动展开或收起,浏览器原生支持,且可以完全通过CSS自定义样式。
  1. <details>
  2.   <summary>标题</summary>
  3.   <p>内容…</p>
  4. </details>
复制代码

默认情况下details处于收起状态,添加open属性后页面加载时即展开:
  1. <details open>
  2.   <summary>标题</summary>
  3.   <p>内容…</p>
  4. </details>
复制代码

1. 基础样式优化
浏览器默认的details样式较为简陋,三角符号不美观,布局也缺乏间距。可通过CSS覆盖默认外观:
  1. details {
  2.   overflow: hidden;
  3.   background: #e3e3e3;
  4.   margin-bottom: 10px;
  5. }
  6. details summary {
  7.   cursor: pointer;
  8.   padding: 10px;
  9.   width: fit-content;
  10. }
复制代码

2. 控制三角符号方向
利用direction属性可以调整标题文字从右到左,同时配合::marker伪元素改变三角符号颜色:
  1. details summary {
  2.   direction: rtl;
  3.   width: fit-content;
  4. }
  5. details ::marker {
  6.   direction: ltr;
  7.   color: gray;
  8. }
复制代码

3. 完全自定义三角符号
如果希望隐藏原生三角并替换为自定义图标,可以将::marker字号设为0,然后使用summary::after添加自定义内容:
  1. details summary {
  2.   width: fit-content;
  3.   height: 20px;
  4.   line-height: 20px;
  5. }
  6. details ::marker {
  7.   font-size: 0;
  8. }
  9. summary::after {
  10.   content: '▶';
  11.   margin-left: .5ch;
  12.   position: absolute;
  13.   transition: transform .2s;
  14. }
  15. details:not([open]) summary::after {
  16.   transform: rotate(90deg);
  17. }
复制代码

当details未展开时,自定义三角旋转90度(例如▶变成▶旋转),用户点击展开后恢复原本方向,形成视觉反馈。

4. 实际交互案例:纯CSS悬浮菜单
利用details模拟下拉菜单,配合summary悬停或打开状态,无需JS即可实现点击显示浮层效果:
  1. nav {
  2.   background: #eee;
  3.   padding-left: 40px;
  4. }
  5. details summary {
  6.   width: fit-content;
  7.   padding: 5px 28px;
  8.   height: 28px;
  9.   line-height: 28px;
  10. }
  11. [open] summary,
  12. details summary:hover {
  13.   background-color: #fff;
  14.   box-shadow: inset 1px 0 #eee, inset -1px 0 #eee;
  15. }
  16. details ::marker {
  17.   font-size: 0;
  18. }
  19. summary::after {
  20.   content: '▼';
  21.   margin-left: .3ch;
  22.   color: grey;
  23.   position: absolute;
  24.   transition: transform .2s;
  25. }
  26. details:not([open]) summary::after {
  27.   transform: rotate(-90deg);
  28. }
  29. /* 打开时生成全屏遮罩,便于点击外部关闭 */
  30. [open] summary::before {
  31.   content: '';
  32.   position: fixed;
  33.   top: 0;
  34.   bottom: 0;
  35.   left: 0;
  36.   right: 0;
  37. }
  38. .box {
  39.   position: absolute;
  40.   min-width: 120px;
  41.   border: 1px solid #ddd;
  42.   border-top: 0;
  43.   box-sizing: border-box;
  44. }
  45. .box div{
  46.   padding: 8px 10px;
  47.   cursor: pointer;
  48. }
  49. .box div:hover{
  50.   background: #eee;
  51. }
  52. .box div sup{
  53.   display: inline-block;
  54.   width: 18px;
  55.   height: 18px;
  56.   text-align: center;
  57.   line-height: 18px;
  58.   border-radius: 50%;
  59.   color: #fff;
  60.   background: #d50000;
  61. }
复制代码

HTML结构如下:
  1. <nav>
  2.   <details open>
  3.     <summary>我的消息</summary>
  4.     <div class="box">
  5.       <div>我的私信<sup>12</sup></div>
  6.       <div>我的回答</div>
  7.       <div>我的关注</div>
  8.     </div>
  9.   </details>
  10. </nav>
复制代码

此例中,summary悬停或点击时显示浮层,利用[open]选择器控制样式,summary::before作为全屏虚层使得点击外部任意区域即可关闭浮层(因为点击虚层并不会触发任何事件,但点击虚层会使得details失去焦点?实际需结合focus或blur,但此处使用open属性与点击行为相关,浏览器默认点击summary会切换open状态,点击其他区域不会改变,所以需要额外逻辑。上述代码中的before遮罩是为了阻止点击其他元素时不会触发其他行为,但并不能自动关闭details。更完善的方案可以通过CSS伪元素模拟,但真正关闭仍需点击summary。不过对于简单的演示,可以满足点击summary切换。如果希望点击外部关闭,可以结合JavaScript或更复杂的CSS技巧。但作为无JS方案,此示例展示了自定义下拉框的视觉样式,实际交互可参考类似思路。)

需要注意的是,details中的open属性由浏览器内置行为控制:点击summary切换open状态,其他元素无法通过纯CSS强制修改open状态。不过借助[open]选择器和伪元素,可以构建出丰富的交互样式,适用于导航菜单、FAQ折叠区、设置面板等常见场景。
回复

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: HTML5 details标签:用纯HTML+CSS实现无JS展开收缩交互

感谢楼主的分享,这个 `details` 标签的用法整理得很全面。以前我都是靠 JS 来写折叠菜单,看到纯 CSS 就能实现确实省心不少。特别是那个用 `::marker` 隐藏原生三角、再用 `::after` 自定义旋转的方案,感觉很巧妙。 不过最后一个“悬浮菜单”的例子,我看了下代码:`summary::before` 全屏遮罩虽然能挡住点击其他元素,但确实不能自动关闭 `details`,因为浏览器默认只有点击 `summary` 才会切换 `open`。如果想让点击遮罩(即点击 `details` 外部)也能收起,有没有纯 CSS 的 hack 能实现?还是说这里必须配合 JS 监听失焦或点击事件?楼主提到的“更复杂的 CSS”大概是什么思路?期待进一步探讨。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-6-10 19:04 , Processed in 0.025793 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部