jQuery Accordion

手风琴(Accordion)是一种"多个面板一次只展开一个"的折叠菜单,常见于 FAQ、侧边栏分类、帮助中心。它能有效节省页面空间,用 jQuery 的 slide 动画几十行即可实现,也能直接用 jQuery UI 现成的 accordion 组件。本节先讲原理,再把它封装成可复用的 $.fn.accordion 插件。

1. 页面结构

先搭好 HTML 与最小 CSS:每个面板由标题 h3 与内容区 .body 组成,初始全部收起:

<style>
.acc { width: 340px; }
.acc h3 { margin: 0; padding: 8px; background: #eee; cursor: pointer; }
.acc .body { display: none; padding: 10px; border: 1px solid #ccc; }
</style>
<div class="acc">
  <h3>jQuery 是什么</h3>
  <div class="body">jQuery 是一个快速小巧的 JavaScript 库。</div>
  <h3>为什么要学 jQuery</h3>
  <div class="body">选择器、动画、AJAX 都更简洁高效。</div>
</div>

2. 展开与收起逻辑

点标题时:本面板内容滑开/收起,兄弟面板的内容全部收起:

$(".acc h3").click(function () {
  var $next = $(this).next(".body");                 // 本面板内容区
  $next.stop().slideToggle(200);                     // 自身展开或收起
  $(this).siblings(".body").not($next).stop().slideUp(200);  // 收起其它面板
});
// 效果:点"jQuery 是什么"展开第一块;再点"为什么要学 jQuery"时,
// 第二块展开、第一块自动收起——同一时刻只展开一个面板

3. 封装成 $.fn.accordion 插件

把逻辑封装为插件并支持选项,页面里只需一行初始化。标准插件写法:$.extend 合并默认选项、return this 支持链式调用:

$.fn.accordion = function (options) {
  options = $.extend({ speed: 200 }, options);
  this.find("h3").click(function () {
    var $next = $(this).next(".body");
    $next.stop().slideToggle(options.speed);
    $(this).siblings(".body").not($next).stop().slideUp(options.speed);
  });
  return this;
};

$(".acc").accordion({ speed: 300 });
// 效果:与第 2 节一致,但页面中任意多个 .acc 容器都只需一行初始化

4. 常用变体与现成组件

  • 默认展开第一项:HTML 中给第一个 .body 去掉 display:none,或初始化后触发一次 click;
  • 只开不关:把 slideToggle 换成 slideDown,任何时刻都可多面板展开;
  • 生产项目推荐 jQuery UI:$("#acc").accordion({ collapsible: true }),自带键盘操作与 ARIA 无障碍支持,不必自己处理动画细节。

5. 性能注意

  • 快速连点时用 .stop() 清空动画队列,避免面板"卡在半开";
  • 内容多、面板多时优先 display 切换(show/hide)而非滑动动画,减少重排开销。

小结

手风琴的核心是"展开自身、收起兄弟",配合 stop() 防止动画排队;封装为 $.fn.accordion 后可处处复用,追求无障碍与省心时直接用 jQuery UI 的 accordion 更佳。

笔记加载中…