前言
上大三了才知道有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-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) { while (!document.getElementById("nav").className.match(/(?:^|\s)fixed-top(?!\S)/)) { document.getElementById("nav").className += " fixed-top"; } } else { document.getElementById("nav").className = document.getElementById("nav").className.replace( /(?:^|\s)fixed-top(?!\S)/g, ''); } };
|
上效果图
注意看控制台样式的变化
此外
document.body.scrollTop() document.documentElement.scrollTop 等方法存在浏览器兼容问题,所以这里加上条件判断:
var dance = document.body.scrollTop || document.documentElement.scrollTop;
参考网址: https://segmentfault.com/a/1190000008065472