みやもとメモ

「Notion」「資格」「ブログカスタマイズ」「Microsoft To Do」「Chrome拡張機能」などについて書いていきます。

目次
目次

【はてなブログ-カスタマイズ】追従する目次をサイドバーに表示する(JavaScript・CSS対応)

この記事をシェアする

数日前から適用しているのですが、サイドバーに目次を表示しています。
さらに、スクロールの度に目次が追従するようにしています。

これはJavaScriptCSSを追加適用することで実現しています。

目次が追従するブログには何度か遭遇していて、便利に感じていました。
それと比べると、自分のブログは目次が多いわりに、記事の最初の方にだけ目次がある状態で不便に感じていました。

ということで、ネットで調べて自分のブログにも適用してみました。

今回はその適用内容や手順について、アレコレ書いていきます。

使い方

まずは手っ取り早く、使い方を載せます。

サイドバーが表示されている状態で動作するので、対象は基本的にPCのみです。
サイドバーが表示されていない状態(スマホ)では動作しません。

追従する目次(PCのみ動作)

サイドバーの最後の要素として目次が配置されます。
これは記事に設定した目次をサイドバーにコピーしています。

スクロールしていくと目次が追従するように動作します。

参考サイト

以下のサイトを参考にさせて頂きました。ありがとうございます。
www.it-the-best.com

適用したコード

JavaScriptCSSを適用しています。

JavaScript

<!-- サイドバーに目次を生成 -->
<script>
document.addEventListener('DOMContentLoaded', function () {
    // 目次を取得
    const toc = document.querySelector(".entry-content .table-of-contents");
    // 目次の存在チェック
    if (toc) {
        // サイドバー用の目次HTML作成
        const html = [];
        html.push(`<div class="hatena-module hatena-module-html sidebar-toc">`);
        html.push(`<div class="hatena-module-title">目次</div>`);
        html.push(`<div class="hatena-module-body">${toc.outerHTML}</div>`);
        html.push(`</div>`);
        // サイドバー要素取得
        const sidebar = document.querySelector("#box2-inner");
        // サイドバーの最後に目次HTMLを追加
        sidebar.insertAdjacentHTML('beforeend', html.join(''));
    }
});
</script>
<!-- サイドバーに目次を生成ここまで -->

CSS

/***目次が追従されるようにする***/
#box2-inner {
    height: 100%;
}
/*サイドバーの最後の要素をスクロール追従*/
#box2-inner > .hatena-module:last-child {
    position: sticky;
    top: 10px;
}
/*サイドバー目次のデザイン*/
#box2-inner > .sidebar-toc .table-of-contents {
    padding: 5px 0px 5px 25px;
    overflow-y: auto;
    height: calc(100vh - 150px);
}
#box2-inner > .sidebar-toc .table-of-contents ul {
    padding-inline-start: 20px;
}
/*スマホサイズでは非表示にする*/
@media(max-width: 991px) {
    #box2-inner > .sidebar-toc {
        display: none;
    }
}
/***目次が追従されるようにするここまで***/

上記のJavaScriptCSSを適用すると、追従する目次がサイドバーに表示されます。

参考サイトを見たり、ネットで調べつつも、JavaScriptCSSそれぞれ自力で実装しました。

挙動に関して

挙動に関して、補足を書いておきます。

JavaScript

  • 記事に設定されている目次を取得する
  • 目次がない場合は処理終了する(トップページや、目次がない記事が該当)
  • サイドバーの最後の要素として、目次用のHTMLを追加する

CSS

  • サイドバーの最後の要素をスクロール追従するようにする
    • ほとんどの記事は目次
    • 目次がないページはあらかじめ設定されている最後の要素
  • サイドバーは幅が狭いので、インデント幅が狭くなるように調整
    • 「padding-inline-start」で調整可能
  • サイドバーが表示されていない状態(スマホ)の場合は非表示にする
    • 「@media(max-width: 991px)」の部分でサイズ判定
  • 目次が長すぎる場合はスクロールバーを表示させる
    • 「overflow-y」と「height」の指定で調整
目次が長すぎる場合はスクロールバーを表示

適用手順

一応、適用手順を載せておきます。


STEP
ヘッダーの右上あたりにあるところをクリックして「デザイン」をクリック
STEP
「カスタマイズ」→「記事」をクリック
STEP
「記事下HTML」の記述領域をクリック
STEP
上述のJavaScriptをコピペする(既存のコードは消さずに)
STEP
続いて「カスタマイズ」→「デザインCSS」→「CSS記述領域」をクリック
STEP
上述のCSSをコピペする(既存のCSSは消さずに)
STEP
「変更を保存する」をクリック
STEP
デザインが変更されているか確認する(挙動も確認する)
デザインが変更されなかったり、想定の挙動になっていない方は
手順が間違っているか、今使っているデザインテーマと相性が悪いか、他にもCSSやJSを埋め込んでいてその影響か、、などなど原因は色々考えられます。

注意事項

はてなブログで適用したものです。
はてなブログ以外では試してないので、うまく動かない可能性があります。

今使っているSilenceというデザインテーマに追加でJavaScriptCSS適用した形となります。

他のデザインテーマを使っている方や、他にもCSSやJSを埋め込んでいる人はうまく動かない可能性がありますので、もし今回記載のJavaScriptCSSを適用しようとしている方はその辺りご了承ください。

おわりに

ということで、「追従する目次をサイドバーに表示する」に関してアレコレ書いてみました。

ネットで調べつつも、ほとんど自力でコードを実装したので適用まで時間を要しました。
とはいえ参考サイトのおかげで、たくさんヒントを得れました。ありがたい。

またなにかブログカスタマイズしたら記事にします。

関連記事

JavaScriptに関連したブログカスタマイズ記事は他にも書いています。
気になる記事があればぜひ。

TOPへ戻る HOMEへ