Javascript实现页面滚动时导航智能定位


Posted in Javascript onMay 06, 2017

常见的开发页面中可能会有这么一个需求,页面中会有多个模块,每个模块对应一个导航,当页面滚动到某个模块时,对应的模块导航需要加上一个类用于区分当前用户所浏览区域。

假设结构如下:

<div class="container">
  <div class="wrapper">
    <div class="section" id="section1">section1</div>
    <div class="section" id="section2">section2</div>
    <div class="section" id="section3">section3</div>
    <div class="section" id="section4">section4</div>
    <div class="section" id="section5">section5</div>
  </div>
  <nav>
    <a href="#section1" rel="external nofollow" class="current">section1</a>
    <a href="#section2" rel="external nofollow" >section2</a>
    <a href="#section3" rel="external nofollow" >section3</a>
    <a href="#section4" rel="external nofollow" >section4</a>
    <a href="#section5" rel="external nofollow" >section5</a>
  </nav>
</div>

页面滚动时导航定位

js代码如下:

var $navs = $('nav a'),          // 导航
  $sections = $('.section'),       // 模块
  $window = $(window),
  navLength = $navs.length - 1;
  
$window.on('scroll', function() {
  var scrollTop = $window.scrollTop(),
    len = navLength;

  for (; len > -1; len--) {
    var that = $sections.eq(len);
    if (scrollTop >= that.offset().top) {
       $navs.removeClass('current').eq(len).addClass('current');
       break;
    }
  }
});

效果如下:

Javascript实现页面滚动时导航智能定位

不难看出,基本原理就是在window滚动的时候,依次将模块从后向前遍历,如果window的滚动高度大于或等于当前模块的距页面顶部的距离,则将当前模块对应的导航突出显示,并且不再继续遍历

点击导航定位页面

除了这种需求外,还有另一种需求,就是点击导航定位到导航所对应模块的顶部。

代码如下:

$navs.on('click', function(e) {
  e.preventDefault();
  $('html, body').animate({
    'scrollTop': $($(this).attr('href')).offset().top
  }, 400);
});

效果如下:

Javascript实现页面滚动时导航智能定位

以上基本上满足了业务的基本需求,这是工作中总结的经验,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript 封装Ajax传递的数据代码
Jun 05 Javascript
让JavaScript拥有类似Lambda表达式编程能力的方法
Sep 12 Javascript
jQuery实现简单的列表式导航菜单效果代码
Aug 31 Javascript
JavaScript实现获取某个元素相邻兄弟节点的prev与next方法
Jan 25 Javascript
javascript自定义滚动条实现代码
Apr 20 Javascript
ui组件之input多选下拉实现方法(带有搜索功能)
Jul 14 Javascript
JS实现将二维数组转为json格式字符串操作示例
Jul 12 Javascript
微信小程序实现topBar底部选择栏效果
Jul 20 Javascript
json字符串传到前台input的方法
Aug 06 Javascript
JS数组中对象去重操作示例
Jun 04 Javascript
使用easyui从servlet传递json数据到前端页面的两种方法
Sep 05 Javascript
基于JavaScript实现猜数字游戏代码实例
Jul 30 Javascript
JavaScript实现打地鼠小游戏
Apr 23 #Javascript
简单实现jQuery弹幕效果
May 06 #jQuery
javascript编写简易计算器
May 06 #Javascript
JavaScript实现无穷滚动加载数据
May 06 #Javascript
Angularjs2不同组件间的通信实例代码
May 06 #Javascript
jquery实现提示语淡入效果
May 05 #jQuery
Jquery获取radio选中的值
May 05 #jQuery
You might like
全国FM电台频率大全 - 14 江西省
2020/03/11 无线电
php中通过Ajax如何实现异步文件上传的代码实例
2011/05/07 PHP
如何批量替换相对地址为绝对地址(利用bat批处理实现)
2013/05/27 PHP
PHP页面间参数传递的四种方法详解
2013/06/09 PHP
php+mysql实现简单的增删改查功能
2015/07/13 PHP
PHP下使用mysqli的函数连接mysql出现warning: mysqli::real_connect(): (hy000/1040): ...
2016/02/14 PHP
php7 图形用户界面GUI 开发示例
2020/02/22 PHP
基于thinkphp5框架实现微信小程序支付 退款 订单查询 退款查询操作
2020/08/17 PHP
PHP dirname简单使用代码实例
2020/11/13 PHP
基于IE下ul li 互相嵌套时的bug,排查,解决过程以及心得介绍
2013/05/07 Javascript
jquerymobile局部渲染的各种刷新方法小结
2014/03/05 Javascript
jquery图片切换实例分析
2015/04/15 Javascript
不得不分享的JavaScript常用方法函数集(下)
2015/12/25 Javascript
JavaScript实现自定义媒体播放器方法介绍
2017/01/03 Javascript
jQuery实现拖拽可编辑模块功能代码
2017/01/12 Javascript
bootstrap fileinput组件整合Springmvc上传图片到本地磁盘
2017/05/11 Javascript
angular实现spa单页面应用实例
2017/07/10 Javascript
windows系统下更新nodejs版本的方案
2017/11/24 NodeJs
vue通过style或者class改变样式的实例代码
2018/10/30 Javascript
vue 微信扫码登录(自定义样式)
2020/01/06 Javascript
[47:22]Mineski vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python获取SQLite查询结果表列名的方法
2017/06/21 Python
python 垃圾收集机制的实例详解
2017/08/20 Python
Python基于plotly模块实现的画图操作示例
2019/01/23 Python
python实现机器人卡牌
2019/10/06 Python
pyqt5中动画的使用详解
2020/04/01 Python
Django+Celery实现动态配置定时任务的方法示例
2020/05/26 Python
adidas旗下高尔夫装备供应商:TaylorMade Golf(泰勒梅高尔夫)
2016/08/28 全球购物
2014年党支部书记工作总结
2014/12/04 职场文书
出国留学单位推荐信
2015/03/26 职场文书
2015年个人实习工作总结
2015/05/28 职场文书
自信主题班会
2015/08/14 职场文书
化工生产实习心得体会
2016/01/22 职场文书
2019行政前台转正申请书范文3篇
2019/08/15 职场文书
解决Navicat for MySQL 连接 MySQL 报2005错误的问题
2021/05/29 MySQL
入门学习Go的基本语法
2021/07/07 Golang