当前位置:首页 > JavaScript

实现目录js

2026-04-05 17:27:52JavaScript

实现目录功能的 JavaScript 方法

动态生成目录结构

通过遍历 HTML 文档中的标题标签(如 h1, h2, h3 等),动态创建目录列表。使用 document.querySelectorAll 获取所有标题元素,并为每个标题生成对应的目录项。

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

  headings.forEach((heading, index) => {
    const level = parseInt(heading.tagName.substring(1));
    const indent = (level - 1) * 20;
    const tocItem = document.createElement('div');
    tocItem.style.marginLeft = `${indent}px`;
    tocItem.innerHTML = `<a href="#${heading.id || `heading-${index}`}">${heading.textContent}</a>`;
    tocContainer.appendChild(tocItem);
  });

  document.body.prepend(tocContainer);
}

平滑滚动效果

为目录链接添加平滑滚动行为,提升用户体验。使用 scrollIntoView 方法实现平滑滚动效果。

document.querySelectorAll('#toc a').forEach(link => {
  link.addEventListener('click', function(e) {
    e.preventDefault();
    const targetId = this.getAttribute('href').substring(1);
    const targetElement = document.getElementById(targetId);
    targetElement.scrollIntoView({ behavior: 'smooth' });
  });
});

自动高亮当前阅读位置

实现目录js

监听滚动事件,根据当前视口位置高亮对应的目录项。通过比较元素位置与视口位置,确定当前阅读的章节。

window.addEventListener('scroll', function() {
  const headings = document.querySelectorAll('h1, h2, h3, h4, h5, h6');
  let currentHeading = null;

  headings.forEach(heading => {
    const rect = heading.getBoundingClientRect();
    if (rect.top >= 0 && rect.top <= 200) {
      currentHeading = heading;
    }
  });

  if (currentHeading) {
    document.querySelectorAll('#toc a').forEach(link => {
      link.classList.remove('active');
      if (link.getAttribute('href') === `#${currentHeading.id}`) {
        link.classList.add('active');
      }
    });
  }
});

CSS 样式增强

为目录添加基本样式,包括字体、间距和活动状态指示。

实现目录js

#toc {
  position: fixed;
  left: 20px;
  top: 20px;
  background: white;
  padding: 10px;
  border: 1px solid #ddd;
  max-width: 300px;
  max-height: 80vh;
  overflow-y: auto;
}

#toc a {
  display: block;
  padding: 5px 0;
  color: #333;
  text-decoration: none;
}

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

响应式设计考虑

添加媒体查询确保目录在不同设备上都能正常显示和使用。

@media (max-width: 768px) {
  #toc {
    position: static;
    max-width: 100%;
    margin-bottom: 20px;
  }
}

初始化调用

在页面加载完成后自动生成目录。

document.addEventListener('DOMContentLoaded', function() {
  generateTOC();
});

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

相关文章

js 实现vue

js 实现vue

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

uniapp 目录

uniapp 目录

uniapp 目录结构 uniapp 的目录结构遵循 Vue.js 项目的规范,同时包含一些特有的文件和目录。以下是典型的 uniapp 项目目录结构及其说明: project-name/ ├──…

js实现防洪

js实现防洪

防抖(Debounce)实现 防抖的核心思想是在事件触发后延迟执行回调函数,若在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口调整等场景。 function debounce(f…

js实现游标

js实现游标

使用JavaScript实现游标 在JavaScript中,可以通过操作DOM元素的cursor样式属性来实现自定义游标效果。以下是几种常见的实现方法: 修改默认鼠标指针样式 通过CSS的curso…

链表实现js

链表实现js

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

js实现下拉菜单

js实现下拉菜单

使用HTML和CSS创建基础结构 HTML部分需要包含一个触发下拉的按钮和隐藏的下拉菜单内容: <div class="dropdown"> <button class="dr…