JS实现网站楼层导航效果代码实例


Posted in Javascript onJune 16, 2020

壹 ❀ 引言

对于楼层导航而言,还有个重要的功能就是,随着滚动条滚动,达到某层时得同步点亮楼层导航的小图片。

由于我前面也说了不打算使用JQ,所以想着用JS去实现它,实现并不难,主要得弄清滚动满足怎样的条件才应该点亮对应楼层,我们先看看实现效果:

JS实现网站楼层导航效果代码实例

贰 ❀ 实现思路

第一点,因为是由滚动触发的楼层判断,所以肯定离不开onscroll事件。

第二点,我们貌似要获取每个楼层顶端距离视窗顶部的距离,随着滚动条往下滚动,此距离会不断缩小,当接近到某个距离时我们判定此楼层入画,当然其它楼层都满足此判定。

而JQ提供了一个offset().top方法能获取这个值,js中只有一个offsetTop属性,获取的是距离自己最近position属性为非static的祖先元素的距离,此距离不随滚动条滚动而缩小。

当然我们有方法模拟计算出offset().top的值,但没必要

这里我直接引用了我之前博客得到的结论:offset().top =offsetTop -scrollTop(offsetTop参考对象为根元素)。

为了方便理解,我们假设楼层壹顶端距离视窗顶端为0时,此时判定楼层壹入画,即楼层导航中第一个按钮应该被点亮。

JS实现网站楼层导航效果代码实例

由于offset().top = offsetTop - scrollTop,此时楼层壹距离顶端已经为0,我们可以得出当楼层壹的offsetTop = scrollTop时,我们认定楼层壹入画。

而当楼层贰入画时,楼层贰的offsetTop也等于滚动条的距离,此时楼层壹自然会出画:

JS实现网站楼层导航效果代码实例

那么现在我们得到了判断楼层入画的条件,如果某个楼层的offsetTop属性的值小于等于滚动条距离时(如果用等于条件过于苛刻,很难刚好滚动到这个距离点上),我们点亮对应楼层的导航logo。

为了让效果更加自然,我们肯定不会真的让某个楼层紧贴顶部时才判定它满足条件,肯定是提前某个距离就判定满足,所以真正的条件应该是offsetTop - 100(这个数字看自己感觉) <= scrollTop

你是否会有,楼层贰入画时楼层壹依然满足offsetTop<=scrollTop条件的疑惑?在JQ里面,我们给某个元素添加点亮class的同时,还会清除掉兄弟元素的该class。

所以在JS里面也是如此,我们利用满足楼层的索引来控制样式,而后者满足条件的索引始终会覆盖前面的索引,所以被点亮的永远只有一个。

现在弄懂了思路,代码就好些了,下面直接贴上了实现代码:

叁 ❀ 实现代码

HTML部分:

<div class="floor">
  <div style="background: #ffb6b9">壹</div>
  <div style="background: #fae3d9">贰</div>
  <div style="background: #bbded6">叁</div>
  <div style="background: #8ac6d1">肆</div>
  <div style="background: #fff1ac">伍</div>
</div>
<ul class="floorNav">
  <li>壹</li>
  <li>贰</li>
  <li>叁</li>
  <li>肆</li>
  <li>伍</li>
</ul>

CSS部分:

* {
  padding: 0;
  margin: 0;
  list-style: none;
}

.floor>div {
  height: 900px;
  line-height: 900px;
  text-align: center;
  color: #fff;
  font-size: 40px;
}

.floorNav {
  width: 40px;
  height: 200px;
  position: fixed;
  right: 0;
  top: 0;
  bottom: 0;
  margin: auto;
  background: #ddd;
}

.floorNav>li {
  height: 40px;
  line-height: 40px;
  text-align: center;
  color: #fff;
}

.active {
  background: #e4393c;
  color: #fff;
}

JS部分:

//获取楼层
let floors = document.querySelectorAll(".floor>div");
//获取楼层导航
let floorNavs = document.querySelectorAll(".floorNav>li");
//滚动监听
window.onscroll = function () {
  //获取滚动条高度,兼容ie
  let scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
  //符合点亮条件的楼层索引
  let activeIndex;
  //楼层导航图标点亮控制
  floors.forEach((floor, index) => {
    //检查各楼层顶端距离视窗顶端距离,如果满足条件则修改楼层图标
    floor.offsetTop - 100 <= scrollTop ? activeIndex = index : null;
  });
  //根据索引数设置楼层样式
  floorNavs.forEach((nav, index) => {
    index === activeIndex ? nav.classList.add('active') : nav.classList.remove('active');
  });
};

需要注意的是,这里我使用了js中操作classList对象的add方法与remove方法,这两个方法IE并不支持,因为我这边是不需要考虑IE的,所以就任性了。

本文只是提供了一个楼层导航的思路,实现肯定不是很好,若有更佳的做法,欢迎留言讨论,那么本文结束。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
将string解析为json的几种方式小结
Nov 11 Javascript
为EasyUI的Tab标签添加右键菜单的方法
Jul 14 Javascript
js去除空格的12种实用方法
Nov 08 Javascript
javascript遇到html5的一些表单属性
Jul 05 Javascript
[原创]JQuery 在表单提交之前修改 提交的值
Apr 14 Javascript
Vue实现购物车场景下的应用
Nov 27 Javascript
BootStrap自定义popover,点击区域隐藏功能的实现
Jan 23 Javascript
分享5个顶级的JavaScript Ajax组件库
Sep 16 Javascript
Vue瀑布流插件的使用示例
Sep 19 Javascript
vue的注意规范之v-if 与 v-for 一起使用教程
Aug 04 Javascript
微信小程序实现身份证取景框拍摄
Sep 09 Javascript
逐行分析鸿蒙系统的 JavaScript 框架(推荐)
Sep 17 Javascript
利用webpack理解CommonJS和ES Modules的差异区别
Jun 16 #Javascript
JS 5种遍历对象的方式
Jun 16 #Javascript
js实现小球在页面规定的区域运动
Jun 16 #Javascript
Vue结合路由配置递归实现菜单栏功能
Jun 16 #Javascript
vue 实现在同一界面实现组件的动态添加和删除功能
Jun 16 #Javascript
详解JS预解析原理
Jun 16 #Javascript
深入了解JS之作用域和闭包
Jun 16 #Javascript
You might like
杏林同学录(一)
2006/10/09 PHP
PHP生成静态页面详解
2006/11/19 PHP
CodeIgniter错误mysql_connect(): No such file or directory解决方法
2014/09/06 PHP
PHP中mysql_field_type()函数用法
2014/11/24 PHP
php基于表单密码验证与HTTP验证用法实例
2015/01/06 PHP
php获取YouTube视频信息的方法
2015/02/11 PHP
详谈配置phpstorm完美支持Codeigniter(CI)代码自动完成(代码提示)
2017/04/07 PHP
js实现省市联动效果的简单实例
2014/02/10 Javascript
js css 实现遮罩层覆盖其他页面元素附图
2014/09/22 Javascript
node.js中的console.log方法使用说明
2014/12/09 Javascript
JavaScript保存并运算页面中数字类型变量的写法
2015/07/06 Javascript
jquery模拟进度条实现方法
2015/08/03 Javascript
javascript淘宝主图放大镜功能
2016/10/20 Javascript
Bootstrap模态框禁用空白处点击关闭
2016/10/20 Javascript
js倒计时小实例(多次定时)
2016/12/08 Javascript
JavaScript转换数据库DateTime字段类型方法
2017/06/27 Javascript
Node.js 获取微信JS-SDK CONFIG的方法示例
2019/05/21 Javascript
微信小程序前端自定义分享的实现方法
2019/06/13 Javascript
JavaScript鼠标拖拽事件详解
2020/04/03 Javascript
[02:23]2018DOTA2亚洲邀请赛趣味视频——反应测试
2018/04/04 DOTA
Python实现在Linux系统下更改当前进程运行用户
2015/02/04 Python
详解用python实现基本的学生管理系统(文件存储版)(python3)
2019/04/25 Python
python urllib爬虫模块使用解析
2019/09/05 Python
解决Python pip 自动更新升级失败的问题
2020/02/21 Python
Python操控mysql批量插入数据的实现方法
2020/10/27 Python
HTML5之HTML元素扩展(下)—增强的Form表单元素值得关注
2013/01/31 HTML / CSS
进程的查看和调度分别使用什么命令
2013/12/14 面试题
餐厅总经理岗位职责
2013/12/31 职场文书
前台文员我鉴定
2014/01/12 职场文书
煤矿开采专业求职信
2014/07/08 职场文书
2014党员自我评议表范文
2014/09/20 职场文书
四风问题班子对照检查材料
2014/09/27 职场文书
记者节感言
2015/08/03 职场文书
2016大学生党校学习心得体会
2016/01/06 职场文书
2016国庆促销广告语
2016/01/28 职场文书
nginx反向代理配置去除前缀案例教程
2021/07/26 Servers