JavaScript: Generate ‘Table of Contents’ from Raw HTML

Updated: January 31, 2024 By: Guest Contributor Post a comment


For many web developers and content creators, the ability to automatically generate a Table of Contents (TOC) for large documents or page structures is integral for providing a better user experience. Not only does a TOC improve navigation within the content, but it also allows users to quickly understand the structure and main topics covered in the document.

In this tutorial, we’ll explore how to use JavaScript to generate a TOC from raw HTML. With this approach, whenever you update your content, the TOC updates accordingly, ensuring consistency without additional manual work.

Understand the Structure of Your Content

Before generating a TOC, you need a clear understanding of the HTML content structure you’ll be targeting. Typically, headings (<h1>, <h2>, <h3>, etc.) denote sections and subsections of content. To create a TOC, you’ll target these to dynamically build the navigation links.

Step-by-Step Instructions

Step 1: Preparing the HTML

Let’s start with a basic HTML structure to apply our JavaScript:

  <div id="toc"></div>
  <h2>Getting Started</h2>
  <h3>Advanced Concepts</h3>

The div with ID “toc” is where our generated TOC will be placed. Next, we’ll write the JavaScript needed to build this out.

Step 2: Writing the JavaScript Function

We will create a function called generateTOC that locates all headings within our content and builds a nested list of links that correspond to each section.

function generateTOC() {
  const toc = document.getElementById("toc");
  const headings = document.querySelectorAll("h1, h2, h3, h4, h5, h6");
  const nestedList = document.createElement("ul");

  headings.forEach((heading, index) => { = "heading-" + index;
    const listItem = document.createElement("li");
    listItem.innerHTML = '' + heading.textContent + '';


// Call the function when the document is ready
window.addEventListener("DOMContentLoaded", generateTOC);

This function is a straightforward loop that works through each heading, assigning an ID for anchoring and gathers the headings into a list. It then places the list in our designated TOC container.

Step 3: Styling the TOC

With our TOC generated, it’s time to style it with CSS to make it clear and easy to navigate:

#toc {
  position: fixed;
  top: 10px;
  right: 10px;
  width: 200px;
  height: 300px;
  overflow: auto;
  background-color: #f9f9f9;
  border: 1px solid #ccc;
  padding: 10px;

#toc li {
  list-style: none;
  margin-bottom: 5px;

#toc a {
  text-decoration: none;
  color: blue;

The above CSS positions the TOC container on the page, ensures it’s scrollable, and sets typical typography and spacing to make it presentable.

Step 4: Enhancing the TOC

While our TOC is functional, further enhancements can improve usability. Some common improvements include:

  • Smooth Scrolling: Iu-ajaxbottom-slot-buttonmprove the user experience by implementing JavaScript or CSS-based smooth scrolling when users click a TOC link.
  • Nested Navigation: If your document has multiple heading levels, modify the generateTOC function to reflect the hierarchy in nested lists.
  • Highlighting Active Section: Add JavaScript to update the appearance of the TOC links to show the currently active section as the user scrolls through the content.


By the end of this tutorial, you’ve learned how to dynamically generate a TOC using JavaScript and have gained the knowledge to further enhance it according to your needs. This capability is particularly valuable for content-heavy sites, such as documentation or educational platforms, where organization and immediacy of information are key.

Using the methods and concepts outlined here, feel free to customize and expand upon the basic TOC, making your web content more accessible and navigable for your users. Remember, user experience is integral to website success, and a thoughtfully implemented TOC can be an essential piece of that experience.