【前端】利用正则生成目录,附加解决a链接锚点偏移

前言

从html字符串中提取出来目录。
目标和源内容都很明确,源内容是html字符串,提取目标是html字符串中h1~h6元素和其闭合标签中间的内容

思路

分析

获取html字符串

第一步要获取html字符串内容。

观察html字符串

第二步, 观察html字符串,并设计适合提取所需部分内容的正则

将提取内容转换成a链接列表

第三步,将提取的内容转成a链接列表,这就是目录了,样式和其他附属功能自行设计。

注意 :a链接锚点跳转指定位置,是从视口顶部为基准的,如果你顶部有其他遮挡物,例如固定定位导航栏,则会被遮挡,这时候就需要锚点偏移导航高度的距离。

实现

获取html字符串

我这里直接获取了。类似于这样的内容:

<h1><a id=\"_0\"></a>前言</h1>\n<p>canvas内的显示内容如何拖动?<br />\n这里提供一个 canvas内矩形移动的解决思路。<br />\n<img src=\"https://img-blog.csdnimg.cn/95b67cea8c964e3398c19cc4ff74b393.png\" alt=\"在这里插入图片描述\" /></p>\n<p><img src=\"https://img-blog.csdnimg.cn/89c65dea74dc43b095607f6c57ce8210.png\" alt=\"在这里插入图片描述\" /></p>\n<h1><a id=\"_7\"></a>描述</h1>\n<p><strong>如何选中canvas里的某部分矩形内容,然后进行拖动?</strong><br />

观察字符串

观察上面的字符串,提出h1~h6元素和其中的内容即可作为目录,其中内容可能是任意内容。

正则设计

刚好复习下js的正则。MDN正则链接
正则设计思路:

  1. 前面是"<h1>“…到”<h2>"的内容,则正则为: /<h[1-6]>/。
  2. 后面肯定是前面相对的闭合标签,则正则为:/</h[1-6]>/。
  3. 中间包括任何内容。任何内容我理解为啥都行,啥的匹配,则正则为 [\w | \W]*? ,注意这里很巧妙,[\w|\W]*代表任何内容的0到无数次,*后面再加?则变成非贪婪模式,就是最小(最短)匹配。
  4. 使用全局匹配,加g。
    最后,我设计的正则为
/<h([1-6])>[\w|\W]*?<\/h\1>/g

我前面加了个()捕获组,后面使用\1,可以对应起来,如果你还想将标签内的内容存储起来,则需要()括起来,获取指定捕获组名称(?<Name>x),x为要捕获的正则项。

提取内容转成a链接列表。

let content="<h1><a id=\"_0\"></a>前言</h1>\n<p>canvas内的显示内容如何拖动?<br />\n这里提供一个 canvas内矩形移动的解决思路。<br />\n<img src=\"https://img-blog.csdnimg.cn/95b67cea8c964e3398c19cc4ff74b393.png\" alt=\"在这里插入图片描述\" /></p>\n<p><img src=\"https://img-blog.csdnimg.cn/89c65dea74dc43b095607f6c57ce8210.png\" alt=\"在这里插入图片描述\" /></p>\n<h1><a id=\"_7\"></a>描述</h1>"
const regex = /<h([1-6])>[\w|\W]*?<\/h\1>/g
 let arr = content.match(regex);

结果和下图类似就成功:
在这里插入图片描述

转a链接

上面提取内容发现a链接没内容,内容再</a>和</h[1-6]>内,所以需要提取下然后替换。

 arr = arr
      ? arr.map((item: string) => {
          let str = item.replace('id="', 'target="_self" href="#');
          let s1 = str.match(/<\/a>(?<text>[\w| \W]+)<\/h[1-6]>/);
          str = str.replace('</a>' + s1.groups.text, s1.groups.text + '</a>');

          return str;
        })
      : [];

转后结果:
在这里插入图片描述
上面的就是a链接html字符串列表。把他和html字符串同一面显示即可生效。

优化

实现锚点链接滚动有简单过渡效果

html {
  scroll-behavior: smooth;
}

解决锚点跳转偏移。

给html字符串中a链接添加padding-top=要偏移的距离。
实测可行,建议加全局属性需慎重,最后前面加限制范围,刚好只影响你当前页面即可。
例如:

.markdown-body a {
  padding-top: 88px !important;
}

效果

在这里插入图片描述

结语

结束了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/209544.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙开发笔记

最近比较火&#xff0c;本身也是做前端的&#xff0c;就抽空学习了下。对前端很友好 原视频地址&#xff1a;黑马b站鸿蒙OS视频 下载安装跟着视频或者文档就可以了。如果你电脑上安装的有node&#xff0c;但是开发工具显示你没安装&#xff0c;不用动咱们的node&#xff0c;直…

《凤凰项目》读书笔记

文章目录 一、书名和作者二、书籍概览2.1 主要论点和结构2.2 目标读者和应用场景 三、核心观点与主题3.1 DevOps的核心原则与文化变革3.2 持续交付与自动化3.3 变更管理与风险控制3.4 关键绩效指标与持续改进 四、亮点与启发4.1 最有影响的观点4.2 对个人专业发展的启示 五、批…

安装以及使用 stylepro_artistic 所遇问题解决

根据https://github.com/PaddlePaddle/PaddleHub/blob/develop/docs/docs_ch/get_start/windows_quickstart.md 安装 hub install stylepro_artistic1.0.1 出现ImportError: cannot import name ‘Constant’ from ‘paddle.fluid.initializer’&#xff0c;提示在File: "…

谈谈Listener

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 Tomcat三大组件&#x…

图书馆座位预约时间冲突提示(前后端全) 前端elementUI 时间选择器只显示时和分,SQL实现时间冲突判断

背景 帮客户定制项目&#xff0c;要实现图书馆预约座位的功能。 功能描述如下&#xff1a;学生选择开始时间和结束时间&#xff0c;只选择小时和分钟&#xff0c;提交预约后&#xff0c;如果该时间有冲突提示学生修改预约时间。 问题 前端样式选择的是elmentUI&#xff0c;但…

JavaScript编程基础 – 闭包(Closure)

JavaScript编程基础 – 闭包 JavaScript Programming Essentials - Closure By JacksonML 闭包和JavaScript的作用域有关。 我们需要先理解闭包的概念。 本文简要介绍闭包函数以及环境状态&#xff0c;并用实例说明闭包的创建及其基本用法。希望对学习及开发有所帮助。 1. …

公共部门生成式人工智能的未来

作者&#xff1a;Dave Erickson 最近&#xff0c;我与 IDC Government Insights 研究副总裁阿德莱德奥布莱恩 (Adelaide O’Brien) 坐下来讨论了全球公共部门生成式人工智能的当前和未来状况。 完整的对话可以按需查看&#xff0c;但我也想强调讨论中的一些要点。 我们的目标是…

【Geoserver】SLD点位样式(PointSymbolizer)设计全通

SLD文件可以控制geoserver的样式管理&#xff0c;这里专门针对点位进行设计&#xff0c;首先点位的设计需要用到这面这个大标签 之前的项目中已经用到了很多关于面的样式管理&#xff0c;这里新学习的是关于点的样式管理 PointSymbolizer 参考资料地址&#xff1a;https://doc…

深入解析SpringBoot的请求响应机制

SpringBootWeb请求响应 前言1. 请求1.1 Postman介绍 1.2 简单参数1.2.1 原始方式1.2.2 SpringBoot方式1.2.3 参数名不一致 1.3 实体参数1.3.1 简单实体对象1.3.2 复杂实体对象 1.4 数组集合参数1.4.1 数组1.4.2 集合 1.5 日期参数1.6 JSON参数1.7 路径参数 2. 响应2.1 Response…

C#图像处理OpenCV开发指南(CVStar,06)——图片光滑处理之高斯滤波(GaussianBlur)的实现代码

1 高斯滤波 原理就不讲了&#xff0c;文章很多。 基础代码请参阅&#xff1a; C#图像处理OpenCV开发指南&#xff08;CVStar&#xff0c;03&#xff09;——基于.NET 6的图像处理桌面程序开发实践第一步https://blog.csdn.net/beijinghorn/article/details/134684471?spm10…

RHCSA学习笔记(RHEL8) - Part1.RH124

Chapter Ⅰ 入门 - Linux 开源系统&#xff0c;命令行&#xff0c;模块化&#xff08;软件包的形势&#xff09; - Windows 闭源Linux是类UNIX系统&#xff0c;mac系统也是类UNIX系统&#xff0c;所以二者的图形化界面比较相似 开源许可证&#xff1a;公共版权&#xff1b;宽…

uniapp-从后台返回的一串地址信息上,提取省市区进行赋值

1.这是接口返回的地址信息 2.要实现的效果 3.实现代码&#xff1a; <view class"address">{{item.address}}</view>listFun() {let url this.$url.url.positionInfoCompany;let param {page: this.page,limit: this.limit,keyword: this.keyword,};thi…

Rust语言项目实战(二) - 准备键盘和终端屏幕

上一章节中&#xff0c;我们实现了游戏开始音频的播放&#xff0c;本章我们开始编写游戏界面。我们的游戏是在命令行终端中运行的&#xff0c;因此编写的界面也是终端中展示的界面&#xff0c;上一章中&#xff0c;我们已经把相关的依赖包crossterm添加到了依赖列表中。本章首先…

【嵌入式Linux程序开发综合实验】-1(附流程图) | ARM开发板 | 测试“Hello World” | Makefile文件 | 实现加法相加

任务&#xff1a;编写在标准输出终端输出“Hello World&#xff01;”的C语言代码以及输入指定数字相加结果、Makefile&#xff0c;并分别编译出在PC与ARM上运行的可执行程序文件。 设备以及工具 硬件&#xff1a;Linux开发板、PC机、串口连接线 图1 Linux开发板以及串口接线 …

原生video设置控制面板controls显示哪些控件

之前我们学习了如何使用原生video播放视频 今天来一个进阶版的——设置控制面板controls显示哪些控件 先看一下当我们使用原生video时&#xff0c;controls属性为true时&#xff0c;相关代码如下&#xff1a; 正常的控制面板默认显示的控件有&#xff1a;播放、时间线、音量调…

四、Zookeeper节点类型

目录 1、临时节点 2、永久节点 Znode有两种,分别为临时节点和永久节点。 节点的类型在创建时即被确定,并且不能改变。 1、临时节点 临时节点的生命周期依赖于创建它们的会话。一旦会话结束,临时节点将被自动删除,

机器学习笔记 - 基于百度飞桨PaddleSeg的人体分割模型以及TensorRT部署说明

一、简述 虽然Segment Anything用于图像分割的通用大模型看起来很酷(飞桨也提供分割一切的模型),但是个人感觉落地应用的时候心里还是更倾向于飞桨这种场景式的,因为需要用到一些人体分割的需求,所以这里主要是对飞桨高性能图像分割开发套件进行了解和使用,但是暂时不训练…

LiteOS内存管理:TLSF算法

问题背景 TLSF算法主要是面向实时操作系统提出的&#xff0c;对于RTOS而言&#xff0c;执行时间的确定性是最根本的&#xff0c;然而传统的动态内存分配器&#xff08;DMA&#xff0c;Dynamic Memory Allocator&#xff09;存在两个主要问题&#xff1a; 最坏情况执行时间不确…

Vue3+nuxt+ts项目引入高德地图API实现步骤

看了好多相关的文章都没有完全贴合选用Vue3nuxtts框架的&#xff0c;也不太靠谱&#xff0c;只好自己踩坑实现了 首先去高德开放平台用自己的账号申请一个key&#xff0c;位置如下&#xff0c;申请好后保存好生成的key 我们使用vuemap/vue-amap&#xff0c;一个高德地图2.0版本…

微信小程序自定义tabBar简易实现

文章目录 1.app.json设置custom为true开启自定义2.根目录创建自定义的tab文件3.app.js全局封装一个设置tabbar选中的方法4.在onshow中使用选中方法最终效果预览 1.app.json设置custom为true开启自定义 2.根目录创建自定义的tab文件 index.wxml <view class"tab-bar&quo…