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 JSQL,SQL无处不在,
May 05 Javascript
事件绑定之小测试  onclick &amp;&amp; addEventListener
Jul 31 Javascript
JS如何将UTC格式时间转本地格式
Sep 04 Javascript
JQuery中的html()、text()、val()区别示例介绍
Sep 01 Javascript
javascript实现类似java中getClass()得到对象类名的方法
Jul 27 Javascript
Windows环境下npm install 报错: operation not permitted, rename的解决方法
Sep 26 Javascript
Angular 5.x 学习笔记之Router(路由)应用
Apr 08 Javascript
vue+springboot实现项目的CORS跨域请求
Sep 05 Javascript
swiper在vue项目中loop循环轮播失效的解决方法
Sep 15 Javascript
Vue项目查看当前使用的elementUI版本的方法
Sep 27 Javascript
微信小程序上传帖子的实例代码(含有文字图片的微信验证)
Jul 11 Javascript
VUE中V-IF条件判断改变元素的样式操作
Aug 09 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
PHP类的静态(static)方法和静态(static)变量使用介绍
2012/02/19 PHP
php cli模式学习(PHP命令行模式)
2013/06/03 PHP
ThinkPHP3.1之D方法实例详解
2014/06/20 PHP
php 实现一个字符串加密解密的函数实例代码
2016/11/01 PHP
js 数组操作代码集锦
2009/04/28 Javascript
jquery基础教程之deferred对象使用方法
2014/01/22 Javascript
jQuery中;function($,undefined) 前面的分号的用处
2014/12/17 Javascript
ES6新特性一: let和const命令详解
2017/04/20 Javascript
详解如何让InstantClick兼容MathJax、百度统计等
2017/09/12 Javascript
浅谈如何使用webpack构建多页面应用
2018/05/30 Javascript
Vue+iview+webpack ie浏览器兼容简单处理
2019/09/20 Javascript
微信小程序 bindtap 传参的实例代码
2020/02/21 Javascript
es6函数之严格模式用法实例分析
2020/03/17 Javascript
[09:37]DOTA2卡尔工作室 英雄介绍圣堂刺客篇
2013/06/13 DOTA
[01:02:54]完美世界DOTA2联赛PWL S2 FTD vs GXR 第一场 11.22
2020/11/26 DOTA
[36:20]完美世界DOTA2联赛PWL S3 access vs Rebirth 第一场 12.17
2020/12/18 DOTA
Python中处理unchecked未捕获异常实例
2015/01/17 Python
Python爬虫框架Scrapy基本用法入门教程
2018/07/26 Python
Python pycharm 同时加载多个项目的方法
2019/01/17 Python
解决Python计算矩阵乘向量,矩阵乘实数的一些小错误
2019/08/26 Python
python3将变量写入SQL语句的实现方式
2020/03/02 Python
详解使用Python写一个向数据库填充数据的小工具(推荐)
2020/09/11 Python
python 实现ping测试延迟的两种方法
2020/12/10 Python
利用CSS3的3D效果制作正方体
2020/03/10 HTML / CSS
Room Mate Hotels美国:西班牙酒店品牌
2018/04/10 全球购物
德国50岁以上交友网站:Lebensfreunde
2020/03/18 全球购物
英国100%防污和防水的靴子:Muck Boot Company
2020/09/08 全球购物
机电专业个人求职信范文
2013/12/30 职场文书
公司请假条格式
2014/04/11 职场文书
《青海高原一株柳》教学反思
2014/04/25 职场文书
生物科学专业毕业生求职信
2014/06/02 职场文书
工商管理专业自荐信
2014/06/03 职场文书
我的中国梦演讲稿小学篇
2014/08/19 职场文书
2014年连锁店圣诞节活动方案
2014/12/09 职场文书
Python 避免字典和元组的多重嵌套问题
2022/07/15 Python
Springboot集成kafka高级应用实战分享
2022/08/14 Java/Android