当前位置:首页 > 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实现vue

js实现vue

Vue.js 简介 Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。其核心库专注于视图层,易于与其他库或现有项目整合。 实现 Vue.js 的基本步骤 安装 Vue.…

js实现验证

js实现验证

验证表单输入 使用JavaScript验证表单输入是常见的需求。可以通过监听表单提交事件,检查输入字段是否符合要求。 document.getElementById('myForm').addEve…

js 实现vue

js 实现vue

Vue.js 的基本实现 在 JavaScript 中实现 Vue.js 的核心功能,可以通过数据绑定、响应式系统和虚拟 DOM 来实现。以下是实现 Vue.js 核心功能的简化版本。 数据响应式系…

js实现报表

js实现报表

使用JavaScript实现报表 在JavaScript中实现报表功能可以通过多种方式完成,常见的方法包括使用原生JavaScript、第三方库(如Chart.js、D3.js)或结合后端数据渲染。以…

jquery js

jquery js

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画和 Ajax 交互。它兼容多种浏览器,提供易于使用的 API,使开发者能够更高…

js实现百叶窗

js实现百叶窗

使用CSS和JavaScript实现百叶窗效果 通过CSS动画和JavaScript事件监听可以实现百叶窗效果。核心思路是将内容区域分割为多个条状元素,通过控制它们的展开/折叠状态来模拟百叶窗。…