帝国CMS 让网站自动生成文章的章节目录索引的js、css代码
微wx笑 2021-08-04【帝国CMS】 10 0关键字: 帝国CMS 章节 目录 js
这篇文章主要介绍了让帝国CMS搭建的博客能自动生成文章的章节目录索引的js、css代码实现,需要的朋友可以参考下
一个好的博文除了博文的质量要好以外,好的组织结构也能让读者阅读的更加舒服与方便,我看很多人的博客文章都是分章节的,并且在博文的前面都带有章节的目录索引,点击索引之后会跳转到相应的章节阅读,并且还可以回到目录顶端,当然这种结构如果是在写博文的时候人工设置那是非常麻烦的,无疑是增加了写作人的工作量。如果能自动生成章节索引岂不是节省了一大堆工作量。
原理
文章的标题是使用“<h1>”标签,
章节目录从“<h2>”标签开始直到“<h7>”标签,当然使用的标签层次越多,目录层级就越深,实现的时候先找到文章到的所有“<h2>”标签,再一级一级的往下找,1是生成目录内容,2是为章节添加锚点,这样点击目录的时候就能自动跳到对应的位置了。
一、修改内容模板
模板管理》内容模板》管理内容模板》修改文章使用的内容模板,添加一个“div”标签,用来显示目录内容
<div id="contents"></div>
二、添加js代码
可以是添加到内容模板中,也可以添加到相关的js文件中,我是放在了“/js/comm.js”文件中
$(document).ready(function(){ var contents = "<p>目录</p><ul>"; $("article h2").each(function(idx, ele){ ele.innerHTML = "<a href='javascript:void(0)' name='h2"+idx+"'>" + ele.innerText + "</a>"; contents += "<li><a href='#h2"+idx+"'>" + ele.innerText + "</a></li>"; }); contents += "</ul>"; $("#contents").html(contents); });
注意:代码依赖 JQuery
三、添加css样式
修改文章页面的css样式文件添加目录相关样式
#contents { border: 1px solid #CCCCCC; padding: 0 10px 10px 10px; margin: 10px 0; display: inline-block; } #contents p { font-size: 20px; font-weight: bold; } #contents ul { margin: 0 10px; padding: 0 10px; } #contents ul li { list-style: disc; line-height: 26px; } #contents ul li a { color: rgb(51, 122, 183); }
2021-08-14更新,支持多级目录
上面的代码只是实现了一级目录功能,下面给出多级目录的代码:
递归函数
function generateContents(parentSelector, pIdx, cIdx, next){ var contents = ""; if (!pIdx){ pIdx = ""; } if (!cIdx){ cIdx = 2; } var sltor = ""; if (!parentSelector){ parentSelector = "article"; sltor = $(parentSelector + " h" + cIdx); contents = "<p>目录</p>"; }else{ if (!next){ sltor = $(parentSelector).nextAll("h" + cIdx); }else{ sltor = $(parentSelector).nextUntil(next, "h" + cIdx); } } var sctts = ""; if (sltor.length > 0){ sctts = "<ul class='nav'>"; for(var i = 0; i < sltor.length; i++){ sltor[i].id = "csH" + pIdx + cIdx + i; sltor[i].innerHTML = "<a name='"+sltor[i].id+"'></a>" + sltor[i].innerText; sctts += "<li><a href='#"+sltor[i].id+"'>" + sltor[i].innerText + "</a></li>"; var next2 = next; if (i < sltor.length - 1){ next2 = $(sltor[i+1]); } sctts += generateContents("#"+sltor[i].id, pIdx + cIdx + i, cIdx+1, next2); } sctts += "</ul>"; contents += sctts; }else{ contents = ""; } return contents; }
调用方法
$(document).ready(function(){ var contents = generateContents(); if (contents.length > 0){ $("#contents").html(contents); }else{ $("#contents").hide(); } });
说明
<article>标签为文章内容的容器,递归函数“generateContents”调用时不需要传递任何参数,默认会遍历<article>标签中的<h2~7>标签。
本文由 微wx笑 创作,采用 署名-非商业性使用-相同方式共享 4.0 许可协议,转载请附上原文出处链接及本声明。
原文链接:https://www.ivu4e.cn/blog/EmpireCMS/2021-08-04/712.html