Skip to content

Instantly share code, notes, and snippets.

@hata6502
Created April 27, 2019 04:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hata6502/e10e01e891fa9abd56eda3d6beedeef0 to your computer and use it in GitHub Desktop.
Save hata6502/e10e01e891fa9abd56eda3d6beedeef0 to your computer and use it in GitHub Desktop.
table-of-contents
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 });
});
});
@hata6502
Copy link
Author

hata6502 commented Apr 27, 2019

JavaScript で html の目次を自動生成します。

・使用方法

  1. table-of-contents.js を body 要素の末尾で読み込みます。
  2. 目次を設置する場所に <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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment