在网页开发中,内容折叠功能是非常实用的交互设计,能够有效节省页面空间,让用户可以按需查看感兴趣的内容。HTML本身提供了原生方案实现折叠面板,同时也可以通过结合CSS和JavaScript实现更定制化的效果。

原生HTML实现折叠面板
HTML5新增的<details>和<summary>标签是原生实现折叠功能的核心,不需要额外编写JavaScript代码就能实现基础的展开收起效果。
基础用法
<details>标签用于包裹可折叠的内容,<summary>标签则是折叠面板的标题部分,点击标题就能切换内容的显示和隐藏状态。
<details>
<summary>点击查看基础信息</summary>
<p>这里是折叠面板的内容区域,默认情况下是隐藏的,点击标题后会展开显示。</p>
<ul>
<li>列表项1</li>
<li>列表项2</li>
<li>列表项3</li>
</ul>
</details>
默认展开设置
如果需要让折叠面板默认处于展开状态,只需要给<details>标签添加open属性即可。
<details open> <summary>默认展开的折叠面板</summary> <p>这个面板在页面加载时就会直接显示内容,不需要用户点击操作。</p> </details>
自定义样式优化
原生的<details>标签样式比较朴素,我们可以通过CSS自定义折叠面板的外观,让它更符合项目的设计风格。
修改标题样式
可以通过CSS选择器选中<summary>标签,调整它的背景色、内边距、鼠标样式等属性。
/* 自定义summary标题样式 */
details summary {
padding: 12px 16px;
background-color: #f5f5f5;
cursor: pointer;
border-radius: 4px;
font-weight: bold;
transition: background-color 0.2s;
}
details summary:hover {
background-color: #e8e8e8;
}
修改内容区域样式
折叠面板的内容区域也可以通过CSS调整内边距、边框等属性,让整体布局更美观。
/* 自定义内容区域样式 */
details:not([open]) summary {
border-radius: 4px;
}
details[open] summary {
border-radius: 4px 4px 0 0;
}
details > p, details > ul {
padding: 12px 16px;
margin: 0;
border: 1px solid #f5f5f5;
border-top: none;
border-radius: 0 0 4px 4px;
}
结合JavaScript实现复杂交互
如果需要实现多个折叠面板互斥展开、动态控制折叠状态等复杂功能,就需要结合JavaScript来操作。
多个面板互斥展开
下面的示例实现了同一组折叠面板中,只能有一个处于展开状态的效果,点击新的面板时,之前展开的面板会自动收起。
<div class="accordion">
<details class="accordion-item">
<summary>面板1</summary>
<p>面板1的内容</p>
</details>
<details class="accordion-item">
<summary>面板2</summary>
<p>面板2的内容</p>
</details>
<details class="accordion-item">
<summary>面板3</summary>
<p>面板3的内容</p>
</details>
</div>
<script>
// 获取所有折叠面板
const accordionItems = document.querySelectorAll('.accordion-item');
accordionItems.forEach(item => {
// 给每个面板的summary添加点击事件
item.querySelector('summary').addEventListener('click', function(e) {
// 阻止默认行为,避免原生toggle冲突
e.preventDefault();
// 先关闭所有面板
accordionItems.forEach(otherItem => {
if (otherItem !== item) {
otherItem.removeAttribute('open');
}
});
// 切换当前面板的展开状态
if (item.hasAttribute('open')) {
item.removeAttribute('open');
} else {
item.setAttribute('open', '');
}
});
});
</script>
动态控制折叠状态
也可以通过JavaScript方法动态控制折叠面板的展开和收起,比如根据接口返回的数据自动展开对应面板。
// 展开指定id的折叠面板
function openAccordion(id) {
const target = document.getElementById(id);
if (target && target.tagName.toLowerCase() === 'details') {
target.setAttribute('open', '');
}
}
// 收起指定id的折叠面板
function closeAccordion(id) {
const target = document.getElementById(id);
if (target && target.tagName.toLowerCase() === 'details') {
target.removeAttribute('open');
}
}
// 调用示例:展开id为panel1的面板
// openAccordion('panel1');
实现方案对比
不同的实现方案有不同的适用场景,下面是各方案的优缺点对比:
| 实现方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 原生details+summary | 无需JS,代码简洁,兼容性好 | 样式自定义受限,交互能力弱 | 简单的基础折叠需求 |
| 原生标签+CSS | 样式可高度定制,保持原生交互 | 需要额外编写CSS代码 | 需要自定义外观的基础折叠需求 |
| 原生标签+JS | 可实现复杂交互逻辑 | 需要编写JS代码,增加开发成本 | 互斥展开、动态控制等复杂需求 |
注意事项
<details>标签的兼容性较好,现代浏览器都支持,如果需要兼容非常老的浏览器版本,建议使用JavaScript模拟实现。- 自定义样式时,不要过度修改
<summary>的默认交互行为,避免影响用户体验。 - 如果折叠内容较多,建议给内容区域设置最大高度,避免出现布局错乱的问题。
HTML折叠面板details标签summary标签JavaScript修改时间:2026-07-18 05:33:45