【javascript】hタグを取得し、目次を自動生成する方法

やりたいこと
以下のように、javascriptで h2タグとh3タグを取得し、 目次を自動生成する 方法を紹介します。
今回は、h2タグとh3タグのみを取得し、生成します。
HTML
h2タグとh3タグにそれぞれidを指定しておきます。
目次をクリックしたら、その項目にジャンプします。
<section>
<h2 id="index1">サブタイトル1</h2>
<h3 id="index1a">サブタイトル1-a</h3>
<h3 id="index1b">サブタイトル1-b</h3>
</section>
<section>
<h2 id="index2">サブタイトル2</h2>
<h3 id="index2a">サブタイトル2-a</h3>
<h3 id="index2b">サブタイトル2-b</h3>
</section>
目次生成の手順
querySelectorAllでhタグをすべて取得
以下のように書くことで、h2タグとh3タグがすべて取得できます。
const index = document.querySelectorAll("h2, h3");
hタグの数だけforでループさせる
for (let i = 0; i < hTag.length; i++) {
const element = hTag[i];
}
hタグがh2なのかh3なのか判別
for (let i = 0; i < hTag.length; i++) {
const element = hTag[i];
if(element.tagName=="H2"){
// h2の時の処理
}else{
// h3の時の処理
}
}
h2とh3のそれぞれの処理
const hTag = document.querySelectorAll("h2, h3");
const ul = document.getElementById("contents"); // 目次が生成される要素
let h2Cnt = 1; // h2タグ内のulのカウンター
for (let i = 0; i < hTag.length; i++) {
const element = hTag[i];
if(element.tagName=="H2"){
// li a ul タグを生成
const li = document.createElement("li");
const aTag = document.createElement("a");
const nestUl = document.createElement("ul");
nestUl.classList = `ul${h2Cnt}`; // ポイント ここにそれぞれのh3が生成される
aTag.textContent = element.textContent;
aTag.href = "#"+element.id;
ul.appendChild(li);
li.appendChild(aTag);
li.appendChild(nestUl);
h2Cnt++;
}else{
const li = document.createElement("li");
const aTag = document.createElement("a");
aTag.textContent = element.textContent;
aTag.href = "#"+element.id;
// 生成される場所を取得
const nestUl = document.querySelector(`.ul${h2Cnt-1}`);
nestUl.appendChild(li)
li.appendChild(aTag);
}
}
参考



まとめ
- querySelectorAllでhタグをすべて取得
- hタグの数だけforでループさせる
- hタグがh2なのかh3なのか判別
- h2とh3のそれぞれの処理を書く
こんな記事も読まれています。
-
【HTML】【CSS】【javascript】電卓の作り方
電卓のソースコードを2つ紹介します。javascriptはわずか数行で書けます。
-
【JacvaScript】【CSS】たった4行のJavaScriptでできるハンバーガーメニューの作り方
たった4行のJavaScriptで作るハンバーガーメニューの作り方について紹介します。✖をつくるには、transform-originがポイントです。
- リンク
-
波紋エフェクトを表現するjqueryのripples-min.jsの使い方
jqueryのripples-min.jsを使うと簡単に水面の波紋を表現できます。波紋の広がりの速度、波紋の大きさ、波紋のブレの値を変えていろいろ表現させると面白いです。
-
【Javascript】querySelectorAllで要素を取得し、クリックしたら、クラスを追加したり、削除したりする方法。
JavascriptのquerySelectorAllで要素を取得し、クリックしたら、クラスを追加したり、削除したりする方法について解説します。querySelectorと同じように書いてしまうとエラーがでます。forEachを使うとすべてに適用できます。
- リンク
-
要素の高さを取得する方法。getBoundingClientRectとは?window.innerHeightとは?window.pageYOffsetとは?
要素の高さを取得する方法について解説します。getBoundingClientRect、window.innerHeight、window.pageYOffsetについて理解し、要素がいつ画面に現れるかを把握できるようにしましょう。
-
Javascriptを使ったページネーションの実装
トップページの記事が増えてきたので、何とかページネーションで最新の記事だけを表示できないかと思っていたら、いい記事を発見しました。カスタマイズして実装することができました。
- リンク
-
【Javascript】マウスの指す(X, Y)座標とドラッグ & ドロップを理解する
マウスの指す(X, Y)座標とドラッグ & ドロップについて解説します。mousedown, mouseover, mousemove, mouseupを使います。
-
【javascript】連想配列をテーブルできれいに表示する方法
javascript(Object.entries)を使って、連想配列の中身をテーブルできれいに表示する方法について紹介します。
- リンク