クリックで開閉する多階層ツリー型リストの作り方
2016年08月23日

クリックで開閉する多階層ツリー型リストの作り方

今まで、上のメニューバーの「MENU」をクリックすると、サイドバーのカテゴリーツリーの位置まで飛ぶようになっていたのですが、これだとカテゴリーツリーを見る前に「急に画面がスクロールした、何だったんだろう」で終わってしまう方もいらっしゃるかも知れないと思い、本日別途メニューのページを作成しました。

こちらです! →メニュー

自動的に生成しているカテゴリーツリーと違い、カテゴリー編成を変えたらこちらも変えなければならないので注意が必要ですが、見る人によっては「ごちゃごちゃしている」と感じられるかも知れないサイドバーのカテゴリーツリーよりは、シンプルではありますが明快な外観になったのではないかと思います。

見た目はシンプルなのですが、サイト制作についてそんなに詳しくない僕のような人間にとっては、これを作るのも結構一苦労だったりします^^;


リストの中にリストを作る


まず、大カテゴリーの中に中カテゴリー、その中に小項目といったように、リストの中にリストを作る方法。

普通のリストはこうですね。
  • AAAAA
  • BBBBB
  • CCCCC

【HTML】
<ul>
<li>AAAAA</li>
<li>BBBBB</li>
<li>CCCCC</li>
</ul>

それを、こうするだけです。
  • AAAAA
  • BBBBB
    • 項目1
    • 項目2
    • 項目3
  • CCCCC
    • サブカテゴリー1
      • 項目1
      • 項目2
    • サブカテゴリー2
      • 項目1
      • 項目2

【HTML】
<ul>

<li>AAAAA</li>

<li>BBBBB
    <ul>  
    <li>項目1</li>
    <li>項目2</li>
    <li>項目3</li>
    </ul>
</li>

<li>CCCCC
    <ul>
    <li>サブカテゴリー1
        <ul>
        <li>項目1</li>
        <li>項目2</li>
        </ul>
    </li>
    <li>サブカテゴリー2
        <ul>
        <li>項目1</li>
        <li>項目2</li>
        </ul>
    </li>
    </ul>
</li>

</ul>

要するに、親カテゴリーの<li>と</li>の間に、またリストのHTMLタグを挟んでいけばいいんです。


リストのマークを消す方法


普通、リストのHTMLタグ(<ul>や<li>)を使うと、自動的に「マーカー」と呼ばれる記号がつきます。(※このサイトでは、スマホ版ではマークがつかない仕様になっています)

しかし、これがあると、自由にマークをつけることができません。
メニューのページのリストは、リストマークが◇であったり▼であったり⇒であったり、ばらばらですよね。こうした方が分かりやすいと思ったので、デフォルトのマークを消して、マークは手動で入れていきました。

<ul>を<ul style="list-style-type: none">にすると、マーカーが表示されなくなります。

なくすだけじゃなくて、何種類かの中からマークを選ぶこともできます。
詳細:スタイルシート[CSS]/リスト/マーカーの種類を指定する - TAG index Webサイト


リストの中の文字にリンクを張る


これは説明するまでもないと思いますが、リストの中の文字にリンクのタグをつけるだけです。


クリックで開閉する折りたたみメニューの作り方


こちらのサイトで紹介されている方法を、そのまま利用しました。
クリックすると展開表示する"折りたたみメニュー"をホームページに簡単に作る方法 | ふかふか交易所


リストタグとクリック開閉タグを併用する!


ここまでで紹介したHTMLタグを組み合わせると、クリックで開閉する多階層ツリー型リストを作ることができます。

※通常リンクのところは、今はリンク先がないので無反応です。

【HTML】
<ul style="list-style-type: none">

<li><a href="">◆ AAAAA(通常リンク)</a></li>

<li>

<!-- 折り畳み展開ポインタ1 -->
<div onclick="obj=document.getElementById('open1').style; obj.display=(obj.display=='none')?'block':'none';">
<a style="cursor:pointer;">▼ BBBBB(クリックで展開)</a>
</div>
<!--// 折り畳み展開ポインタ1 -->

    <!-- 折り畳まれ部分1 -->
    <div id="open1" style="display:none;clear:both;">
    <ul style="list-style-type: none">

    <li><a href="">◇ 小項目なし(通常リンク)</a></li>

    <li>

    <!-- 折り畳み展開ポインタ1 -->
    <div onclick="obj=document.getElementById('open2').style; obj.display=(obj.display=='none')?'block':'none';">
    <a style="cursor:pointer;">▽ 小項目あり(クリックで展開)</a>
    </div>
    <!--// 折り畳み展開ポインタ2 -->

        <!-- 折り畳まれ部分2 -->
        <div id="open2" style="display:none;clear:both;">
        <ul style="list-style-type: none">
        <li><a href="">・ 項目1(通常リンク)</a></li>
        <li><a href="">・ 項目2(通常リンク)</a></li>
        </ul>
        </div>
        <!--// 折り畳まれ部分2 -->

    </li>
    </ul>

    </div>
    <!--// 折り畳まれ部分1 -->

</li>
</ul>

こちらのサイトでも説明してくださっていますが、
<div onclick="obj=document.getElementById('ここ').style; obj.display=(obj.display=='none')?'block':'none';">

<div id="ここ" style="display:none;clear:both;">
のIDは、開閉部分を作るたびに新しく自分で任意の文字列を入れる必要があります。

デフォルトの「open」のまま使い回してしまうと、どこをクリックしても1番上の開閉部分だけが開閉するようになってしまうのでご注意ください!


スマホ用サイトにも有効


もっとスマートなやり方があるとは思いますが、HTMLだけで完結するというところが、初心者にとっては分かりやすくていいと思いました。

元々、今回こういうメニューを作ろうと思い立ったのは、スマホ版でのデフォルトのメニューが、このブログに適していなかったためです。(カテゴリー名が長すぎて表示できていませんでした^^;)

つまり、スマホ版用に作ったメニューをPC版に逆輸入したということです。
スマホでもPCでも問題なく動いています!
お悩みの方はぜひ試してみてください^^
スポンサーリンク
クリックで開閉する多階層ツリー型リストの作り方
先月の人気記事 TOP5