前言

上大三了才知道有freecodecamp这么一个网站,最近在上面学习,顺便复习一些前端知识,有个题目是让做一个个人作品集的一个展示界面,写导航栏的时候突然想起以前看到的一个效果,正常情况导航栏是正常展示在顶部,之后用户向下滚动的时候动态设置样式固定在顶部,之后滚动回来时再删除掉样式,用vue这些框架实现就很简单了,但本着学习的的态度,查了些资料,用原生js实现了以上效果。
第一次写博客,不足之处望不吝赐教~~

html代码:

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
<div class="bg">
<header>
<nav class="navbar navbar-expand-md navbar-dark" id="nav" style="background-color:rgb(49, 49, 49)">
<div class="collapse navbar-collapse" id="collapsibleNavId">
<ul class="navbar-nav my-2 my-lg-0">
<li class="nav-item active" id="navbar">
<a class="nav-link" href="#home">Home</a>
</li>
<li class="nav-item" id="navbar">
<a class="nav-link" href="#about">About</a>
</li>
<li class="nav-item " id="navbar">
<a class="nav-link" href="#portfolio">Portfolio</a>
</li>
<li class="nav-item" id="navbar">
<a class="nav-link" href="#contact ">Contact</a>
</li>
</ul>
</div>
</nav>
</header>
<article>
<div id="home">
<div class="col-md-12">
<div class="welcome">
<div>
<h1>Welcome To My Personal Blog</h1>
</div>
</div>
</div>
</div>
</article>
</div>

为了方便使用的是bootstrap4框架,当然也可以自己写,css以及js文件自行引入,这里不再赘述。

css代码

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
.bg {
background: url("https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=1692853102,1420366288&fm=27&gp=0.jpg") no-repeat;
height: 100%;
width: 100%;
overflow: hidden;
background-size: cover;
text-align: center;
}

article {
width: 80%;
margin: 0 auto;
margin-top: 5px;
}

#home {
/* background: url("https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=288008406,2182903897&fm=26&gp=0.jpg") no-repeat; */
background-color: cadetblue;
height: 1600px;
overflow: hidden;
background-size: cover;
}

#navbar :hover {
background-color: rgb(90, 80, 80);
box-shadow: 2px, 2px, 2px, #000;
border-radius: 0.5em;
}

这里是一些样式美化,可以自行修改。

js代码

重点来了,怎么判断页面向下滚动呢,可以使用document.body.scrollTop(),document.documentElement.scrollTop() 这两个方法获取滚动条据顶部的位置,大于0时设置样式,等于0时移除样式即可,这里的固定顶部样式使用的时bootstrap自带的fixed-top,有需要可以自己写。

1
2
3
4
5
6
7
8
9
10
11
 window.onscroll = function () {
var dance = document.body.scrollTop || document.documentElement.scrollTop;//获取滚动条据顶部位置
if (dance > 0) { //距离大于0时设置固定在顶部样式fixed-top
while (!document.getElementById("nav").className.match(/(?:^|\s)fixed-top(?!\S)/)) { //使用正则表达式判断导航栏class是否含有fixed-top
document.getElementById("nav").className += " fixed-top";//没有就设置,注意前面有空格并且是+=不然之前样式都会被替换成fixed-top;
}
} else {
document.getElementById("nav").className = document.getElementById("nav").className.replace(
/(?:^|\s)fixed-top(?!\S)/g, '');//距离等于或小于0时,移除fixed-top
}
};

上效果图

注意看控制台样式的变化
在这里插入图片描述

此外

document.body.scrollTop() document.documentElement.scrollTop 等方法存在浏览器兼容问题,所以这里加上条件判断:

var dance = document.body.scrollTop || document.documentElement.scrollTop;

参考网址: https://segmentfault.com/a/1190000008065472