「タグクラウド」ウィジェットをタグ数で折りたたみ表示する方法

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

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

はじめに

「タグクラウド」ウィジェットをタグ数で折りたたみ表示に変更します。

サイドバーに「タグクラウド」ウィジェットを配置した際、タグが多すぎると表示が見づらくなることがあります。

そこで、上位10件のタグのみを表示し、残りのタグは非表示にします。
ボタンをクリックすると、非表示のタグが表示される仕組みです。

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

完成イメージ

実装手順

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

  • ラベル
    JavaScriptを追加

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

    jQuery(function ($) {
      // 折りたたみ対象とするタグの項目数を設定
      const n = 10;
    
      // もっと見るボタンのHTMLを設定
      const button = '<div class="tag-cloud__more"></div>';
    
      // サイドバー内にあるタグクラウドを取得
      $('.sidebar .widget_tag_cloud').each(function () {
        const $items = $('.tagcloud a', this);
    
        // タグの項目数が指定した制限を超えていない場合は処理対象外
        if ($items.length <= n) {
          return;
        }
    
        // 制限数以降のタグを取得
        const $targets = $items.slice(n);
    
        // 折りたたみ対象を初期状態で非表示に設定
        $targets.hide();
    
        // タグクラウドの末尾にもっと見るボタンを登録
        const $btn = $(button).appendTo($('.tagcloud', this));
    
        // もっと見るボタンのクリックイベントを登録
        $btn.on('click', function () {
          // ボタンの開閉状態を active クラスで変更
          $btn.toggleClass('active');
    
          // active の状態に合わせて対象項目を表示・非表示
          $targets.toggle($btn.hasClass('active'));
        });
      });
    });
  • ラベル
    CSSを追加

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

    .tagcloud {
      .tag-cloud-link {
        width: 100%;
      }
    
      .tag-cloud__more {
        border: 1px solid #ccc;
        cursor: pointer;
        display: grid;
        height: 20px;
        margin: 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';
        }
      }
    }

さいごに

今回紹介した方法を使えば、タグクラウドの表示をコンパクトにまとめつつ、ユーザーの操作で全てのタグを表示できるようになります。
タグの多いサイトでは視認性が向上し、デザインもスッキリするため、ぜひ試してみてください。

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