【Cocoon】サイドバー目次で今読んでいる箇所をハイライト-コピペカスタマイズ

【Cocoon】サイドバー目次で今読んでいる箇所をハイライト-コピペカスタマイズテーマ
スポンサーリンク

どうも!初めましての方は初めまして、初心者のWebサイト勉強のとみーです!

WordPress の無料テーマ Cocoon では、サイドバーに目次を表示するウィジェットが利用できます。

サイドバーに目次があることで、記事を読んでいる最中に

その記事がどんな構成になっているか

を確認することができ、

特定の見出しに移動したい

と思った時もすぐさま移動できるため、読者にとっての使い勝手が非常に良いです。

とみー
とみー

しかし、情報量の多い記事を書けるようになってくると、それにつれて見出しの数が多くなっていきますよね。

すると、目次があっても記事の中で今どのあたりを読んでいるのかが分かりにくくなっていくことが考えられます。

そこで今回は、Cocoon ユーザーの方向けに

  • 読者が現在読んでいる部分の見出しに色を付け
  • 「あなたが今読んでいるのはこの部分ですよ〜」と伝えられる

サイドバーの目次のカスタマイズ方法をまとめました!

スポンサーリンク

サイドバーの目次-ハイライト機能実装後の完成イメージ

今回のカスタマイズをすると、記事内で現在読んでいる部分に対応するサイドバーの目次ウィジェットの見出し部分の色が変わります。

Cocoon ではスマホの場合サイドバーが表示されません。そのため、今回のカスタマイズは PC 版限定で動作します。

現在読んでいる部分をハイライト

スクロールに合わせて色が変わるため、自分が記事のどのあたりにいるのかが一目瞭然です。

とみー
とみー

動画・画像の例ではオレンジ色ですが、もちろんお好きな色に変更できます!

スポンサーリンク

Cocoon のサイドバー目次のコピペカスタマイズ方法

コピペでカスタマイズ

今回のカスタマイズは、次の2ステップで行います。

カスタマイズ手順
  • STEP1
    CSSコードをコピペする
  • STEP2
    JavaScriptコードをコピペする

サイドバーに目次を設置していない方は、こちらの記事を参考にまずは設置しましょう。

style.css と javascript.js のバックアップを取っておこう

今回のカスタマイズでは、

  • style.css
  • javascript.js

という2つのファイルを操作します。

これらはサイトのデザイン・動作に関係するため、設定を間違えるとレイアウトが崩れたり、正常な動作が失われたりする可能性があります!

そのため、万が一が起きても元に戻せるように、カスタマイズ前に忘れずにバックアップを取っておきましょう。

とみー
とみー

1番簡単なのはファイルの中身をコピーして、メモ帳やテキストエディタに保存しておくやり方です。

STEP1:CSS コードのコピペ

まずは、CSS コードをコピペします。

とみー
とみー

次の2ステップで行いましょう!

  • STEP1
    style.css を開く

    管理画面サイドメニュー「外観」→「テーマエディター」→「style.css

  • STEP2
    style.css にコードをコピぺする

style.css を開く

WordPress の管理画面サイドメニューの「外観」から「テーマエディター」を開きましょう。

外観→テーマエディター

初期設定では「Cocoon Child」が選択されており、「style.css」が開いてあるはずです。

style.cssを開く
とみー
とみー

違うものが選択されている場合は、それぞれ「Cocoon Child」、「style.css」を選んでください。

style.css にコードをコピペする

style.css
#toc-2 li.current {
	background-color: #ffbc0099; /* ハイライト色 */
}
ハイライト色

ここで設定しているのは、現在読んでいるコンテンツに対応する見出しの色です。

とみー
とみー

ハイライトする色を変えたい場合は、「#ffbc0099」の部分を好きな色のコードに変えましょう。

STEP2:JavaScript コードのコピペ

続いて、JavaScript コードをコピペします。

とみー
とみー

こちらも2ステップです!

  • STEP1
    javascript.js を開く

    管理画面サイドメニュー「外観」→「テーマエディター」→「javascript.js

  • STEP2
    javascript.js にコードをコピぺする

javascript.js を開く

先ほどの「style.css」と同じページで、「javascript.js」を開きましょう。

javascript.jsを開く

javascript.js にコードをコピペする

javascript.js
$(function() {
  const headerLinks = $('#toc-2 li a');
  let contentsPos = new Array();

  function init() {
    for (let i = 0; i < headerLinks.length; i++) {
      const headerID = headerLinks.eq(i).attr('href');
      const top = $(headerID).offset().top - 20;
      const bottom = null;

      contentsPos[i] = { top: top, bottom: bottom };

      if (i > 0) {
        contentsPos[i - 1].bottom = top;
      }
    };
    const footerTop = $("footer").offset().top - 20;
    contentsPos[contentsPos.length - 1].bottom = footerTop;
  }

  function currentCheck() {
    const windowScrollTop = $(window).scrollTop();

    headerLinks.parent().removeClass('current');

    if (contentsPos[0].top <= windowScrollTop && contentsPos[contentsPos.length - 1].bottom > windowScrollTop) {
      for (let i = 0; i < contentsPos.length; i++) {
        if (contentsPos[i].top <= windowScrollTop && contentsPos[i].bottom > windowScrollTop) {
          headerLinks.eq(i).parent().addClass('current');
          break;
        }
      }
    }
  }

  init();

  $(window).on('load scroll', currentCheck);

  $(document).on('change', 'input.toggle-checkbox', function() {
    setTimeout(init, 350);
  });
	
  $(document).on('change', 'input.toc-checkbox', function() {
    setTimeout(init, 550);
  });

});
javascript.js
$(function() {

  // ナビゲーションリンクを設定
  // #toc-2: サイドバーの目次ウィジェット
  // li: その各見出し
  // a: そのリンク
  const headerLinks = $('#toc-2 li a');

  // コンテンツの位置情報の配列作成
  // {
  //    top: 各見出しに対応するコンテンツの先頭位置
  //    bottom: 各見出しに対応するコンテンツの終了位置
  // }
  let contentsPos = new Array();

  // contentsPos の初期化関数
  function init() {
    for (let i = 0; i < headerLinks.length; i++) {
      // 見出し i のURL(アンカーポイント・リンク先)を取得
      // 通常「#toc1」のような id属性が得られる
      const headerID = headerLinks.eq(i).attr('href');

      // コンテンツ i の先頭位置
      const top = $(headerID).offset().top - 20;
      // コンテンツ i の終了位置
      // 暫定的に null を入れておく(後で更新)
      const bottom = null;

      // 配列として格納
      contentsPos[i] = { top: top, bottom: bottom };

      // コンテンツの下部の位置を調整
      if (i > 0) {
        // 前のコンテンツの終了位置 = 今のコンテンツの先頭位置
        contentsPos[i - 1].bottom = top;
      }
    };
    // footerの先頭位置を取得
    const footerTop = $("footer").offset().top - 20;

    // 最後のコンテンツの終了位置 = footerの先頭位置
    contentsPos[contentsPos.length - 1].bottom = footerTop;
  }

  // 初期化の実行
  init();

  // 現在位置を確認してコンテンツ位置に対応
  function currentCheck() {
    // 現在のサイト上部からの位置を取得
    const windowScrollTop = $(window).scrollTop();

    // 一旦マークを解除
    headerLinks.parent().removeClass('current');

    // 現在位置が全コンテンツ内にあるかチェック
    if (contentsPos[0].top <= windowScrollTop && contentsPos[contentsPos.length - 1].bottom > windowScrollTop) {
      for (let i = 0; i < contentsPos.length; i++) {
        // 現在位置がコンテンツ i 内にあるかチェック
        if (contentsPos[i].top <= windowScrollTop && contentsPos[i].bottom > windowScrollTop) {
          // class = "current"を aタグの親である li タグに設定
          headerLinks.eq(i).parent().addClass('current');

          break;
        }
      }
    }
  }

  // ロード・スクロール時に見出しをマーク更新
  $(window).on('load scroll', currentCheck);

  // アコーディオンが開閉したら座標更新
  $(document).on('change', 'input.toggle-checkbox', function() {
    setTimeout(init, 350);
  });
	
  // 目次が開閉したら座標更新
  $(document).on('change', 'input.toc-checkbox', function() {
    setTimeout(init, 550);
  });

});

コピペカスタマイズは以上になります。

スポンサーリンク

まとめ

お疲れさまでした

今回のカスタマイズは、読者のスクロールに合わせてサイトの様子(色)が変化します。

とみー
とみー

このような変化を動的というのですが、動的な変化があることでおしゃれ感が増します!

ぜひ参考にしてみてください。

みなさんのサイトをご紹介します!

今回のカスタマイズを導入してくださった方がいらっしゃれば、ぜひコメントや Twitter の方でお知らせください!記事内にてご紹介させていただきます!

コメント

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