tocbot生成文章目录

news/2024/12/28 21:37:34/

学习链接

github上的tocbot
npmjs上的tocbot

效果图

在这里插入图片描述

使用步骤

1. 安装tocbot

npm install tocbot --save

2. vue组件中使用引入tocbot

只需要引入tocbot,然后调用tocbot.init(…),指定提取的文章内容所在的dom,以及要把生成的目录放到哪个dom里面,就可以生成目录了。

注意:tocbot要求原文章内容的h1-h6标签必须要有id才可以跳转的哦

<style lang="scss">
@import 'tocbot/src/scss/tocbot';
@import url('https://fonts.font.im/css?family=Roboto');body {margin: 0;
}/* 整个滚动条 */
::-webkit-scrollbar {width: 10px;height: 10px;
}/* 滚动条上的滚动滑块,参考: 滚动条样式修改->https://blog.csdn.net/coder_jxd/article/details/124213962 */
::-webkit-scrollbar-thumb {background-color: #49b1f5;/* 关键代码 */background-image: -webkit-linear-gradient(45deg,rgba(255, 255, 255, 0.4) 25%,transparent 25%,transparent 50%,rgba(255, 255, 255, 0.4) 50%,rgba(255, 255, 255, 0.4) 75%,transparent 75%,transparent);border-radius: 32px;
}/* 添加行号插件后,它默认把滚动条给覆盖了,所以将padding-left改成margin-left */
[class*=v-md-prism-] {margin-left: 72px !important;padding-left: 0 !important;
}/* 滚动条样式,参考: */
/* 滚动条轨道 */
::-webkit-scrollbar-track {background-color: #dbeffd;border-radius: 32px;
}/* 行号相关样式 */
pre {background-color: #282c34;border-radius: 6px;position: relative;.line-numbers {position: absolute;color: #e0e0e0;font-size: 16px;margin: 16px 0;padding-right: 10px;width: 30px;text-align: right;font-family: 'Roboto', sans-serif;border-right: 1px solid #c5c5c5;}
}code {font-family: 'Roboto', sans-serif;border-radius: 6px;padding-left: 0 !important;margin-left: 3em !important;}ul,
li {margin: 0;padding: 0;list-style: none;
}.article {width: 600px;display: flex;width: 1200px;margin: 0 auto;margin-top: 50px;.article-content {width: 725px;padding: 15px;// border: 1px solid red;border-radius: 5px;box-shadow: 0 2px 8px 0 rgba(0, 0, 0, 0.16);flex-basis: 75%;}/* 目录相关样式 */.right-container {color: #666261;padding-left:  15px;.toc-wrapper {position: sticky;top: 10px;flex-basis: 25%;box-shadow: 0 4px 8px 6px rgba(7, 17, 27, .06);padding: 20px;border-radius: 10px;.toc-header {display: flex;align-items: center;padding: 10px;}#toc-content {position: sticky;top: 20px;box-sizing: border-box;width: 300px;// border: 1px solid red;background-color: #fff;a {transition: all 0.3s;text-decoration: none;display: block;line-height: 1.6em;padding-left: 10px;border-left: 4px solid transparent;&::before {display: none;}&.is-active-link {font-weight: normal;color: #fff;background-color: #00c4b6;border-left-color: #009d92;}}}}}}
</style><template><div class="article"><!-- <div style="height: 500px;"> </div> --><div class="article-content" id="article-content" v-html="htmlContent"></div><div class="right-container"><div class="toc-wrapper"><div class="toc-header"><img src="@/assets/svg/menu.svg" style="margin-right: 8px;" width="16px" height="16px" alt=""><span>目录</span></div><div id="toc-content"></div></div></div></div>
</template><script>
import { getArticle } from '@/api/articleApi'import hljs from 'highlight.js';
import 'highlight.js/styles/atom-one-dark.css'console.log(hljs);import tocbot from 'tocbot'
console.log('tocbot', tocbot);export default {name: 'Article',data() {return {htmlContent: ''}},created() {getArticle(this.$route.params.articleId).then(data => {this.htmlContent = data.htmlContentthis.$nextTick(() => {// console.log('$nextTick...');let articleContent = document.querySelector('#article-content')let headingTag = ['h1', 'h2', 'h3']let children = Array.from(articleContent.children)for (let i = 0; i < children.length; i++) {const e = children[i];e.id = `h-${i}`}hljs.highlightAll()let codes = document.querySelectorAll('code')console.log(codes);for (let i = 0; i < codes.length; i++) {const codeBlock = codes[i];// console.log(codeBlock.innerHTML);let lineTotal = codeBlock.innerHTML.split('\n').lengthlet ul = document.createElement('ul')ul.classList.add('line-numbers')for (let i = 1; i <= lineTotal; i++) {let li = document.createElement('li')let lineNum = document.createTextNode(i)li.appendChild(lineNum)ul.appendChild(li)}codeBlock.parentNode.prepend(ul)}tocbot.init({// Where to render the table of contents.tocSelector: '#toc-content',// Where to grab the headings to build the table of contents.contentSelector: '#article-content',// Which headings to grab inside of the contentSelector element.headingSelector: 'h1, h2, h3, h4, h5, h6',// For headings inside relative or absolute positioned containers within content.hasInnerContainers: true,});})})},mounted() {// console.log('mounted');},components: {}
}
</script>

tocbot生成的目录结构

在这里插入图片描述


http://www.ppmy.cn/news/42452.html

相关文章

数据分析师 ---- SQL强化(2)

数据分析师 ---- SQL强化(2) 文章目录数据分析师 ---- SQL强化(2)题目一&#xff1a;SQL实现文本处理题目二&#xff1a;语种播放量前三高所有歌曲总结&#xff1a;题目一&#xff1a;SQL实现文本处理 现有试卷信息表examination_info&#xff08;exam_id试卷ID, tag试卷类别,…

验证码识别过程中切割图片的几种方案

目录 方案一&#xff1a;图片均分 方案二&#xff1a;寻找轮廓并截取 方案三&#xff1a;聚类算法 方案四&#xff1a;垂直投影法 源码下载 在用机器学习识别验证码的过程中&#xff0c;我们通常会选择把验证码中的各个字符切割出来然后单独识别&#xff0c;切割质量会直接…

Leetcode.2521 数组乘积中的不同质因数数目

题目链接 Leetcode.2521 数组乘积中的不同质因数数目 Rating &#xff1a; 1413 题目描述 给你一个正整数数组 nums&#xff0c;对 nums所有元素求积之后&#xff0c;找出并返回乘积中 不同质因数 的数目。 注意&#xff1a; 质数 是指大于 1 且仅能被 1 及自身整除的数字。…

linux替换jar中的文件(小修改,大修改还是整包发布稳妥)

当我们上线某个应用发现有个小bug需要修改,而且改动的地方并不是很多,比如,修改application.yml文件或者替换几个class文件,此时如果找到源文件修改后重新打包替换重启有点繁琐,就可以使用此方式修改。 目录 修改配置文件 修改class文件 附录:jar的命令 修改配置文件 …

一文快速回顾 Servlet、Filter、Listener

什么是Servlet&#xff1f; 前置知识&#xff1a; Web 服务器&#xff1a;可以指硬件上的&#xff0c;也可以指软件上的。从硬件的角度来说&#xff0c; Web 服务器指的就是一台存储了网络服务软件的计算机&#xff1b;从软件的角度来说&#xff0c; Web 服务器指的是一种软件…

【Python搞笑游戏】因蔡徐坤打篮球动作超火,被某程序员写成了一款游戏,画面美到不敢看,成功学到了精髓~(附源码免费)

导语 之前网络最火的梗&#xff0c;非“C徐坤打篮球”莫属。个人感觉&#xff0c;只有多年前的“春哥纯爷们”堪与匹敌&#xff01; 虽然说C徐坤打篮球是一个老梗了&#xff0c;但是确实非常搞笑&#xff0c;今天就跟着小编一起来回忆一下吧&#xff01; “我是练习两年半的…

creator-assetbundle分包

title: creator-assetbundle分包 categories: Cocos2dx tags: [creator, 分包, assetbundle] date: 2023-04-10 15:55:22 comments: false mathjax: true toc: true creator-assetbundle分包 前篇 Asset Bundle 介绍 - https://docs.cocos.com/creator/manual/zh/asset/bundle…

【论文笔记】CRN: Camera Radar Net for Accurate, Robust, Efficient 3D Perception

原文链接&#xff1a;https://arxiv.org/abs/2304.00670 1. 引言 本文提出两阶段融合方法CRN&#xff0c;能使用相机和雷达生成语义丰富且位置精确的BEV特征。具体来说&#xff0c;首先将图像透视特征转换到BEV下&#xff0c;该步骤依赖雷达&#xff0c;称为雷达辅助的视图变换…