You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何不使用Bootstrap,仅用纯CSS实现Accordion手风琴组件?

纯CSS手风琴组件实现方案

下面给你两种纯CSS实现手风琴的可靠方案,全程无需JavaScript:

方案一:利用原生details/summary元素(最简实现)

这是浏览器原生支持的折叠组件,基础功能零额外代码,还能自定义样式适配需求:

<details class="accordion-item">
  <summary class="accordion-header">手风琴标题1</summary>
  <div class="accordion-content">
    这里是展开后的内容,支持任意HTML元素——文本、图片、列表都能放。
  </div>
</details>

<details class="accordion-item">
  <summary class="accordion-header">手风琴标题2</summary>
  <div class="accordion-content">
    原生组件自带键盘交互支持,按Tab可切换面板,Enter能触发展开/收起, accessibility表现更好。
  </div>
</details>

自定义外观的CSS代码:

.accordion-item {
  margin-bottom: 10px;
  border: 1px solid #eee;
  border-radius: 4px;
}

.accordion-header {
  padding: 12px 16px;
  background-color: #f5f5f5;
  cursor: pointer;
  font-weight: 500;
  list-style: none; /* 移除默认三角符号 */
}

/* 自定义展开/收起图标 */
.accordion-header::before {
  content: "+";
  margin-right: 8px;
  transition: transform 0.2s;
}

.accordion-item[open] .accordion-header::before {
  transform: rotate(45deg);
}

.accordion-content {
  padding: 12px 16px;
  border-top: 1px solid #eee;
}

方案二:利用Checkbox伪类(更灵活的交互控制)

如果需要点击面板任意区域都能触发展开/收起,或者更精细的动画控制,可以用隐藏的checkbox做状态触发器:

<div class="accordion-item">
  <input type="checkbox" id="accordion-1" class="accordion-toggle">
  <label for="accordion-1" class="accordion-header">手风琴标题1</label>
  <div class="accordion-content">
    点击标题或面板空白处都能切换状态,适合需要扩大触发范围的场景。
  </div>
</div>

<div class="accordion-item">
  <input type="checkbox" id="accordion-2" class="accordion-toggle">
  <label for="accordion-2" class="accordion-header">手风琴标题2</label>
  <div class="accordion-content">
    可以通过调整max-height数值适配内容高度,实现平滑的展开收起动画。
  </div>
</div>

对应的CSS样式:

.accordion-toggle {
  display: none; /* 隐藏原生checkbox */
}

.accordion-item {
  margin-bottom: 10px;
  border: 1px solid #eee;
  border-radius: 4px;
}

.accordion-header {
  display: block;
  padding: 12px 16px;
  background-color: #f5f5f5;
  cursor: pointer;
  font-weight: 500;
  position: relative;
}

.accordion-header::after {
  content: ">";
  position: absolute;
  right: 16px;
  transition: transform 0.2s;
}

/* 选中状态下切换图标并显示内容 */
.accordion-toggle:checked + .accordion-header::after {
  transform: rotate(90deg);
}

.accordion-content {
  max-height: 0;
  overflow: hidden;
  padding: 0 16px;
  transition: max-height 0.3s, padding 0.3s;
}

.accordion-toggle:checked ~ .accordion-content {
  max-height: 200px; /* 根据实际内容高度调整,现代浏览器可用fit-content */
  padding: 12px 16px;
  border-top: 1px solid #eee;
}

关键注意点

  • 方案一的原生组件自带无障碍支持,适合对兼容性和 accessibility有要求的场景
  • 方案二的max-height过渡需要设置足够覆盖内容的数值,避免截断;现代浏览器也可直接用fit-content
  • 两种方案都能通过CSS快速调整颜色、间距、动画速度,适配不同设计风格

内容的提问来源于stack exchange,提问作者Honcharov Kirill

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 14:10:26