一些网站文章正文前有个目录导航,这是根据本文的h标签自动添加上去的,一些朋友可能需要这样的功能,其实本站文章页面也是如此显示,但此种写法只适用Zblog系统,下面给出个通用方案。
要实现的效果类似下图
本文分享具体代码,主要涉及正文html, JS, CSS三部分文件,请参考自己实际程序修改。使用说明
将HTML中的<div id="toc-container"></div>放在你想要显示目录的位置
确保文章内容包含在<article class="content">中(可修改配置中的选择器)
标题需要包含在配置的heading标签内(默认h2-h4)
可选功能:
修改config.scrollOffset调整滚动偏移量
设置config.collapseDepth控制默认折叠层级
通过CSS自定义目录样式
<!-- HTML 部分 --> <div id="toc-container"></div> <!-- 目录将插入到这里 --> <article class="content"> <!-- 你的文章内容,包含 h2/h3/h4 等标题 --> </article>
/* CSS 样式 */
#toc-container {
position: fixed;
left: 20px;
top: 50%;
transform: translateY(-50%);
background: #f5f5f5;
padding: 15px;
border-radius: 8px;
max-width: 300px;
max-height: 80vh;
overflow-y: auto;
}
.toc-list {
list-style: none;
padding-left: 0;
margin: 0;
}
.toc-list li {
margin: 5px 0;
line-height: 1.4;
}
.toc-list a {
color: #333;
text-decoration: none;
transition: color 0.3s;
}
.toc-list a:hover {
color: #007bff;
}
.toc-list .active > a {
color: #007bff;
font-weight: bold;
}
/* 嵌套列表缩进 */
.toc-list ul {
padding-left: 1em;
list-style: none;
border-left: 1px solid #ddd;
}function generateTOC() {
// 配置参数
const config = {
container: '#toc-container', // 目录插入位置
content: '.content', // 内容区域选择器
headings: ['h2', 'h3', 'h4'], // 要包含的标题标签
scrollSmooth: true, // 是否平滑滚动
scrollOffset: 20, // 滚动偏移量(px)
collapseDepth: 0 // 默认展开层级(0=全部展开)
};
// 获取所有目标标题
const headings = document.querySelectorAll(config.content + ' ' + config.headings.join(', '));
if (headings.length === 0) return;
// 创建目录容器
const container = document.querySelector(config.container);
const tocWrapper = document.createElement('div');
tocWrapper.className = 'toc-wrapper';
// 创建列表
const tocList = document.createElement('ul');
tocList.className = 'toc-list';
let currentUl = tocList;
const stack = [tocList];
let previousLevel = 0;
headings.forEach((heading, index) => {
// 确保标题有ID
if (!heading.id) {
heading.id = 'heading-' + index;
}
// 获取标题级别
const level = parseInt(heading.tagName.substring(1));
// 创建列表项
const listItem = document.createElement('li');
const link = document.createElement('a');
link.href = '#' + heading.id;
link.textContent = heading.textContent;
// 添加点击事件
link.addEventListener('click', (e) => {
e.preventDefault();
scrollToHeading(heading);
});
// 处理嵌套层级
if (level > previousLevel) {
const newUl = document.createElement('ul');
newUl.className = 'toc-list';
listItem.appendChild(newUl);
stack.push(newUl);
currentUl = newUl;
} else if (level < previousLevel) {
const popCount = previousLevel - level;
for (let i = 0; i < popCount; i++) {
stack.pop();
}
currentUl = stack[stack.length - 1];
}
listItem.appendChild(link);
currentUl.appendChild(listItem);
previousLevel = level;
});
// 插入目录
tocWrapper.appendChild(tocList);
container.appendChild(tocWrapper);
// 平滑滚动函数
function scrollToHeading(heading) {
const offset = heading.getBoundingClientRect().top + window.scrollY - config.scrollOffset;
window.scrollTo({
top: offset,
behavior: config.scrollSmooth ? 'smooth' : 'auto'
});
}
// 高亮当前章节(可选)
function updateActiveLink() {
const links = tocWrapper.querySelectorAll('a');
links.forEach(link => {
const section = document.querySelector(link.getAttribute('href'));
const rect = section.getBoundingClientRect();
if (rect.top <= config.scrollOffset && rect.bottom >= 0) {
link.parentElement.classList.add('active');
} else {
link.parentElement.classList.remove('active');
}
});
}
// 滚动监听
window.addEventListener('scroll', () => {
updateActiveLink();
});
}
// 初始化目录生成
document.addEventListener('DOMContentLoaded', generateTOC);通过上面的代码修改已经实现了基本需求功能,下面代码是让显示更加完美。
这个实现方案有以下特点:
自动识别标题层级并生成嵌套目录
支持平滑滚动定位
自动添加锚点ID
当前阅读位置高亮
响应式设计
可通过CSS完全自定义样式
你可以根据实际需求调整配置参数和样式表现。要修改包含的标题级别,只需修改配置中的headings数组即可(例如改为['h2', 'h3'])
JS增加部分代码实现点击展开折叠
// 在link.addEventListener点击事件中添加:
if (e.target.nextElementSibling?.tagName === 'UL') {
e.target.nextElementSibling.classList.toggle('collapsed');
}在CSS中添加下面代码实现自动添加序号和自适应
.toc-list li {
counter-increment: section;
}
.toc-list li a::before {
content: counters(section, ".") ". ";
}
@media (max-width: 768px) {
#toc-container {
position: static;
max-width: 100%;
}
}版权声明:本文由三循信息发布,如需转载请注明出处,如需分享可点击上方生成海报按钮。
本文源自义乌之狼微信群内一个群友分享的三张引流图片,觉得挺有价值,特在此分享。一、引流指导思想1.1引流(革命)思想,指导路线革命指导思想--农村包围城市,武装夺取政权;引流指导思想-广告化(形式)策略,流水化(批量)生产。1.2思想策略,...
PbootCMS是一个很不错的PHP建站系统,但后台一些明显的PbootCMS字样看着不舒服,本人在此分享下自己和其他网友总结出来的经验。特别说明,本人只是修改一些明显的碍眼字样,请大家一起尊重PbootCMS 知识产权。(一)后台登录界面...
屏蔽IOS18系统更新说明苹果手机有很不错的用户体验,但苹果IOS系统总是提示自动更新,对一些有特殊版本需求的朋友来说,这点就很讨厌了。贝联科技在此分享苹果IOS系统屏蔽自动更新18系统的最新办法和描述文件,希望对您有所帮助。特别说明,本方...
以下为PbootCMS网站模板可用标签收集整理大全,免费分享1、公司信息标签适用范围:全站任意地方均可使用。标签作用:用于调取网站与公司相关的信息,对应后台的“基础内容>公司信息”。{pboot:companyname}公司名称{pb...
因为本人需要和长安银行每季度进行网银对账,每每碰到Win10系统不好登录长安银行网银网站问题,在此分享解决办法。不得不说这些银行真的落伍,什么年代了还让客户必须用IE浏览器访问你的网站才可以登录。微软公司启用了谷歌内核的Edge浏览器,不再...
因为朋友的华为云主机出了问题,我需要给重新安装系统和做好一个企业网站。本人也是摸索学习,这里总结下经验,附宝塔官方安装教程步骤一:华为云重装系统打开网址 https://www.huaweicloud.com 登录进入弹...