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 相关文章推荐
可以显示单图片,多图片ajax请求的ThickBox3.1类下载
Dec 23 Javascript
jquery实现微博文字输入框 输入时显示输入字数 效果实现
Jul 12 Javascript
jquery ajax,ashx,json的用法总结
Feb 12 Javascript
浅析javascript中函数声明和函数表达式的区别
Feb 15 Javascript
原生js实现ajax方法(超简单)
Sep 20 Javascript
JavaScript对象拷贝与赋值操作实例分析
Dec 10 Javascript
JS异步执行结果获取的3种解决方式
Feb 19 Javascript
layui下拉列表select实现可输入查找的方法
Sep 28 Javascript
vue使用nprogress加载路由进度条的方法
Jun 04 Javascript
uniapp 仿微信的右边下拉选择弹出框的实现代码
Jul 12 Javascript
使用eslint和githooks统一前端风格的技巧
Jul 29 Javascript
javascript中正则表达式语法详解
Aug 07 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
举例讲解PHP面对对象编程的多态
2015/08/12 PHP
PHP中如何使用session实现保存用户登录信息
2015/10/20 PHP
PHP call_user_func和call_user_func_array函数的简单理解与应用分析
2019/11/25 PHP
基于jquery的给文章加入关键字链接
2010/10/26 Javascript
jQuery 三击事件实现代码
2013/09/11 Javascript
在每个匹配元素的外部插入新元素的方法
2013/12/20 Javascript
VS2008中使用JavaScript调用WebServices
2014/12/18 Javascript
JS脚本根据手机浏览器类型跳转WAP手机网站(两种方式)
2015/08/04 Javascript
jquery实现模拟百分比进度条渐变效果代码
2015/10/29 Javascript
浅谈JS原型对象和原型链
2016/03/02 Javascript
谈一谈JS消息机制和事件机制的理解
2016/04/14 Javascript
JS添加或修改控件的样式(Class)实现方法
2016/10/15 Javascript
正则中的回溯定义与用法分析【JS与java实现】
2016/12/27 Javascript
关于JS与jQuery中的文档加载问题
2017/08/22 jQuery
详解vue mint-ui源码解析之loadmore组件
2017/10/11 Javascript
基于express中路由规则及获取请求参数的方法
2018/03/12 Javascript
JS实现使用POST方式发送请求
2019/08/30 Javascript
浅谈vuex中store的命名空间
2019/11/08 Javascript
构建大型 Vue.js 项目的10条建议(小结)
2019/11/14 Javascript
Python使用chardet判断字符编码
2015/05/09 Python
python实现DES加密解密方法实例详解
2015/06/30 Python
python 调用HBase的简单实例
2016/12/18 Python
python装饰器简介---这一篇也许就够了(推荐)
2019/04/01 Python
浅谈keras中的目标函数和优化函数MSE用法
2020/06/10 Python
python实现杨辉三角的几种方法代码实例
2021/03/02 Python
深入解析HTML5 Canvas控制图形矩阵变换的方法
2016/03/24 HTML / CSS
NEW LOOK官网:英国时装零售巨头之一,快时尚品牌
2017/01/11 全球购物
一个C/C++编程面试题
2013/11/10 面试题
生物技术毕业生自荐信
2013/10/23 职场文书
优秀女职工事迹材料
2014/02/06 职场文书
幼儿园教师教学反思
2014/02/06 职场文书
安全责任协议书
2014/04/21 职场文书
中国梦读书活动总结
2014/07/10 职场文书
先进个人主要事迹怎么写
2015/11/04 职场文书
详细分析PHP7与PHP5区别
2021/06/26 PHP
2022微信温控新功能上线
2022/05/09 数码科技