html / vue 自动生成目录

简介: html / vue 自动生成目录

实现原理

获取全部内容节点,对节点进行遍历,将其中的标题节点存入目录列表中

完整范例代码 (以vue为例)

<template>
    <div style="padding: 20px">
        <div class="menuBox">
            <p>目录</p>
            <el-scrollbar ref="scrollMenuRef" class="scrollMenuBox">
                <aside v-for="i in menuList" :key="i" v-html="i.title"></aside>
            </el-scrollbar>
        </div>
        <div class="contentBox">
            <main v-for="i in Total" :key="i">
                <h1>一级标题{{i}}</h1>
                <p>内容{{i}}</p>
                <p>内容{{i}}</p>
                <p>内容{{i}}</p>
                <p>内容{{i}}</p>
                <h2>二级标题{{i}}</h2>
                <p>内容{{i}}</p>
                <p>内容{{i}}</p>
                <p>内容{{i}}</p>
                <p>内容{{i}}</p>
            </main>
        </div>
    </div>
</template>
<script>
    export default {
        data() {
            return {
                menuList: [],
                Total: 60
            }
        },
        mounted() {
            [...document.getElementsByTagName("main")]
                .forEach(item => {
                    [...item.children].forEach(
                        item2 => {
                            if (item2.tagName === "H1") {
                                this.menuList.push(
                                    {
                                        content: item2.innerText,
                                        title: item2.outerHTML,
                                        level: 1,
                                        offsetTop: item2.offsetTop
                                    }
                                )
                            }
                            if (item2.tagName === "H2") {
                                this.menuList.push(
                                    {
                                        content: item2.innerText,
                                        title: item2.outerHTML,
                                        level: 2,
                                        offsetTop: item2.offsetTop
                                    }
                                )
                            }
                            if (item2.tagName === "H3") {
                                this.menuList.push(
                                    {
                                        content: item2.innerText,
                                        title: item2.outerHTML,
                                        level: 3,
                                        offsetTop: item2.offsetTop
                                    }
                                )
                            }
                            if (item2.tagName === "H4") {
                                this.menuList.push(
                                    {
                                        content: item2.innerText,
                                        title: item2.outerHTML,
                                        level: 4,
                                        offsetTop: item2.offsetTop
                                    }
                                )
                            }
                            if (item2.tagName === "H5") {
                                this.menuList.push(
                                    {
                                        content: item2.innerText,
                                        title: item2.outerHTML,
                                        level: 5,
                                        offsetTop: item2.offsetTop
                                    }
                                )
                            }
                            if (item2.tagName === "H6") {
                                this.menuList.push(
                                    {
                                        content: item2.innerText,
                                        title: item2.outerHTML,
                                        level: 6,
                                        offsetTop: item2.offsetTop
                                    }
                                )
                            }
                        }
                    )
                })
        },
    }
</script>
<style scoped>
    /*目录悬浮*/
    .menuBox {
        position: fixed;
    }
 
    /*内容居中*/
    .contentBox {
        width: 60%;
        margin: auto;
    }
 
    /*el-scrollbar 必须指定高度*/
    .scrollMenuBox {
        height: 600px;
        width: 200px;
    }
 
    /*隐藏水平滚动条*/
    /deep/ .el-scrollbar__wrap {
        overflow-x: hidden;
    }
</style>

最终效果

目录
相关文章
|
6月前
|
JavaScript 前端开发
【快捷键配置】常用HTML类名、CSS样式名称、JS方法变量名、vue代码片段
【快捷键配置】常用HTML类名、CSS样式名称、JS方法变量名、vue代码片段
|
5天前
|
JavaScript 前端开发 安全
vue -- 指令 -- v-text/html/on/show/if/bind/for/model
【10月更文挑战第17天】Vue 指令是构建 Vue 应用的基础工具,掌握它们的特性和用法是成为一名优秀 Vue 开发者的重要一步。通过深入理解和熟练运用这些指令,可以打造出更加出色的前端应用。
8 2
|
14天前
|
JavaScript 前端开发 容器
Vue生成PDF文件攻略:html2canvas与jspdf联手,中文乱码与自动换行难题攻克
Vue生成PDF文件攻略:html2canvas与jspdf联手,中文乱码与自动换行难题攻克
23 0
|
2月前
|
JavaScript 前端开发
react字符串转为dom标签,类似于Vue中的v-html
本文介绍了在React中将字符串转换为DOM标签的方法,类似于Vue中的`v-html`指令,通过使用`dangerouslySetInnerHTML`属性实现。
65 0
react字符串转为dom标签,类似于Vue中的v-html
|
3月前
|
资源调度 JavaScript 应用服务中间件
HTML、WebStrom和Vue使用
HTML、WebStrom和Vue使用
23 3
|
3月前
|
JavaScript 前端开发
基于Vue实现具有固定表头、合并单元格的Html表格
本文介绍了如何在Vue框架中创建一个具有固定表头和合并单元格功能的HTML表格,通过CSS的`position: sticky`属性实现表头固定,并通过设置`rowspan`和`colspan`属性来实现单元格合并。
36 0
基于Vue实现具有固定表头、合并单元格的Html表格
|
4月前
|
JSON JavaScript 数据格式
文本-----wangEditor的使用,设置和获取内容,展示HTML无样式怎么办????console同步展示怎样写,Vue的配置在Vue3配置文件中的配置,是editor中的v-model绑定的值
文本-----wangEditor的使用,设置和获取内容,展示HTML无样式怎么办????console同步展示怎样写,Vue的配置在Vue3配置文件中的配置,是editor中的v-model绑定的值
|
4月前
|
JavaScript 前端开发 CDN
vue 生成分享海报、下载图片(含生成二维码qrcodejs2的使用,网页截屏html2canvas的使用)
vue 生成分享海报、下载图片(含生成二维码qrcodejs2的使用,网页截屏html2canvas的使用)
65 0
vue 生成分享海报、下载图片(含生成二维码qrcodejs2的使用,网页截屏html2canvas的使用)
|
4月前
|
JavaScript
【vue】vue 里面使用 v-html 插入的文本带有换行符‘\n‘不换行
【vue】vue 里面使用 v-html 插入的文本带有换行符‘\n‘不换行
492 0
|
4月前
|
JavaScript 前端开发 物联网
文本,Vue实现打印的方式,打印机的种类有多少,浏览器打印html,右键,2打印插件,3指令打印,vue-print-nb
文本,Vue实现打印的方式,打印机的种类有多少,浏览器打印html,右键,2打印插件,3指令打印,vue-print-nb