JavaScriptでサイドバーに目次を表示する方法
本記事では、サイドバーで目次を表示する方法を解説しています。JAMStackでブログを作る際に、必要になると思います。参考になれば幸いです。
JavaScriptのコード
本ブログでは、Nuxt.jsを使っているのですが、JavaScriptを使用しているので、基本的な実装方法はどのフレームワークを使用しても変わらないと思います。
document.addEventListener("DOMContentLoaded", () => {
const article = document.querySelector(".article")
const heads = article.querySelectorAll("h1, h2")
if (heads && heads.length) {
let contents = ""
heads.forEach((head, i) => {
contents += `<li><a href="#head${i}">${head.textContent}</a></li>`
head.innerHTML += `<a id="head${i}"></a>`
})
document.querySelector(
"#table-of-content"
).innerHTML += `<ol>${contents}</ol>`
}
})
Window: DOMContentLoaded イベントで、最初の HTML 文書の読み込みと解析が完了を待ってから、Headタグを取得します。
document.querySelector(".article")
で記事のセレクタを取得します。
次にarticle.querySelectorAll("h1, h2")
でh1
とh2
タグを取得しています。
そして、"#table-of-content"
にHTMLを挿入しています。
HTMLのコード
<div id="table-of-content" />
このようにidを指定していれば、HTMLが挿入されます。
セレクタは、classでもidでも良いと思います。
Vue.jsの場合
mounted
の中に、JavaScriptのコードを入れてあげてください。
mounted() {
// JavaScriptのコード
}
created
の中にコードを入れてしまうと、document
が読み込めないので、注意しましょう。