本文中の目次を折りたたみ表示する方法

Cocoonカスタマイズ集
この記事は約5分で読めます。
記事内に広告が含まれています。

記事に記載したコードは、スキンに追加されています。

はじめに

Cocoon設定
設定大項目項目設定値
目次目次の表示目次を表示するオン
表示ページ

表1の設定を適用すると、本文中の目次が折りたたみ表示に切り替わります。

設定に応じて、指定した見出しHn以降を非表示にし、見出しの行数を超えた部分を折りたたみます。
ボタンをクリックすると、非表示になっていた見出しが展開されて表示される仕組みです。

この記事では、この方法について詳しく説明します。

見出しH3以降非表示とする方法

完成イメージ

実装手順

以下の手順で実装します。

  • ラベル
    JavaScriptを追加

    以下のコードをjavascript.jsに追加します。

    jQuery(function ($) {
      // もっと見るボタンのHTMLを設定
      const button = '<div class="toc__more"></div>';
    
      // 折りたたみ対象とする目次の階層を設定
      const DEPTH = 3;
    
      // 記事メインエリア内にある目次コンテナを取得
      $('.main .toc-content').each(function () {
        const $content = $(this);
    
        // 指定した階層以降にあるリスト項目を取得
        const $targets = $content.find('li').filter(function () {
          // 現在の項目より上位にあるリスト項目の数を取得
          return $(this).parentsUntil($content, 'li').length >= DEPTH - 1;
        });
    
        // 折りたたみ対象が存在しない場合は処理対象外
        if (!$targets.length) {
          return;
        }
    
        // 折りたたみ対象を初期状態で非表示に設定
        $targets.hide();
    
        // 目次の末尾にもっと見るボタンを登録
        const $btn = $(button).appendTo($content);
    
        // もっと見るボタンのクリックイベントを登録
        $btn.on('click', function () {
          // ボタンの開閉状態を active クラスで変更
          $btn.toggleClass('active');
    
          // active の状態に合わせて対象項目を表示・非表示
          $targets.toggle($btn.hasClass('active'));
        });
      });
    });
  • ラベル
    CSSを追加

    以下のコードをstyle.cssに追加します。

    .toc__more {
      border: 1px solid #ccc;
      cursor: pointer;
      display: grid;
      height: 20px;
      padding: 2px;
      place-content: center;
      width: 100%;
    
      &::before {
        color: #ccc;
        content: '\f078';
        display: block;
        font-family: 'Font Awesome 5 Free';
        font-size: 5px;
        font-weight: bold;
      }
    
      &.active::before {
        content: '\f077';
      }
    }

見出し11行以降非表示とする方法

完成イメージ

実装手順

以下の手順で実装します。

  • ラベル
    JavaScriptを追加

    以下のコードをjavascript.jsに追加します。

    jQuery(function ($) {
      // もっと見るボタンのHTMLを設定
      const button = '<div class="toc__more"></div>';
    
      // 折りたたみ対象とする目次の項目数を設定
      const limit = 10;
    
      // 記事メインエリア内にある目次コンテナを取得
      $('.main .toc-content').each(function () {
        const $content = $(this);
    
        // 目次内にあるリスト項目を取得
        const $items = $content.find('li');
    
        // 目次の項目数を取得
        const count = $items.length;
    
        // 項目数が指定した制限を超えていない場合は処理対象外
        if (count <= limit) {
          return;
        }
    
        // 制限数以降の項目を取得
        const $targets = $items.slice(limit);
    
        // 折りたたみ対象を初期状態で非表示に設定
        $targets.hide();
    
        // 目次の末尾にもっと見るボタンを登録
        const $btn = $(button).appendTo($content);
    
        // もっと見るボタンのクリックイベントを登録
        $btn.on('click', function () {
          // ボタンの開閉状態を active クラスで変更
          $btn.toggleClass('active');
    
          // active の状態に合わせて対象項目を表示・非表示
          $targets.toggle($btn.hasClass('active'));
        });
      });
    });
  • ラベル
    CSSを追加

    前述のコードをstyle.cssに追加します。

さいごに

今回紹介した方法を使えば、本文中の目次を見出しの深さや行数に応じて簡単に折りたたみ表示に切り替えることができます。
ユーザーにとって読みやすく、コンパクトな目次を提供することで、コンテンツの可読性やユーザー体験を向上させることができます。

タイトルとURLをコピーしました