仕様-作成する仕掛けの概要
下記のような仕様で開閉式メニューを作成。
右図がその動作イメージ
仕様
右図がその動作イメージ
仕様
- メニューとサブメニューに分割
右図②の枠線部がメニュー、枠線が無い部分がサブメニュー - サブメニューは既定で非表示
- メニュー項目(枠線内)をクリックすると、そのサブメニューが開く
- 再度、メニュー項目をクリックするとサブメニューを閉じる
- 開閉状態を分かり易くする為に画像を末尾に表示(三角矢印)
閉じている状態開いている状態
- 最上部の「全て展開」をクリックするとサブメニューを全て展開する。右下図③
この時、文言を「折り畳む」に変更 - 同じく「折り畳む」をクリックするとサブメニューを全て折り畳み、
表示文言を既定状態の「全て展開」に変更する。
- メニュー上でマウスポインタも形状を変える(CSS疑似クラス)
- 同じく、背景色を薄い緑に変える(CSS疑似クラス)
- サブメニューはゆっくり下方に開いていく(jQueryの機能)
まずは簡素な構成から順に・・・・
①:既定(初期)状態

②:一部のメニューを開いた状態

③:全て展開した状態

②:一部のメニューを開いた状態

③:全て展開した状態

1.単純サブメニューの開閉
メニュー項目をクリックするとサブメニューが開き、再度のクリックでサブメニューを折り畳みます。
このとき、畳まれている上体では(+)、開いている状態では(-)の文字を、メニュー項目の右端に追加します。
:before擬似クラスと:after擬似クラスの書式
同じく、下記のように画像も追加可
ブロックレベルの要素(DIV等)に:beforeや:afterの擬似要素を使った場合、ブロックレベルに対して追加されます。
このとき、畳まれている上体では(+)、開いている状態では(-)の文字を、メニュー項目の右端に追加します。
実装方法
下記.は、そのスクリプトを使用した場合のHTML例 動作デモ サンプルのダウンロード
①:既定(初期)状態

②:一部のメニューを開く

③:全て展開した状態
<!DOCTYPE HTML> <HTML lang="ja" dir="ltr"> <HEAD> <meta charset="UTF-8"> <SCRIPT src="jquery.min.js"></SCRIPT> <SCRIPT> $(function(){ $("#acMenu div").on("click", function() { $(this).next().slideToggle(); $(this).toggleClass("active"); }); }); </SCRIPT> <STYLE type="text/css"> <!-- #main{ width:600px; margin:50px auto; } #acMenu div{ display:block; cursor:pointer; } #acMenu div +ul{ display:none; } #acMenu div:after{ content: '(+)'; } #acMenu div.active:after{ content: '(-)'; } --> </STYLE> <TITLE>開閉式メニュー</TITLE> </HEAD> <BODY> <DIV id="main"> <DIV id="acMenu"> <DIV>メニュー1</DIV> <UL> <LI>MENU 1</LI> </UL> <DIV>メニュー2</DIV> <UL> <LI>MENU a</LI> <LI>MENU b</LI> </UL> <DIV>メニュー3</DIV> <UL> <LI>MENU x</LI> <LI>MENU y</LI> <LI>MENU z</LI> </UL> </DIV> </DIV> </BODY> </HTML>
①:既定(初期)状態

②:一部のメニューを開く

③:全て展開した状態

動作原理
ID名「acMenu」の子要素「DIV」をクリックされた場合(上右図②:“メニュー2”)、
そのDIVの次の要素「UL」(“MENU 1”)を表示/非表示に切り替えます。
ID名「acMenu」の子要素「DIV」は、行目 $("#acMenu div") で表現
その次のタグは、11行目jQueryの関数.next()で表現。
よって、該当メニューがクリックされた時の処理は下記の様に表せます。
(this はクリックされた要素)
これだけでサブメニューの展開、折り畳みは実現できますが、
展開状態を分かり易くするための工夫が下記。
メニュー文字列の後に、該当メニューが
そのためには、現在の状態を識別する為の何かが必要となり、ここでは、クラス「active」を、その識別とします。
すなわち、クリックされたメニューが
IF文、および
hasClaaa(className):クラスが定義されているかを調べる関数
addClass(className):クラスを追加する
removeClass(className):クラスを削除する
を使って、トグル動作を実現できますが、ここでは、もう少し簡単に、toggleClass()関数を使用します。
関数仕様 toggleClass(className):
これで、指定のクラスが定義されていない場合には、(+)を、
定義されていない場合には、(-)をメニュー項目に付加できます。
その部分が、スタイルシートの31~36行目の部分。
疑似クラスを利用して書式を定義しています。
そのDIVの次の要素「UL」(“MENU 1”)を表示/非表示に切り替えます。
$("#acMenu div").on("click", function() { $(this).next().slideToggle(); $(this).toggleClass("active"); });
ID名「acMenu」の子要素「DIV」は、行目 $("#acMenu div") で表現
その次のタグは、11行目jQueryの関数.next()で表現。
よって、該当メニューがクリックされた時の処理は下記の様に表せます。
(this はクリックされた要素)
$(this).next().slideToggle();
これだけでサブメニューの展開、折り畳みは実現できますが、
展開状態を分かり易くするための工夫が下記。
メニュー文字列の後に、該当メニューが
折り畳まれている場合:(+)を付加
展開されている場合:(-)を付加
します。
展開されている場合:(-)を付加
そのためには、現在の状態を識別する為の何かが必要となり、ここでは、クラス「active」を、その識別とします。
すなわち、クリックされたメニューが
展開されている場合:クラス「active」を定義
折り畳まれている場合:定義されていない
とします。折り畳まれている場合:定義されていない
IF文、および
hasClaaa(className):クラスが定義されているかを調べる関数
addClass(className):クラスを追加する
removeClass(className):クラスを削除する
を使って、トグル動作を実現できますが、ここでは、もう少し簡単に、toggleClass()関数を使用します。
関数仕様 toggleClass(className):
該当要素にclassNameがあればclassNameを削除し、無ければ追加
これで、指定のクラスが定義されていない場合には、(+)を、
定義されていない場合には、(-)をメニュー項目に付加できます。
その部分が、スタイルシートの31~36行目の部分。
疑似クラスを利用して書式を定義しています。
#acMenu div:after{ content: '(+)'; } #acMenu div.active:after{ content: '(-)'; }
疑似クラスを用いた文字の追加
要素名:before {
プロパティ: 値;
}
要素名:after {
プロパティ: 値;
}
※注:IE6,IE7では未サポート。
文字列を前後に付加する場合、contentプロパティを使用して、下記のように記述プロパティ: 値;
}
要素名:after {
プロパティ: 値;
}
※注:IE6,IE7では未サポート。
p:before { /* 前に付加 */
content: "[追加する文字列]";
}
p:after { /* 後ろに付加 */
content: "[追加する文字列]";
}
content: "[追加する文字列]";
}
p:after { /* 後ろに付加 */
content: "[追加する文字列]";
}
同じく、下記のように画像も追加可
p:after {
content: url("img/sample.png");
}
content: url("img/sample.png");
}
ブロックレベルの要素(DIV等)に:beforeや:afterの擬似要素を使った場合、ブロックレベルに対して追加されます。
2.全てを展開/折り畳む
全てを展開、または折り畳めるようにします。 動作デモ サンプルのダウンロード
全てを展開/折り畳むには、前項の tggle を使用することはできません。
全体をトグル動作させると、一部が展開されている場合、展開されているものは畳まれ、畳まれているものは展開、
という、奇妙な動作が起きてしまいます。
よって、現在の状態を記憶しておき、「全てを展開」をクリックされ場合、現在の状態が
・畳まれている状態→サブメニューを全て表示(display:block;)
・全て展開されている状態→サブメニューを全て非表示(display:none;)
とします。ソースの16~29行目
現在の状態は、「全てを展開」」の要素(ID="expandAll")にクラス(Active)が定義されているか否かで判定。
定義されているかの判定は、hasClaaa(className)関数(戻り値:true/false)
クラスの追加/削除は、 addClass(className)、removeClass(className)関数を使用。
(toggleClass(ClassName)を使用しても可)
①:既定(初期)状態

②:全て展開した状態
全てを展開/折り畳むには、前項の tggle を使用することはできません。
全体をトグル動作させると、一部が展開されている場合、展開されているものは畳まれ、畳まれているものは展開、
という、奇妙な動作が起きてしまいます。
よって、現在の状態を記憶しておき、「全てを展開」をクリックされ場合、現在の状態が
・畳まれている状態→サブメニューを全て表示(display:block;)
・全て展開されている状態→サブメニューを全て非表示(display:none;)
とします。ソースの16~29行目
現在の状態は、「全てを展開」」の要素(ID="expandAll")にクラス(Active)が定義されているか否かで判定。
定義されているかの判定は、hasClaaa(className)関数(戻り値:true/false)
クラスの追加/削除は、 addClass(className)、removeClass(className)関数を使用。
(toggleClass(ClassName)を使用しても可)
<!DOCTYPE HTML> <HTML lang="ja" dir="ltr"> <HEAD> <meta charset="UTF-8"> <SCRIPT src="jquery.min.js"></SCRIPT> <SCRIPT> $(function(){ $("#acMenu div").on("click", function() { $(this).next().slideToggle(); $(this).toggleClass("active"); }); }); function foldItem(menu,subMenu){ /* 全て展開⇔折り畳む をトグル実行 */ if($(menu).hasClass("active")){ $(subMenu).next().slideUp('normal'); /* 全て畳む */ $(menu).add(subMenu).removeClass('active'); /* active削除 */ $(menu).text('全て展開'); }else{ $(subMenu).next().slideDown('normal'); /* 全て展開 */ $(menu).add(subMenu).addClass('active'); /* active追加 */ $(menu).text('折り畳む'); } } </SCRIPT> <STYLE type="text/css"> <!-- #main{ width:600px; margin:50px auto; } #acMenu div,#expandMenu{ display:block; cursor:pointer; } #acMenu div +ul{ display:none; } #acMenu div:after,#expandMenu:after{ content: '(+)'; } #acMenu div.active:after,#expandMenu.active:after{ content: '(-)'; } --> </STYLE> <TITLE>開閉式メニュー</TITLE> </HEAD> <BODY> <DIV id="main"> <DIV><SPAN>メニュー</SPAN><SPAN id="expandMenu" onclick='foldItem(this,"#acMenu>div")'>全て展開</SPAN></DIV> <BR> <DIV id="acMenu"> <DIV>メニュー1</DIV> <UL> <LI>MENU 1</LI> </UL> <DIV>メニュー2</DIV> <UL> <LI>MENU 1</LI> <LI>MENU 2</LI> </UL> <DIV>メニュー3</DIV> <UL> <LI>MENU 1</LI> <LI>MENU 2</LI> <LI>MENU 3</LI> </UL> </DIV> </DIV> </BODY> </HTML>
①:既定(初期)状態

②:全て展開した状態

3.開閉状態を画像で表示
少し、装飾を施して実践的にしたもの 動作デモ サンプルのダウンロード
<!DOCTYPE HTML> <HTML lang="ja"> <HEAD> <meta charset="UTF-8"> <meta name="GENERATOR" content="JustSystems Homepage Builder Version 18.0.0.1 Trial for Windows"> <SCRIPT src="jquery.min.js"></SCRIPT> <script> $(function(){ $('#acMenu div').on('click', function() { $(this).next().slideToggle(); $(this).toggleClass("active"); }); }); function foldItem(menu,subMenu){ /* 全て展開⇔折り畳む をトグル実行 */ if($(menu).hasClass("active")){ $(subMenu).next().slideUp('normal'); /* 全て畳む */ $(menu).add(subMenu).removeClass('active'); /* active削除 */ $(menu).text('全て展開'); }else{ $(subMenu).next().slideDown('normal'); /* 全て展開 */ $(menu).add(subMenu).addClass('active'); /* active追加 */ $(menu).text('折り畳む'); } } </script> <STYLE type="text/css"> <!-- #main{ /* 全体 中央揃え */ width:600px; margin:20px auto; } #acMenu,#expandMenu{ color:green; } #acMenuTitle{ /* リストメニュータイトル */ width:300px; margin-bottom:5px; } #acMenu{ /* リストメニュー */ margin-top:0; font-size:x-large; } #acMenu div{ /* リスト項目の形状 */ display:block; width:300px; border-width : 1px;border-style : solid; /* 枠線付き */ } #acMenu div:hover,#expandMenu:hover{ background-color:#ddffdd; cursor:pointer; /* マウスポインタ形状 */ } #acMenu div +ul{ display:none; /* メニュー項目は既定で非表示 */ } #acMenu div ul,li{ padding:0; margin:0; /* リスト、サブ項目の余白無し */ } #acMenu div:after,#expandMenu:after{ /* 直後に下向き矢印追加 */ padding-left:5px; content:url(btn_expand.gif); } #acMenu div.active:after,.active#expandMenu:after{ /* 直後に上向き矢印追加 */ padding-left:5px; content:url(btn_fold.gif); } --> </STYLE> <TITLE>開閉式メニュー</TITLE> </HEAD> <BODY> <DIV id="main"> <DIV> <SPAN id="acMenuTitle">メニュー</SPAN> <span id="expandMenu" onclick='foldItem(this,"#acMenu>div")'>全て展開</SPAN> </DIV> <DIV id="acMenu"> <DIV>便利ツール</DIV> <ul> <li><a href="https://mt-soft.sakura.ne.jp/web_dl/petit_tool/mrecorder/" target="_blank">マウスレコーダー</a></li> <li><a href="https://mt-soft.sakura.ne.jp/web_dl/petit_tool/fRename/" target="_blank">ファイル名一括変更</a></li> <li><a href="https://mt-soft.sakura.ne.jp/web_dl/petit_tool/clickcapture/" target="_blank">クリックキャプチャー</a></li> <li><a href="https://mt-soft.sakura.ne.jp/web_dl/petit_tool/get_string/" target="_blank">ポイント位置の文字列取得</a></li> </ul> <DIV>おもしろページ</DIV> <ul> <li><a href="https://mt-soft.sakura.ne.jp/link/tool/index_route.html" target="_blank">無料WEB地図</a></li> <li><a href="https://mt-soft.sakura.ne.jp/link/igo/index_2.html" target="_blank">独習WEB詰碁</a></li> <li><a href="https://mt-soft.sakura.ne.jp/kyozai/" target="_blank">独習エクセル教材</a></li> <li><a href="https://mt-soft.sakura.ne.jp/link/cat/" target="_blank">おもしろ可愛い猫GIF</a></li> </ul> <DIV>シフト表自動作成ツール</DIV> <ul> <li><a href="https://mt-soft.sakura.ne.jp/web_dl/common/shift_hikaku/" target="_blank">機能比較表</a></li> <li><a href="https://mt-soft.sakura.ne.jp/web_dl/free_shift/" target="_blank">ふりーシフト君</a></li> <li><a href="https://mt-soft.sakura.ne.jp/web_dl/shift_kun/" target="_blank">シフト君</a></li> <li><a href="https://mt-soft.sakura.ne.jp/web_dl/shift_auto/" target="_blank">勤務シフトスケジューラー</a></li> <li><a href="https://mt-soft.sakura.ne.jp/web_dl/excel_shift/help_excel/" target="_blank">エクセル勤務シフト</a></li> </ul> </DIV> </DIV> </BODY> </HTML>
①:既定(初期)状態

②:一部のメニューを開く

③:全て展開した状態

②:一部のメニューを開く

③:全て展開した状態

4.関連ページ