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>

最终效果

目录
相关文章
|
7月前
|
JavaScript 前端开发 开发者
Vue 动态添加 HTML 元素组件封装使用方法及长尾关键词优化指南
本文详细介绍了Vue中动态添加HTML元素的使用方法与组件封装技巧。内容涵盖条件渲染(v-if/v-show)、列表渲染(v-for)、动态组件(:is)、手动操作DOM及动态创建组件实例等核心方法。同时,通过动态表单、弹窗组件和动态加载组件的封装示例,展示如何提升代码复用性和可维护性。最后,总结性能优化策略与注意事项,如批量更新DOM、懒加载大型组件及避免直接操作DOM等,帮助开发者在实际项目中灵活应用Vue动态元素管理功能。
206 15
|
7月前
|
JavaScript 前端开发 开发者
Vue 动态添加 HTML 元素组件封装使用方法及长尾关键词优化指南
本文详细介绍了Vue中动态添加HTML元素的多种方法与组件封装技巧,涵盖条件渲染(v-if/v-show)、列表渲染(v-for)、动态组件(:is)、手动DOM操作及动态创建组件实例等内容。同时提供了性能优化建议,如批量更新DOM、使用v-show代替v-if以及懒加载大型组件等。通过合理封装组件,可提高代码复用性和维护性。文中还附有具体示例代码,帮助开发者更好地理解和应用相关技术。适用于前端开发人员学习和实践Vue动态元素处理与组件设计。
178 19
|
7月前
|
缓存 JavaScript 前端开发
Vue 项目中动态添加 HTML 元素的方法与实践
本文探讨了 Vue 中动态添加 HTML 元素的多种技术方案,包括条件渲染(v-if/v-show)、动态组件(component :is)、手动挂载($mount)及 Vuex 状态管理等方法。通过实例分析,如动态表单生成器与全局模态框服务,展示了这些方案在实际开发中的应用。同时提供了性能优化建议和注意事项,帮助开发者根据需求选择最佳方式,在保持 Vue 响应式特性的同时实现灵活交互。附带代码示例,便于理解和实践。
199 2
|
11月前
|
前端开发 JavaScript
【02】v1.0.1更新增加倒计时完成后的放烟花页面-优化播放器-优化结构目录-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
【02】v1.0.1更新增加倒计时完成后的放烟花页面-优化播放器-优化结构目录-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
322 14
【02】v1.0.1更新增加倒计时完成后的放烟花页面-优化播放器-优化结构目录-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
|
JavaScript 前端开发 安全
vue -- 指令 -- v-text/html/on/show/if/bind/for/model
【10月更文挑战第17天】Vue 指令是构建 Vue 应用的基础工具,掌握它们的特性和用法是成为一名优秀 Vue 开发者的重要一步。通过深入理解和熟练运用这些指令,可以打造出更加出色的前端应用。
185 50
|
JavaScript 前端开发
react字符串转为dom标签,类似于Vue中的v-html
本文介绍了在React中将字符串转换为DOM标签的方法,类似于Vue中的`v-html`指令,通过使用`dangerouslySetInnerHTML`属性实现。
406 0
react字符串转为dom标签,类似于Vue中的v-html
|
JavaScript 前端开发 容器
Vue生成PDF文件攻略:html2canvas与jspdf联手,中文乱码与自动换行难题攻克
Vue生成PDF文件攻略:html2canvas与jspdf联手,中文乱码与自动换行难题攻克
1747 0
|
资源调度 JavaScript 应用服务中间件
HTML、WebStrom和Vue使用
HTML、WebStrom和Vue使用
80 3
|
JavaScript 前端开发
基于Vue实现具有固定表头、合并单元格的Html表格
本文介绍了如何在Vue框架中创建一个具有固定表头和合并单元格功能的HTML表格,通过CSS的`position: sticky`属性实现表头固定,并通过设置`rowspan`和`colspan`属性来实现单元格合并。
374 0
基于Vue实现具有固定表头、合并单元格的Html表格
|
JSON JavaScript 数据格式
文本-----wangEditor的使用,设置和获取内容,展示HTML无样式怎么办????console同步展示怎样写,Vue的配置在Vue3配置文件中的配置,是editor中的v-model绑定的值
文本-----wangEditor的使用,设置和获取内容,展示HTML无样式怎么办????console同步展示怎样写,Vue的配置在Vue3配置文件中的配置,是editor中的v-model绑定的值