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 相关文章推荐
javascript 写类方式之十
Jul 05 Javascript
JavaScript中的eval()函数详解
Aug 22 Javascript
Extjs4实现两个GridPanel之间数据拖拽功能具体方法
Nov 21 Javascript
jquery easyUI中ajax异步校验用户名
Aug 19 Javascript
详解为Angular.js内置$http服务添加拦截器的方法
Dec 20 Javascript
Node连接mysql数据库方法介绍
Feb 07 Javascript
JavaScript时间戳与时间日期间相互转换
Dec 11 Javascript
Bootstrap 时间日历插件bootstrap-datetimepicker配置与应用小结
May 28 Javascript
在layui中使用form表单监听ajax异步验证注册的实例
Sep 03 Javascript
ES6之Proxy的get方法详解
Oct 11 Javascript
JS实现简单的表格增删
Jan 16 Javascript
angula中使用iframe点击后不执行变更检测的问题
May 10 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
粗略计算在线时间,bug:ip相同
2006/12/09 PHP
php中让上传的文件大小在上传前就受限制的两种解决方法
2013/06/24 PHP
深入php内核之php in array
2015/11/10 PHP
PHP编写RESTful接口
2016/02/23 PHP
PHP生成图表pChart的示例解析
2020/07/31 PHP
cssQuery()的下载与使用方法
2007/01/12 Javascript
js实现iframe动态调整高度的代码
2008/01/06 Javascript
借助script进行Http跨域请求:JSONP实现原理及代码
2013/03/19 Javascript
jQuery让控件左右移动的三种实现方法
2013/09/08 Javascript
JS限制文本框只能输入数字和字母方法
2015/02/28 Javascript
JS+DIV+CSS实现仿表单下拉列表效果
2015/08/18 Javascript
js实现简洁的滑动门菜单(选项卡)效果代码
2015/09/04 Javascript
js获取隐藏元素宽高的实现方法
2016/05/19 Javascript
js仿百度切换皮肤功能(html+css)
2016/07/10 Javascript
jquery attr()设置和获取属性值实例教程
2016/09/25 Javascript
Bootstrap CSS组件之大屏幕展播
2016/12/17 Javascript
详解AngularJS 模块化
2017/06/14 Javascript
js 索引下标之li集合绑定点击事件
2018/01/12 Javascript
解决vue热替换失效的根本原因
2018/09/19 Javascript
使用JS实现鼠标放上图片进行放大离开实现缩小功能
2021/01/27 Javascript
Python中列表与元组的乘法操作示例
2018/02/10 Python
用Cython加速Python到“起飞”(推荐)
2019/08/01 Python
Python如何把多个PDF文件合并代码实例
2020/02/13 Python
Python实现EM算法实例代码
2020/10/04 Python
Html5 webRTC简单实现视频调用的示例代码
2020/09/23 HTML / CSS
北美领先的牛仔品牌:Buffalo David Bitton
2017/05/22 全球购物
圣彼得堡鲜花配送:Semicvetic
2020/09/15 全球购物
启动仪式策划方案
2014/06/14 职场文书
驾驶员安全责任书范本
2014/07/24 职场文书
小区门卫的岗位职责
2014/09/26 职场文书
故意伤害人身损害赔偿协议书
2014/11/19 职场文书
教师节倡议书2015
2015/04/27 职场文书
优秀教师工作总结2015
2015/07/22 职场文书
员工保密协议范本,您一定得收藏!很有用!
2019/08/08 职场文书
祝福语集锦:送给闺蜜的生日祝福语
2019/10/08 职场文书
python绘制简单直方图(质量分布图)的方法
2022/04/21 Python