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 加上最后自己的验证
Nov 04 Javascript
Jquery在指定DIV加载HTML示例代码
Feb 17 Javascript
jQuery中not()方法用法实例
Jan 06 Javascript
javascript实现下拉提示选择框
Dec 29 Javascript
学习JavaScript设计模式之代理模式
Jan 12 Javascript
理解js回收机制通俗易懂版
Feb 29 Javascript
微信小程序模板之分页滑动栏
Feb 10 Javascript
微信小程序学习笔记之本地数据缓存功能详解
Mar 29 Javascript
关于layui的动态图标不显示的解决方法
Sep 04 Javascript
JS原型prototype和__proto__用法实例分析
Mar 14 Javascript
Element DateTimePicker日期时间选择器的使用示例
Jul 27 Javascript
JQuery通过键盘控制键盘按下与松开触发事件
Aug 07 jQuery
在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 和 MYSQL
2006/10/09 PHP
PHP解析目录路径的3个函数总结
2014/11/18 PHP
JQuery困惑—包装集 DOM节点
2009/10/16 Javascript
JavaScript Eval 函数使用
2010/03/23 Javascript
javascript各浏览器中option元素的表现差异
2011/04/07 Javascript
JQuery页面图片切换和新闻列表滚动效果的具体实现
2013/09/26 Javascript
js实现交换运动效果的方法
2015/04/10 Javascript
分步解析JavaScript实现tab选项卡自动切换功能
2016/01/25 Javascript
JavaScript算法系列之快速排序(Quicksort)算法实例详解
2016/09/04 Javascript
深入浅析Vue组件开发
2016/11/25 Javascript
微信小程序wx.request实现后台数据交互功能分析
2017/11/25 Javascript
vue实现的仿淘宝购物车功能详解
2019/01/27 Javascript
node.js ws模块搭建websocket服务端的方法示例
2019/04/25 Javascript
微信小程序上线发布流程图文详解
2019/05/06 Javascript
vue 实现一个简单的全局调用弹窗案例
2020/09/10 Javascript
在GitHub Pages上使用Pelican搭建博客的教程
2015/04/25 Python
Python字符串处理之count()方法的使用
2015/05/18 Python
改进Django中的表单的简单方法
2015/07/17 Python
python操作redis方法总结
2018/06/06 Python
python 剪切移动文件的实现代码
2018/08/02 Python
解决Django生产环境无法加载静态文件问题的解决
2019/04/23 Python
python Jupyter运行时间实例过程解析
2019/12/13 Python
Python 实现训练集、测试集随机划分
2020/01/08 Python
python+opencv3生成一个自定义纯色图教程
2020/02/19 Python
python matplotlib模块基本图形绘制方法小结【直线,曲线,直方图,饼图等】
2020/04/26 Python
Python根据字典的值查询出对应的键的方法
2020/09/30 Python
HTML5 标准将把互联网视频扔回到黑暗时代
2010/02/10 HTML / CSS
Intersport西班牙:在线体育商店
2019/11/06 全球购物
介绍一下Java中标识符的命名规则
2014/02/03 面试题
金融专业毕业生推荐信
2013/11/26 职场文书
《富饶的西沙群岛》教学反思
2014/04/09 职场文书
优秀德育工作者事迹材料
2014/05/07 职场文书
校园文明标语
2014/06/13 职场文书
村班子对照检查材料
2014/08/18 职场文书
2015毕业生自我评价范文
2015/03/02 职场文书
MongoDB balancer的使用详解
2021/04/30 MongoDB