h标签生成目录结构实现点击定位平滑移动
1.生成树状目录结构
基于上篇文章,模拟使用线性顺序的h标签生成了树状的目录结构,只是数据结构的变化,本文将使用实际案例,实现生成目录结构并实现点击定位平滑移动。
2.案例
点击目录结构的title,页面会平滑移动到title所在的地方。
3.js实现
因为js+html+css篇幅较长,所以之展示js代码,源码可以点击这个链接下载。
http://jiajiajia.club/file/info/jF7ZJE/124
具体方法的作用看代码注释吧~
<script>
/**
* 链表节点信息
**/
function Node(data){
this.data=data;
this.next=null;
this.prev=null;
}
/**
* 双向链表数据结构
**/
function LinkedList(){
this.head=null;
this.tail=null;
/**
* 添加节点(添加的节点是尾节点)
**/
this.add=function(data){
var node=new Node(data);
if(this.head==null){
this.head=this.tail=node;
}else{
node.prev=this.tail;
this.tail.next=node;
this.tail=node;
}
}
/**
* 删除目标节点
**/
this.delete=function(node){
if(node==null){
return null;
}
if(node==this.head&&node==this.tail){
this.head=null;
this.tail=null;
}else if(node==this.head){
this.head=this.head.next;
this.head.prev=null;
}else if(node==this.tail){
this.tail=this.tail.prev;
this.tail.next=null;
}else{
node.prev.next=node.next;
node.next.prev=node.prev;
}
node.next=null;
node.prev=null;
return node;
}
}
/**
* 数据节点信息
**/
function createNode(name,level,h){
return {
name:name, //标签名称
level:level, //标签级别
child:new Array(), //标签子节点
h:h, //真实标签元素
};
}
/**
* 生成链表和树的组合结构
**/
function create(h,arr){
while(h!=null){
var li=new LinkedList();
while(h.next!=null){
if(h.next.data.level>h.data.level){
li.add(arr.delete(h.next).data)
}else {
break;
}
}
/**
* 递归生成子树
**/
create(li.head,li);
h.data.child=li;
h=h.next;
}
}
/**
* 将组合结构中的链表结构转换为数组结构
**/
function toArray(arr){
var a=new Array();
var h=arr.head;
while(h!=null){
if(h.data.child!=null){
h.data.child=toArray(h.data.child);
}
a.push(h.data);
h=h.next;
}
return a;
}
</script>
<script>
/**
* 获取所有的h标签(标签是按照顺序获取的)
**/
var hs = document.querySelectorAll("h1,h2,h3,h4,h5,h6");
/**
* 目录父容器
**/
var ml=document.getElementById("ml");
/**
* 生成树结构
**/
function getTree(hs){
var array=new LinkedList();
for(var i=0;i<hs.length;i++){
var h_number=hs[i].tagName.substring(1,2);
array.add(createNode(hs[i].innerHTML,h_number,hs[i]));
}
create(array.head,array);
return toArray(array);
}
var arrayData=getTree(hs);
var index=0;
/**
* 生成目录树节点
**/
function createCataLog(p,list){
if(list!=null&&list.length>0){
var ul=document.createElement("ul");
for(var i=0;i<list.length;i++){
var thisIndex=++index;
var li=document.createElement("li");
var span=document.createElement("span");
span.appendChild(document.createTextNode(list[i].name))
span.setAttribute("to", "id-"+thisIndex);
span.setAttribute("class", "to");
list[i].h.setAttribute("id",'id-'+thisIndex)
li.appendChild(span);
ul.appendChild(li);
if(list[i].child!=null&&list[i].child.length>0){
createCataLog(li,list[i].child);
}
}
p.appendChild(ul);
}
}
createCataLog(ml,arrayData);
/**
* 目录节点添加点击事件
**/
var tos = document.getElementsByClassName("to");
for(var i=0;i<tos.length;i++){
tos[i].addEventListener('click', function(){
to(this.getAttribute("to"));
})
}
/**
* 标签平滑移动
**/
function to(id){
var el=document.getElementById(id);
var body = document.getElementsByTagName("html")[0];
body.scrollTo({
top: el.offsetTop,
behavior: "smooth"
})
}
</script>
评论区
请写下您的评论...
猜你喜欢
javascript js html
1240
展示将文章中目标区域的h标签,生成目录结构具体代码下载下来看看吧~
前端(h5)
1753
1.前言例如在用富文本编辑器编辑文章的时候,会用到h标签来代表本段标题,那么h标签是有顺序的,例如:h标签的顺序可能是这样的h1h1h2h3h1h3h2h4那么目录结构就应该是那么目录结构应该是
前端(h5)
3288
1.锚点定位很简单两行搞定:ahref="#anchorName"点击跳转到anchorName的位置/aaname="anchorName"anchorName/a2.js代码实现,并带滑动效果
blog
linux的目录结构
linux系统
5631
linux的目录结构/bin:/usr/bin:可执行二进制文件的目录,如常用的命令ls、tar、mv、cat等。/boot:放置linux系统启动时用到的一些文件。/boot/vmlinuz为
数据结构与算法
1764
prim(普里姆)算法求出。对于任何一个数据结构或算法,理解和实现只是一个方面,更重要的是要明白它的应用范围或应用场景,最小生成树算法的应用非常广泛,例如:假设要在n个城市之间建立通信联络网,则连接n个
数据结构,算法基础
989
[数据结构与算法]
一、什么是最小生成树?二、Kruskal算法三、Prim算法一、什么是最小生成树? 在给定一张无向图,如果在它的子图中,任意两个顶点都是互相连通,并且是一个树结构,那么这棵树叫
数据结构与算法
2855
上一篇:广度优先搜索算法(bfs、广搜)java实现-数据结构和算法用邻接矩阵表示图的定点之间的关系如下图数据结构则用邻接矩阵表示为: privatestaticintmap
数据结构与算法
2808
广度优先搜索算法(dfs、深搜)java实现-数据结构和算法用邻接矩阵表示图的定点之间的关系如下图的数据结构:则用邻接矩阵表示为: privatestaticintmap[][]={ {0,3,6
最新发表
归档
2018-11
12
2018-12
33
2019-01
28
2019-02
28
2019-03
32
2019-04
27
2019-05
33
2019-06
6
2019-07
12
2019-08
12
2019-09
21
2019-10
8
2019-11
15
2019-12
25
2020-01
9
2020-02
5
2020-03
16
2020-04
4
2020-06
1
2020-07
7
2020-08
13
2020-09
9
2020-10
5
2020-12
3
2021-01
1
2021-02
5
2021-03
7
2021-04
4
2021-05
4
2021-06
1
2021-07
7
2021-08
2
2021-09
8
2021-10
9
2021-11
16
2021-12
14
2022-01
7
2022-05
1
2022-08
3
2022-09
2
2022-10
2
2022-12
5
2023-01
3
2023-02
1
2023-03
4
2023-04
2
2023-06
3
2023-07
4
2023-08
1
2023-10
1
2024-02
1
2024-03
1
2024-04
1
2024-08
1
标签
算法基础
linux
前端
c++
数据结构
框架
数据库
计算机基础
储备知识
java基础
ASM
其他
深入理解java虚拟机
nginx
git
消息中间件
搜索
maven
redis
docker
dubbo
vue
导入导出
软件使用
idea插件
协议
无聊的知识
jenkins
springboot
mqtt协议
keepalived
minio
mysql
ensp
网络基础
xxl-job
rabbitmq
haproxy
srs
音视频
webrtc
javascript
加密算法
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。