みやもとメモ

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

目次
目次

【はてなブログ-カスタマイズ】スマホ版で追従する目次を表示する(JavaScript・HTML・CSS対応)

この記事をシェアする

スマホ版で目次を常に表示するように対応してみました。
スクロールの度に目次が追従するようにしています。

以前「追従する目次をサイドバーに表示する」対応をしています(以下リンク)。
今回はそれをスマホ対応したような内容です。

miya-moto-memo.hatenablog.com

上記の対応(PCサイズ)だとサイドバーがあるため、そこに目次を表示するようにしました。
今回の対応(スマホサイズ)だとサイドバーがないため、別の方法で目次を表示するようにしています。

今回はその辺りに関して詳しく書いていきます。

変更内容

画像

まずは手っ取り早く、画像を載せます。

ページの右下に「目次ボタン」を配置しました(左の画像)。
目次ボタンをタップすると、目次を表示します(右の画像)。

目次ボタンのアイコンも切り替わるようになっています。

具体的な使い方(gif)

具体的な使い方をgifにしてみました。
以下のような感じです。

具体的な使い方

ページ右下の「目次ボタン」をタップすると、目次が表示されます。
もう一度「目次ボタン」をタップすれば閉じます。

そして目次にある見出しをタップすると、対象の見出しにジャンプします。

スクロールしても「目次ボタン」は追従します。

適用したコード

CSS・HTMLとJavaScriptを適用しています。

CSS・HTML

<!-- 追従する目次ボタン(スマホ用) -->
<style>
#sp-toc {
    visibility: hidden;
    position: fixed;
    right: 15px;
    bottom: 65px;
    background: #fff;
    color: #111;
    width: 60px;
    height: 60px;
    text-align: center;
    text-decoration: none;
    border: solid 1px;
    border-radius: 50%;
    box-shadow: 0 2px 10px -6px rgba(0,0,0,.5), 0 3px 10px -4px rgba(0,0,0,.2);
    z-index: 99;
}
#sp-toc > i {
    display: block;
    padding-top: 7px;
    font-size: 1.3rem;
}
#sp-toc > span {
    font-size: 0.8rem;
}
/*目次*/
.sp-table-of-contents {
    visibility: hidden;
    opacity: 0;
    position: fixed;
    bottom: 52px;
    background-color: #fff;
    width: 100%;
    padding: 5px;
    transition: 0.3s;
    overflow-y: auto;
    height: calc(100vh - 52px);
    z-index: 99;
    font-size: 0.9rem;
}
.sp-table-of-contents.active {
    visibility: visible;
    opacity: 0.99;
}
.sp-table-of-contents ul {
    padding-left: 30px;
}
.sp-toc-title {
    text-align: center;
    color: #111;
    border-top: 3px solid #111;
    border-bottom: 3px solid #111;
    background-color: #e7e7e7;
    font-weight: bold;
    padding: 5px 0px;
    margin: 10px 0px;
}
/*PCサイズでは非表示にする*/
@media (min-width: 768px) {
    #sp-toc {
        display: none;
    }
}
</style>

<div class="sp-table-of-contents">
    <div class="sp-toc-title">目次</div>
</div>
<a href="javascript:void(0);" id="sp-toc">
    <i class="fa fa-list"></i>
    <span>目次</span>
</a>

<script>
    // 目次のクリックイベント
    document.querySelector("#sp-toc").addEventListener('click', () => {
        // 目次の開閉
        tocIconToggle();
    });
    // 目次内のリンク クリックイベント
    document.querySelector(".sp-table-of-contents").addEventListener('click', (e) => {
        if (e.target.tagName.toLowerCase() === 'a') {
            // 目次の開閉
            tocIconToggle();
        }
    });
    /**
     * 目次の開閉、アイコン切り替え
     */
    function tocIconToggle() {
        const spToc = document.querySelector(".sp-table-of-contents");
        const iconClasses = document.querySelector("#sp-toc i").classList;
        spToc.classList.toggle('active');
        if (spToc.classList.contains('active')) {
            // 閉じるアイコンに切り替え
            iconClasses.remove("fa-list");
            iconClasses.add("fa-close");
        } else {
            // 目次アイコンに切り替え
            iconClasses.remove("fa-close");
            iconClasses.add("fa-list");
        }
    }
</script>
<!-- 追従する目次ボタン(スマホ用)ここまで -->

JavaScript

<!-- スマホ用に目次を生成 -->
<script>
document.addEventListener('DOMContentLoaded', function () {
	// 目次を取得
	const toc = document.querySelector(".entry-content .table-of-contents");
	// 目次の存在チェック
	if (toc) {
		// スマホ用目次取得
		const spToc = document.querySelector(".sp-table-of-contents");
		// スマホ用目次を追加
		spToc.insertAdjacentHTML('beforeend', toc.outerHTML);
		// スマホ用目次を表示
		document.querySelector("#sp-toc").style.visibility = 'visible';
	}
});
</script>
<!-- スマホ用に目次を生成ここまで -->

上記のCSS・HTML、JavaScriptを適用すると目次が表示されます。
表示されるのはスマホ版のみです。

デザインの適用手順

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


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

注意事項

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

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

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

おわりに

ということで、「スマホ版で追従する目次を表示する」に関してアレコレ書いてみました。

今回の対応は、これまでのカスタマイズをいくつか参考にしながら実装しました。

スマホ用の目次を生成する部分は、以下の記事を参考にしました。
miya-moto-memo.hatenablog.com

スマホ版に関するアレコレは、以下の記事を参考にしました。
miya-moto-memo.hatenablog.com

目次ボタンのデザインは、以下の記事を参考にしました。
miya-moto-memo.hatenablog.com

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

関連記事

スマホ関連の記事は他にも書いています。
気になる記事があればぜひ。

TOPへ戻る HOMEへ