現在の表示位置を目次内に表示する (WebsiteWithPython #3)

icon

本ホームページの構成を紹介する. pythonで作る静的高速サイト というシリーズで執筆している.

テンプレートのcodesはGitHub: Website with Pythonで公開している. (もう少し改良したら本機能を追加したver.2をアップする予定)

#2の記事の公開以降も各種更新を続けており, 今回, 現在の表示位置をサイドバーにハイライト表示する機能を追加した. したがって, 今回はその機能について記す.

なお, 本機能の実装により, 本サイトはhtml, cssのみで構成されるサイトではなく, JavaScriptも使用したサイトとなった. html, cssのみで実装することへのこだわりで悩んだが,

  • ハイライト機能はあった方が確実に利用しやすい
  • 今回のJavaScriptの動作が軽い

ことから実装に至った.

 

実際の挙動

実際の挙動はこの記事の右側のサイドバーを見ていただくか, もしくは下図の通り.

  • PC

toc-pc.mov

  • Smartphone

toc-smartphone.mov

実装

基本的には JSでのスクロール連動エフェクトにはIntersection Observerが便利 - ICS MEDIA の内容をほぼそのまま利用させていただき, 自分のサイト用に調整したのみ.

下記に簡易化したサンプルを掲載する. 以下の3ファイルを同一ディレクトリに入れ, index.htmlを開けば動作する. インストール等は不要.

 

index.html

 

<script defer type="text/javascript" src="smooth-scroll.js"></script>

のように, jsの読み込み指定をdeferにしている. asyncで実装していた時期もあったが, その際, たまにjsがうまく動作しないことがあった (jsが先に実行されてしまっていた?).

参考: スクリプトの非同期読み込み(async, deferの違い)

 

stylesheet.css

 

toc-highlights.js

 

サンプルコードの挙動

toc-sample.mov

 

注意

個人的な注意としては, html内の対象コンテンツはdivで取り囲んでやったほうが良いとわかった.

OK

上記のOKの例のように各コンテンツをdivで取り囲み, 交差するコンテンツ同士が連続してつながるようにすると, 交差判定ミスが起きないため良い.

 

NG

上記のNG例のように, 交差タイミングとなる箇所が断続的になってしまうと, 交差の判定が途切れてうまく動作せずに飛んでしまうことがあり, 不適.

 

参照