Created
April 27, 2019 04:18
-
-
Save hata6502/e10e01e891fa9abd56eda3d6beedeef0 to your computer and use it in GitHub Desktop.
table-of-contents
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const table_of_contents = document.querySelectorAll(".table-of-contents"); | |
let table_of_contents_counter = 1; | |
table_of_contents.forEach(table => { | |
const headings = table.parentElement.querySelectorAll("h1, h2, h3, h4, h5, h6"); | |
const stack = [{ level: 0, element: table }]; | |
headings.forEach(heading => { | |
const li = document.createElement("li"); | |
const a = document.createElement("a"); | |
const id = `section-${table_of_contents_counter++}`; | |
const ol = document.createElement("ol"); | |
// 目次要素の生成 | |
a.textContent = heading.textContent; | |
a.href = `#${id}`; | |
li.appendChild(a); | |
li.appendChild(ol); | |
// リンク先の生成 | |
heading.id = id; | |
heading.classList.add("anchor-link"); | |
// 階層構造の生成 | |
const level = Number(heading.tagName.substring(1)); | |
let parent; | |
do { | |
parent = stack.pop(); | |
} while (parent.level >= level); | |
parent.element.appendChild(li); | |
stack.push(parent); | |
stack.push({ level: level, element: ol }); | |
}); | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
JavaScript で html の目次を自動生成します。
・使用方法
<ol class="table-of-contents"></ol>
を書きます。・目次の生成ルール
<ol class="table-of-contents"></ol>
の親要素配下にある h1〜h6 要素が見出しになります。h1〜h6 の並ぶ順番によって階層構造が作られます。
(例)
h1: A
h2: B
h3: C
h2: D
h4: E
↓
A
B
C
D
E