アイキャッチ画像

ghost-toc-plugin プレビュー

左パネルでオプションを変えてみてください。目次がリアルタイムで再描画され、埋め込みコードも一緒に更新されます。スクロールすると現在のセクションが強調されます。

はじめに

ghost-toc-plugin は、コード1行で Ghost ブログにフローティング目次を追加できる、軽量(約3KB)で依存関係のないウィジェットです。Ghost 向けとして始まりましたが、Notion ベースのブログでも動作し、スクリプトを追加できる場所ならどこでも動きます。記事の見出しを読み取って目次を自動生成し、スクロールに追従して現在の見出しを強調します。このページがそのまま実例で、横に見える目次が実際に動くウィジェットです。

インストール

ビルド工程もテーマ編集も不要。下のスニペットを一度貼り付けるだけです:

<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/GreedyLabs/ghost-toc-plugin@1/toc.css">
<script src="https://cdn.jsdelivr.net/gh/GreedyLabs/ghost-toc-plugin@1/toc.min.js"
        data-content=".gh-content"
        data-headings="h2,h3"
        data-title="目次"></script>

コードインジェクション

Ghost では Settings → Code injection → Site Footer に貼り付けます。Notion ベースのホスティングなら、カスタムコード欄に追加します。oopy はサイト設定の head/footer コード欄、super.so は Custom Code 領域があり、そこで data-content.notion-page-content にします。その他のサイトでは閉じタグ </body> の直前に置きます。自身の data-* オプションを読めるよう、async や defer は付けません。

オプション設定

動作はすべてスクリプトタグの data-* 属性で設定します: 本文セレクタ、含める見出し、タイトル、位置などを指定できます:

data-content=".gh-content"
data-headings="h2,h3"
data-position="right"
data-min-width="1200"
data-top="100"

カスタマイズ

色と位置は自由に調整できます。すべてのクラスと CSS 変数は greedylabs-ghost-toc で名前空間化されており、テーマと衝突しません。

配色

現在の項目の色は、既定で Ghost テーマのアクセント色(--ghost-accent-color)に従います。変更するには data-accent を指定するか、CSS 変数を上書きします。ウィジェットはライト/ダークの既定値を備え、システムテーマに自動で合わせます。ダークモードの可読性を高めたい場合は、ダークのときだけ色を上書きしてください, 単一の固定値ではライトで不自然になります:

@media (prefers-color-scheme: dark) {
  .greedylabs-ghost-toc {
    --greedylabs-ghost-toc-muted: #c9d1d9;
    --greedylabs-ghost-toc-border: rgba(255,255,255,.22);
  }
}

位置

data-position で左右、data-top で上の余白、data-gap で本文との間隔、data-width でパネル幅を指定します。画面が data-min-width より狭い場合や横にスペースがない場合、目次は自動的に隠れます。

よくある質問

このウィジェットでサイトが遅くなりますか?

ほとんど影響ありません。約3KBで依存関係も外部リクエストもなく、スクロールは passive リスナーで受け取り、requestAnimationFrame でフレームごとに一度だけ計算します。遅延読み込み画像や giscus などでドキュメントの高さが変わったときだけ ResizeObserver で再計算します。

目次が表示されないのはなぜですか?

3点を確認してください。data-content セレクタが実際の本文コンテナと一致しているか、見出しが2つ以上あるか(それ未満では生成されません)、画面が data-min-width(既定1200px)より広く本文の横にパネルが入る余地があるか。狭い画面やモバイルでは意図的に隠れます。

h4 のような深い見出しも目次に含められますか?

はい。data-headings に入れたいタグをカンマ区切りで指定します(例: h2,h3,h4)。リストに表示する見出しレベルを自由に選べます。

おわりに

ghost-toc-plugin は MIT ライセンスのオープンソースで、コードと Issue は GitHub にあります。左パネルでオプションを変えてライブプレビューを確認し、気に入ったら埋め込みコードをコピーしてください。お役に立てたら、コーヒーを一杯いただけると嬉しいです ☕。