楽天セール開催中!ポイント最大11倍! セール会場へ

SWELL│サイドバーの目次をハイライトするカスタマイズ

swell-toc-highlight

PC版の場合、SWELLでの目次は追従サイドバーに設置するケースが多いと思います。

記事を見ている際に、今どこの部分を見ているのか?

サイドバーの目次の項目をハイライトするカスタマイズをSWELLで適応させてみました。

SWELLの追従サイドバーに設置した目次の該当項目がハイライト表示されている様子。

ZIMAさんのTHE SONIC用の目次スクロールをSWELL用にしてみました。

目次

著者

WEB制作をしているデジタルノマド
WordPressのカスタマイズが好きで、色々と自作しています。

WordPressのカスタマイズに困ったらご相談ください!

SWELLでサイドバーの目次をハイライトするカスタマイズ

このコードは、すでに表示されているSWELLのサイドバー目次を強調するものです。

目次ウィジェット自体は追加しないため、設置先のPC画面でサイドバー目次とリンク先の見出しが表示されていることを先に確認します。

以下、詳しく解説いたします。

functions.phpにコードを挿入する

WordPressの管理画面 > 外観 > テーマファイルエディター > functions.php

子テーマのfunctions.phpをバックアップし、PHPエラー時にも元のファイルへ戻せる手段を確保してから、PHP開始タグの内側へ以下を追加します。

以前のmotoki_mkj_highlighter関数・登録行は置き換え、二重登録しないでください。

親テーマには追加しません。

日本語IDはデコードしてgetElementByIdで取得します。

空のハッシュ、不正なエンコード、存在しない見出し、別ページのリンクは処理対象から外します。

function motoki_mkj_highlighter() {
    if (!is_singular()) return;
    echo <<<'WAZA_TOC'
<script>
(() => {
  const init = () => {
  const groups = Array.from(document.querySelectorAll('.widget_swell_index')).map(widget => {
    const entries = [];
    widget.querySelectorAll('a[href*="#"]').forEach(link => {
      let id;
      try { id = decodeURIComponent(link.hash.slice(1)); } catch (_) { return; }
      if (!id || link.pathname !== location.pathname || link.origin !== location.origin) return;
      const heading = document.getElementById(id);
      if (heading) entries.push({link, heading});
    });
    return entries;
  });
  const update = () => {
    groups.forEach(entries => {
      let current = null;
      entries.forEach(entry => {
        if (entry.heading.getBoundingClientRect().top <= 120) current = entry;
      });
      entries.forEach(entry => {
        const active = entry === current;
        entry.link.classList.toggle('mkj-active', active);
        if (active) entry.link.setAttribute('aria-current', 'location');
        else entry.link.removeAttribute('aria-current');
      });
    });
  };
  let scheduled = false;
  const schedule = () => {
    if (scheduled) return;
    scheduled = true;
    requestAnimationFrame(() => { scheduled = false; update(); });
  };
  update();
  window.addEventListener('scroll', schedule, {passive:true});
  window.addEventListener('resize', schedule);
  };
  if (document.readyState === 'complete') init();
  else window.addEventListener('load', init, {once:true});
})();
</script>
<style>
.widget_swell_index a.mkj-active { background:#24507a; color:#fff; }
.widget_swell_index a:focus-visible { outline:3px solid #24507a; outline-offset:3px; }
</style>
WAZA_TOC;
}
add_action('wp_print_footer_scripts', 'motoki_mkj_highlighter');

色はstyle内のbackgroundとcolorで変更します。

文字と背景のコントラストを確保してください。

画面上端から120pxを通過した最後の見出しを現在位置とし、最初の見出しより前では選択しません。

固定ヘッダーの高さに合わせて120の値を調整します。

カスタマイズは以上です。

コード挿入後にキャッシュをクリアして、記事を読みながらサイドバーの目次が見出しの上にハイライトされているか確認しましょう。

カスタマイズ後にサイドバーの目次項目がハイライト表示されているかを確認する様子。

まとめ

本記事ではサイドバーの目次をハイライトするカスタマイズについて書きました。

PC版で見るユーザーが多い場合、サイドバーに目次をつけて見やすくしてあげるとユーザビリティが向上します。

是非、本記事のカスタマイズを参考にしてください。

ブロックごとの余白をPC・スマホ別に変える方法もまとめています。

以前のコードはGitHubのMOTOKI-LLC/WAZA-codeにもまとめています。

対象はSWELLのサイドバー目次(.widget_swell_index)です。

サイドバーが非表示のスマホ幅では目印も表示されません。

リンク自体のクリック・Tab・Enter操作は変更しません。

戻す場合は追加した関数とadd_action行を削除し、変更前のファイルへ戻してキャッシュを更新します。

見出しをJavaScriptで後から追加する構成には対応していません。

公開ページでのハイライトの見本

このページのPC用サイドバー目次で、画面上端から120pxを通過した見出しに対応するリンクを強調します。

掲載コードは通常読み込みではloadを待ち、document.readyStateがcompleteならその場で初期化する構成です。

初期化後に生成された目次リンクや見出しは再収集しないため、遅延生成するプラグインなどとの組み合わせは個別に確認します。

目次リンクはTabで選択しEnterで移動できます。

スマホではテーマがサイドバーを表示しないため、この見本のハイライトも表示しません。

本文へ戻る導線には各見出しの前に目次へ戻るリンクを置く方法、目次ラベルだけ短くする場合には指定文字列を取り除く方法を使います。

公開画面での確認

PCのサイドバー目次で現在の見出しを強調した状態です。

キーボードで選択した目次リンクにはフォーカス枠も表示されます。

サイドバー目次で現在の見出しが強調された画面
2026年10月2日、WAZAの公開ページで撮影。

PHPの出力条件を確認する

2026年10月2日、WordPress 7.1.2・SWELL 2.19.0の検証環境で、通常のフッターフックへ登録されることと、個別ページでは掲載JavaScript・CSSを出力し、一覧ページでは出力しないことを確認しました。

ブラウザーの目次生成を待つload分岐は掲載コードに保持しています。

このPHP試験は、load後にコードを遅延実行した場合や、目次生成の実際のタイミングをブラウザーで再現したものではありません。

導入先の全ウィジェット構成や読み上げも未検証です。

  • URLをコピーしました!

実装を任せたい方へ

SWELLのカスタマイズ代行

記事のコードをそのまま使うのが不安な場合や、サイトに合わせた調整が必要な場合は当社が実装します。1時間 ¥8,000〜(税込)。テーマ更新に強い書き方で納品します。

WAZAの有料記事のサブスクリプションも開始しました。

サービス

Service

WordPressサイトのカスタマイズのサービスに関心がありましたら、ぜひ詳細をご覧ください。

目次