function init_toc_heading() { const headings = document.querySelectorAll("main > article:first-of-type h2"); const toc_names = document.querySelectorAll("main > nav#toc li"); const toc_mapped_links = new Map( Array.from(toc_names).map((name) => [ name.children[0].hash.substring(1), name, ]), ); const position_list = Array.from(headings).map((heading, idx, headings) => [ heading.offsetTop + heading.offsetHeight, headings[idx + 1]?.offsetTop ?? Infinity, toc_mapped_links.get(heading.id), ]); const updateToc = (scrollingElement) => { const scrollTop = scrollingElement.scrollTop; const vptHeight = scrollingElement.clientHeight; const vptBgnOffset = scrollTop; const vptEndOffset = scrollTop + vptHeight; position_list.forEach(([eltBgnOffset, eltEndOffset, element]) => { if (eltBgnOffset < vptEndOffset && eltEndOffset > vptBgnOffset) element.classList.add("visible"); else element.classList.remove("visible"); }); }; document.addEventListener("scroll", () => { updateToc(document.scrollingElement); }); window.addEventListener("resize", () => { updateToc(document.scrollingElement); }); updateToc(document.scrollingElement); } init_toc_heading();