一些网站文章正文前有个目录导航,这是根据本文的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%;
}
}版权声明:本文由三循信息发布,如需转载请注明出处,如需分享可点击上方生成海报按钮。
因为前段时间更改了西京同城导航网站的程序,导致以前许多页面打不开,看在眼里急在心里,如何解决呢?第一步:登录宝塔后台网站设置的伪静态规则页面,一律删除以前程序用到的伪静态规则第二步:利用万能的百度后知道在配置文件中需要添加以下代码serve...
众所周知,根据搜索引擎的喜好,相同内容的页面最好是只有一个URL网址,一些新手站长可能不注意,自己做的网站同个网页会出现2个或者4个URL可以访问。这些网址形式如: htttp://www.nqnh.com http://nqn...
本人电脑以前是win10系统21H1版本,已经手动关闭了系统自带所有广告提示,今天电脑自动升级到了22H2版本,居然在使用本地搜索功能时出现一个热门搜索栏。里面显示乱七八糟的推荐内容,一旦点击,就会跳转到Edge浏览器中Bing搜索结果页面...
本文源自义乌之狼微信群内一个群友分享的三张引流图片,觉得挺有价值,特在此分享。一、引流指导思想1.1引流(革命)思想,指导路线革命指导思想--农村包围城市,武装夺取政权;引流指导思想-广告化(形式)策略,流水化(批量)生产。1.2思想策略,...
许多做网站的同学对在国内合法开办网站需要哪些证件可能不是很清楚,下面做一个总结:ICP许可证:主要用作于信息发布及经营性收付费功能的网站;EDI许可证:用作于电商类网站,具有第三方商家入驻的功能;呼叫中心业务许可证:用作于坐席外包,电话外呼...
下面方法主要用的display:inline-block属性,设置同行DIV宽度,另一个DIV用margin限制宽度。按照文档流默认显示方法CSS两列布局,右侧固定,左侧自适应宽度 <div style="widt...