​ 这几天因为喜欢看漫画,而个人也喜欢写点网站,索性就自己写了一个漫画推荐网站,上面记录下自己看完的漫画,包括观感如何都有打分,只不过这个分只是我个人主观得分而已

​ 扯远了扯远了,本文是在做网站返回顶部这个功能(后面简称“回顶”)时得到的一些感想,希望我的这个文章可以给朋友们一点灵感🥱

​ 起因是我在网路上搜索回顶功能代码,得到的基础功能是js设置点击事件给button使用scrollTop属性回顶到顶部,代码如下:

1
2
3
4
5
// 点击按钮,返回顶部
function topFunction() {
document.body.scrollTop = 0;
document.documentElement.scrollTop = 0;
}

按着网上的思路写完了,实际点击也确实是能回到顶部,但是

怎么感觉哪里不够漂亮?

…..

哦,没有动画!

私认为动画是js以及网页操作的灵魂,没有动画就像是新年除夕夜上没有穿上红秋裤一样令人失望

所以,该怎么加动画呢

我又开始面向百度编程了(喜)

…..

经过一段时间的查找,我开始有了眉目:

果断抛弃scrollTop的设置顶部距离,换上我们的锚点链接!

同时换上一个可以操作滚动条的属性:scroll-behavior: smooth;

具体代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<!DOCTYPE html>
<html lang="zh-CN" id="html">

<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
#html {
scroll-behavior: smooth;
}
.to-top {
position: fixed;
width: 60px;
height: 60px;
line-height: 60px;
bottom: 50px;
right: 100px;
background-color: #ddd;
color: #fff;
border: 1px solid #f4f5f7;
border-radius: 18px;
font-size: 12px;
text-decoration: none;
text-align: center;
}

.content { /*代替网页中的很多条内容*/
width: 1200px;
height: 200px;
background-color: lightblue;
}
</style>
</head>
<body>
<div id="main">
<div class="content"></div>
<div class="content"></div>
<div class="content"></div>
<div class="content"></div>
<div class="content"></div>
</div>

<a href="#html" class="to-top" id="gotop">回到顶部</a>
</body>
</html>

现在是返回的功能和动画都有了,基本圆满了吧

哎,还没有

前几天我再在逛知乎的时候发现一个东西:

知乎的回顶按钮在一开始我页面本来在顶部时是没有的,等我小小的划了一下鼠标滚轮,哎,他就有了,等我再花上去又没有了

嘿,这玩意高级,不过思路也挺容易想的:

  1. 做一个页面滑动事件,我只要一滑动页面它就会触发里面的代码
  2. 获得此时我的视窗离文档的顶部的距离
  3. 设置下距离顶部多少高度时将按钮display:block即可,按钮平常就设置none隐藏起来即可

大致的js代码如下(这里我设置的低于100px隐藏):

1
2
3
4
5
6
7
8
window.addEventListener('scroll', function () {
let px = parseInt(document.documentElement.scrollTop);
if(parseInt(px)<=100){
document.querySelector('#gotop').style.display="none";
}else{
document.querySelector('#gotop').style.display="block";
}
})

本文所有具体代码如下,有一些新增代码我都做了注释:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
<!DOCTYPE html>
<html lang="zh-CN" id="html">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
/* 设置需要滚动到的元素的 scroll-behavior 属性,
这里我们设置了 html 元素(一般来说,如果是回到顶部的话,
设置body和html的scroll-behavior属性,去到指定位置,
则设置那个元素的scroll-behavior属性) */
#html {
scroll-behavior: smooth;
}

#main {
display: flex;
align-items: center;
flex-direction: column;
}

.to-top {
display: none;
position: fixed;
width: 60px;
height: 60px;
line-height: 60px;
bottom: 50px;
right: 100px;
background-color: #ddd;
color: #fff;
border: 1px solid #f4f5f7;
border-radius: 18px;
font-size: 12px;
text-decoration: none;
text-align: center;
}

.content {
width: 1200px;
height: 200px;
background-color: lightblue;
}

#p { /*显示距顶部多少px*/
position: fixed;
top: 0;
left: 0;
}
</style>
</head>

<body>
<p id="p">0px</p>
<div id="main">
<div class="content"></div>
<div class="content"></div>
<div class="content"></div>
<div class="content"></div>
<div class="content"></div>
</div>
<!-- 利用 a 标签,来导航到某个锚点,如果没有设置
scroll-behavior: smooth 属性,浏览器会一瞬间就导航到了
#html 位置,因为scrioll-behavior的默认值是auto(立即滚动),
而smooth是平滑滚动的意思 -->
<a href="#html" class="to-top" id="gotop">回到顶部</a>
</body>
<script>
const p = document.querySelector('#p');
window.addEventListener('scroll', function () { //添加监听事件为滚动事件
let px = p.innerHTML = parseInt(document.documentElement.scrollTop)+'px';
if(parseInt(px)<=100){
document.querySelector('#gotop').style.display="none";
}else{
document.querySelector('#gotop').style.display="block";
}
})


</script>

</html>

具体关于scrioll-behavior的知识可以看MDN的解释: