vue使用原生js实现滚动页面跟踪导航高亮的示例代码


Posted in Javascript onOctober 25, 2018

需要使用vue做一个专题页面。滚动页面指定区域导航高亮。

监听滚动页面事件,对比当前页面的位置与元素的位置,如果当前滚动的区域位置大于元素的位置,导航添加class,其他去掉class进行样式切换。

我使用的方法是在定位元素上添加id,在导航添加data-id属性,监听滚动事件,如果当前滚动区域大于定位元素区域,将元素的id赋值给变量,然后与导航的data-id进行匹配,切换class。

html结构

main.vue

<template>
 <div class="qz-home">
  <div class="quiz-container">
   <div class="quiz-ad-pic" id="pagetop"></div>
   <div class="quiz-main">
    <div class="quiz-main-inside" id="js-content">
     <quiz-sessions class="item" id="quizhall"></quiz-sessions>
     <quizRecords class="item" id="quizrecord"></quizRecords>
     <quiz-history class="item" id="quizHistory"></quiz-history>
     <quiz-mine class="item" id="quizMine"></quiz-mine>
     <quiz-rank class="item" id="quizRank"></quiz-rank>
     <quiz-rule class="item" id="quizRule"></quiz-rule>
    </div>
   </div>
   <navigation id="js-nav"></navigation>
  </div>
 </div>
</template>

navigation.vue

<template>
 <nav class="nav-container">
  <div class="nav-mark"></div>
  <div class="nav-main">
   <ul class="nav-list">
    <li :class="{'cur': curindex === index}" v-for="(item, index) in navList" :key="index" :data-id="item.id"><a @click="linkTo(item.id, index)">{{item.name}}</a></li>
   </ul>
   <div class="backtop" @click="backTop()">
    <a></a>
   </div>
  </div>
 </nav>
</template>

javascript

export default {
 name: "Navigation",
 data() {
  return {
   navList: [
    { name: "竞猜大厅", id: "quizhall" },
    { name: "竞猜记录", id: "quizrecord" },
    { name: "历史赛事", id: "quizHistory" },
    { name: "我的竞猜", id: "quizMine" },
    { name: "排行榜", id: "quizRank" },
    { name: "玩法", id: "quizRule" }
   ],
   curindex: 0
  };
 },
 mounted() {
  this.initScroll();
 },
 methods: {
  initScroll() {
   window.addEventListener('scroll', function() {
    // 封装类名函数集:判断、移除、增加、获取(简单粗暴版);
    function removeClass(obj, cls) {
     if (obj.className == cls) {
      obj.className = "";
     }
    }
    function addClass(obj, cls) {
     if (obj.className != cls) {
      obj.className = cls;
     }
    }

    let pos = document.documentElement.scrollTop;
    if (pos > 300) {
     document.querySelector('.nav-container').style.display = 'block';
    } else {
     document.querySelector('.nav-container').style.display = 'none';
    }
    var menus = document.getElementById("js-nav").getElementsByTagName("li");
    var items = document.getElementById("js-content").querySelectorAll(".item");
    var currentId = "";
    
    for (var i = 0; i < items.length; i++) {
     var _item = items[i];
     var _itemTop = _item.offsetTop;
     if (pos > _itemTop - 200) {
      currentId = _item.id;
     } else {
      break;
     }
    }
    if (currentId) {
     for (var j = 0; j < menus.length; j++) {
      var _menu = menus[j];
      // href属性获取的是整个link,需以#为界截除获取最后一个元素;
      var _href = _menu.getAttribute('data-id');
      if (_href != currentId) {
       removeClass(_menu, "cur");
      } else {
       addClass(_menu, "cur");
      }
     }
    }
   })
  }
 }
};

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

Javascript 相关文章推荐
Prototype的Class.create函数解析
Sep 22 Javascript
关于jquery css的使用介绍
Apr 18 Javascript
JS将表单导出成EXCEL的实例代码
Nov 11 Javascript
用javascript替换URL中的参数值示例代码
Jan 27 Javascript
jQuery中empty()方法用法实例
Jan 16 Javascript
Javascript中的高阶函数介绍
Mar 15 Javascript
AngularJS入门之动画
Jul 27 Javascript
js中判断变量类型函数typeof的用法总结
Aug 09 Javascript
jquery与js实现全选功能的区别
Jun 11 jQuery
JS实现下拉菜单列表与登录注册弹窗效果
Aug 10 Javascript
Node.js之删除文件夹(含递归删除)代码实例
Sep 09 Javascript
解决vue侦听器watch,调用this时出现undefined的问题
Oct 30 Javascript
在Bootstrap开发框架中使用dataTable直接录入表格行数据的方法
Oct 25 #Javascript
浅谈高大上的微信小程序中渲染html内容—技术分享
Oct 25 #Javascript
使用ECharts实现状态区间图
Oct 25 #Javascript
jquery使用FormData实现异步上传文件
Oct 25 #jQuery
详解js访问对象的属性和方法
Oct 25 #Javascript
深入浅析js原型链和vue构造函数
Oct 25 #Javascript
AngularJS 多指令Scope问题的解决
Oct 25 #Javascript
You might like
Zend framework处理一个http请求的流程分析
2010/02/08 PHP
PHP面相对象中的重载与重写
2017/02/13 PHP
php base64 编码与解码实例代码
2017/03/21 PHP
PHP使用pdo实现事务处理操作示例
2018/09/05 PHP
javascript获取ckeditor编辑器的值(实现代码)
2013/11/18 Javascript
jQuery中contents()方法用法实例
2015/01/08 Javascript
jQuery使用before()和after()在元素前后添加内容的方法
2015/03/26 Javascript
AngularJS单选框及多选框实现双向动态绑定
2016/01/13 Javascript
angularjs实现下拉列表的选中事件示例
2017/03/03 Javascript
vue引入ueditor及node后台配置详解
2018/01/03 Javascript
Javascript 之封装(Package)
2018/09/14 Javascript
jQuery实现简单聊天室
2020/02/08 jQuery
[01:10:27]DOTA2-DPC中国联赛正赛 SAG vs XG BO3 第二场 3月5日
2021/03/11 DOTA
Python中分数的相关使用教程
2015/03/30 Python
python网络编程之数据传输UDP实例分析
2015/05/20 Python
Python编程给numpy矩阵添加一列方法示例
2017/12/04 Python
python实现支付宝当面付(扫码支付)功能
2018/05/30 Python
django表单的Widgets使用详解
2019/07/22 Python
Django框架视图函数设计示例
2019/07/29 Python
将python2.7添加进64位系统的注册表方式
2019/11/20 Python
python利用百度云接口实现车牌识别的示例
2020/02/21 Python
python实现字符串和数字拼接
2020/03/02 Python
python实现提取COCO,VOC数据集中特定的类
2020/03/10 Python
接口自动化多层嵌套json数据处理代码实例
2020/11/20 Python
Whistles官网:英国女装品牌
2020/08/14 全球购物
六年级数学教学反思
2014/02/03 职场文书
《菜园里》教学反思
2014/04/17 职场文书
分家协议书
2014/04/21 职场文书
住院医师规范化培训实施方案
2014/06/12 职场文书
企业法人授权委托书
2014/09/25 职场文书
房屋租房协议书范本
2014/12/04 职场文书
收入证明范本
2015/06/12 职场文书
Flask搭建一个API服务器的步骤
2021/05/28 Python
javascript实现计算器功能详解流程
2021/11/01 Javascript
Spring Boot 实现 WebSocket
2022/04/30 Java/Android
MySQL分布式恢复进阶
2022/07/23 MySQL