アコーディオンプラグイン - ulバージョン
入れ子になった ul要素でのアコーディオンです。Webサイトのサイドバーなどでよく利用される UIです。
オプション
- speed : アニメーションのスピード
- easing : Easing のエフェクト
- activeClass : アクティブな li要素に付けるクラス
- iconClass : アイコンとなる span要素に付けるクラス
最初から開いておきたいサブメニュー(ul要素)の親となる li要素に、アクティブなクラスを付けておきます。
jQuery Code
<script src="../js/jquery.easing.1.3.js"></script>
...省略 ...
(function($){
$.fn.jqueryUlAccordion = function(options){
/* オプションの設定 */
options = $.extend({
/* アニメーションのスピード */
speed: "fast",
/* Easing のエフェクト */
easing: "jswing",
/* アクティブな li要素に付けるクラス */
activeClass: "active",
/* アイコンとなる span要素に付けるクラス */
iconClass: "icon"
}, options);
this.each(function(){
/* アクティブなli直下のul以外のulを非表示 */
$('ul:not(".' + options.activeClass + ' > ul")', this).hide();
/* ul(サブメニュー)を内包しているli直下のa */
$("li:has(ul) > a", this)
/* アイコン用のspanを挿入 */
.prepend('<span class="' + options.iconClass + '"></span>')
.click(function(){
/* aの親であるliがアクティブなら処理なし */
if( $(this).parent("li").attr("class") == options.activeClass ){
return false;
}
/* 祖先のulを全て取得し、:firstで最初のul(つまり直近のul)を変数に */
var parentUl = $(this).parents("ul:first");
/* liからアクティブなクラスを削除 */
parentUl.find("li").removeClass( options.activeClass );
/* クリックされたaの親となるliにアクティブクラスを付ける */
$(this).parent("li").addClass( options.activeClass );
/* サブメニューが非表示なら */
if( $("+ ul", this).css("display") == "none" ){
/* 同じ階層のulを閉じる(Easingあり) */
parentUl.find("ul").slideUp(options.speed, options.easing);
/* クリックされたaのサブメニューを開く(Easingあり)*/
$("+ ul", this).slideDown(options.speed, options.easing);
}
return false;
});
});
return this;
}
})(jQuery);
jQuery(function($) {
$("#accordion").jqueryUlAccordion({
/* アニメーションのスピードを500に設定 */
speed: 500,
/* EasingのエフェクトをeaseInOutBackに */
easing: "easeInOutBack"
});
});