当前位置:首页 > JavaScript

js实现目录

2026-02-28 20:02:34JavaScript

使用 DOM 操作生成目录

通过遍历文档中的标题元素(如 h1h2h3 等),动态生成目录结构并插入到页面中。

js实现目录

function generateTOC() {
  const headings = document.querySelectorAll('h1, h2, h3, h4, h5, h6');
  const tocContainer = document.createElement('div');
  tocContainer.id = 'toc';

  let currentLevel = 1;
  let tocHTML = '<ul>';

  headings.forEach((heading, index) => {
    const level = parseInt(heading.tagName.substring(1));
    const id = `heading-${index}`;
    heading.id = id;

    if (level > currentLevel) {
      tocHTML += '<ul>';
    } else if (level < currentLevel) {
      tocHTML += '</ul></li>'.repeat(currentLevel - level);
    } else if (index !== 0) {
      tocHTML += '</li>';
    }

    tocHTML += `<li><a href="#${id}">${heading.textContent}</a>`;
    currentLevel = level;
  });

  tocHTML += '</li></ul>'.repeat(currentLevel - 1) + '</ul>';
  tocContainer.innerHTML = `<h2>目录</h2>${tocHTML}`;
  document.body.prepend(tocContainer);
}

generateTOC();

使用 Intersection Observer 实现动态高亮

结合 Intersection Observer 监听当前滚动位置,高亮显示目录中对应的条目。

js实现目录

function setupTOCHighlight() {
  const links = document.querySelectorAll('#toc a');
  const headings = document.querySelectorAll('h1, h2, h3, h4, h5, h6');

  const observer = new IntersectionObserver(
    (entries) => {
      entries.forEach((entry) => {
        const id = entry.target.id;
        const link = document.querySelector(`#toc a[href="#${id}"]`);

        if (entry.isIntersecting) {
          links.forEach((l) => l.classList.remove('active'));
          link?.classList.add('active');
        }
      });
    },
    { rootMargin: '-50% 0px -50% 0px' }
  );

  headings.forEach((heading) => observer.observe(heading));
}

setupTOCHighlight();

添加 CSS 样式

为目录添加基础样式,使其更易读和交互友好。

#toc {
  position: fixed;
  top: 20px;
  left: 20px;
  max-width: 250px;
  background: #f9f9f9;
  padding: 10px;
  border-radius: 5px;
  box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
}

#toc ul {
  list-style: none;
  padding-left: 20px;
}

#toc a {
  text-decoration: none;
  color: #333;
}

#toc a.active {
  font-weight: bold;
  color: #0066cc;
}

优化目录生成逻辑

如果文档结构较深,可优化生成逻辑,避免嵌套过多 ul 导致性能问题。

function generateOptimizedTOC() {
  const headings = document.querySelectorAll('h1, h2, h3, h4, h5, h6');
  const tocContainer = document.getElementById('toc') || document.createElement('div');
  tocContainer.id = 'toc';

  const stack = [];
  let html = '';

  headings.forEach((heading, index) => {
    const level = parseInt(heading.tagName.substring(1));
    const id = `heading-${index}`;
    heading.id = id;

    while (stack.length > 0 && stack[stack.length - 1].level >= level) {
      stack.pop();
      html += '</ul>';
    }

    if (stack.length === 0 || stack[stack.length - 1].level < level) {
      html += '<ul>';
      stack.push({ level, id });
    }

    html += `<li><a href="#${id}">${heading.textContent}</a>`;
  });

  html += '</ul>'.repeat(stack.length);
  tocContainer.innerHTML = `<h2>目录</h2>${html}`;
  document.body.prepend(tocContainer);
}

generateOptimizedTOC();

标签: 目录js
分享给朋友:

相关文章

js实现拖拽

js实现拖拽

实现拖拽的基本步骤 通过监听鼠标事件(mousedown、mousemove、mouseup)实现拖拽功能。以下是核心代码逻辑: const draggableElement = document.…

js实现复制功能

js实现复制功能

使用 document.execCommand 方法 这种方法适用于较旧的浏览器,但在现代浏览器中可能被逐步淘汰。通过创建一个临时的 textarea 元素,将文本内容放入其中,然后执行复制命令。…

js实现图片放大缩小

js实现图片放大缩小

实现图片放大缩小的基础方法 使用CSS的transform: scale()属性可以快速实现图片的放大缩小效果。通过JavaScript动态修改该属性值: const img = document.…

js实现目录

js实现目录

实现目录的基本思路 在JavaScript中实现目录功能通常涉及以下几个核心步骤:解析文档中的标题元素(如h1-h6),动态生成目录结构,并添加交互逻辑(如点击跳转)。以下是具体实现方法: 解析标题…

js实现滚动

js实现滚动

实现滚动效果的方法 在JavaScript中实现滚动效果可以通过多种方式完成,以下是一些常见的方法: 使用window.scrollTo() window.scrollTo()方法可以将页面滚动到指…

js 实现滚动

js 实现滚动

实现滚动的方法 使用 window.scrollTo() window.scrollTo() 方法可以滚动到文档中的特定位置。可以指定 x 和 y 坐标,或者使用平滑滚动的选项。 // 滚动到指定位…