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 相关文章推荐
Jquery实战_读书笔记1—选择jQuery
Jan 22 Javascript
基于jquery完美拖拽,可返回拖动轨迹
Mar 29 Javascript
js querySelector和getElementById通过id获取元素的区别
Apr 20 Javascript
Bootstrap模态对话框的简单使用
Apr 29 Javascript
深入理解JS addLoadEvent函数
May 20 Javascript
JS比较两个数值的大小实例
Nov 25 Javascript
AngularJS实现表单元素值绑定操作示例
Oct 11 Javascript
javascript面向对象程序设计实践常用知识点总结
Jul 29 Javascript
Elasticsearch实现复合查询高亮结果功能
Sep 10 Javascript
使用VUE实现在table中文字信息超过5个隐藏鼠标移到时弹窗显示全部
Sep 16 Javascript
js实现轮播图特效
May 28 Javascript
Vue实现随机验证码功能
Dec 29 Vue.js
在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
php使用PDO方法详解
2014/12/27 PHP
php中switch与ifelse的效率区别及适用情况分析
2015/02/12 PHP
php的扩展写法总结
2019/05/14 PHP
jquery实现的超出屏幕时把固定层变为定位层的代码
2010/02/23 Javascript
基于jquery的文本框与autocomplete结合使用(asp.net+json)
2012/05/30 Javascript
5秒后跳转效果(setInterval/SetTimeOut)
2013/05/03 Javascript
node.js中的dns.getServers方法使用说明
2014/12/08 Javascript
DOM基础教程之使用DOM + Css
2015/01/20 Javascript
js与jquery正则验证电子邮箱、手机号、邮政编码的方法
2016/07/04 Javascript
javascript中sort排序实例详解
2016/07/24 Javascript
JS中SetTimeout和SetInterval使用初探
2017/03/23 Javascript
基于JavaScript实现新增内容滚动播放效果附完整代码
2017/08/24 Javascript
vue 实现用户登录方式的切换功能
2020/04/14 Javascript
vant-ui组件调用Dialog弹窗异步关闭操作
2020/11/04 Javascript
[01:19:33]DOTA2-DPC中国联赛 正赛 iG vs VG BO3 第一场 2月2日
2021/03/11 DOTA
如何运行Python程序的方法
2013/04/21 Python
python+webdriver自动化环境搭建步骤详解
2019/06/03 Python
python Elasticsearch索引建立和数据的上传详解
2019/08/04 Python
10分钟教你用python动画演示深度优先算法搜寻逃出迷宫的路径
2019/08/12 Python
基于python的docx模块处理word和WPS的docx格式文件方式
2020/02/13 Python
python 命名规范知识点汇总
2020/02/14 Python
pytorch 常用函数 max ,eq说明
2020/06/28 Python
在django中查询获取数据,get, filter,all(),values()操作
2020/08/09 Python
python 监控logcat关键字功能
2020/09/04 Python
俄罗斯游戏商店:Buka
2020/03/01 全球购物
七一表彰活动方案
2014/01/18 职场文书
初中毕业典礼演讲稿
2014/09/09 职场文书
2014年体育教师工作总结
2014/12/03 职场文书
地陪导游欢迎词
2015/01/26 职场文书
认真学习保证书
2015/02/26 职场文书
2015年护士节慰问信
2015/03/23 职场文书
2015年银行客户经理工作总结
2015/04/01 职场文书
送给火锅店的创意营销方案!
2019/07/08 职场文书
redis缓存存储Session原理机制
2021/11/20 Redis
《王者天下》第4季首话新剧照 4月9日正式开播
2022/04/07 日漫
GO语言异常处理分析 err接口及defer延迟
2022/04/14 Golang