当前位置:首页 > 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实现复制到剪贴板

使用document.execCommand方法(传统方式,已废弃但部分浏览器仍支持) 该方法适用于旧版浏览器,但已被标记为废弃。执行前需确保文本已被选中: function copyToClipb…

js实现祖玛

js实现祖玛

实现祖玛游戏的核心思路 祖玛游戏的核心玩法是发射彩色珠子,形成三个或以上相同颜色的珠子即可消除。以下是使用JavaScript实现的基本框架。 游戏初始化 创建画布并初始化游戏状态: const…

链表实现js

链表实现js

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和一个指向下一个节点的指针(单向链表)或两个指针(双向链表)。与数组不同,链表在内存中非连续存储,插入和删除操作更高效,但随机…

js验证码的实现

js验证码的实现

验证码的基本实现原理 验证码(CAPTCHA)的核心目标是区分人类用户和自动化程序。JavaScript可用于生成或验证客户端验证码,但需注意纯前端验证可能被绕过,通常需结合后端验证。 纯前端验证码…

js进度条实现

js进度条实现

使用HTML和CSS创建基础结构 在HTML中创建一个容器元素用于显示进度条,通常使用<div>元素。CSS用于设置进度条的样式,包括宽度、高度、颜色和圆角等属性。 <div cl…

js实现复制功能实现

js实现复制功能实现

使用document.execCommand方法(传统方式,已逐渐被弃用) 传统方式通过document.execCommand('copy')实现复制功能,需先选中文本。以下是一个完整示例: fu…