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 相关文章推荐
JS制作简单的三级联动
Mar 18 Javascript
javascript处理a标签超链接默认事件的方法
Jun 29 Javascript
JS+CSS实现鼠标滑过时动态翻滚的导航条效果
Sep 24 Javascript
JS与jQuery遍历Table所有单元格内容的方法
Dec 07 Javascript
BootStrap无限级分类(无限极分类封装版)
Aug 26 Javascript
微信小程序实战之运维小项目
Jan 17 Javascript
vue不通过路由直接获取url中参数的方法示例
Aug 24 Javascript
vue App.vue中的公共组件改变值触发其他组件或.vue页面监听
May 31 Javascript
echarts统计x轴区间的数值实例代码详解
Jul 07 Javascript
vue2.* element tabs tab-pane 动态加载组件操作
Jul 19 Javascript
jquery插件实现悬浮的菜单
Apr 24 jQuery
Vue接口封装的完整步骤记录
May 14 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函数)
2006/10/09 PHP
PHP在同一域名下两个不同的项目做独立登录机制详解
2017/09/22 PHP
PHP设计模式之观察者模式定义与用法示例
2018/08/04 PHP
农历与西历对照
2006/09/06 Javascript
jQuery帮助之CSS尺寸(五)outerHeight、outerWidth
2009/11/14 Javascript
高性能Javascript笔记 数据的存储与访问性能优化
2012/08/02 Javascript
jquery使用append(content)方法注意事项分享
2014/01/06 Javascript
跟我学Node.js(四)---Node.js的模块载入方式与机制
2014/06/04 Javascript
JavaScript正则表达式中的ignoreCase属性使用详解
2015/06/16 Javascript
JS实现自定义简单网页软键盘效果代码
2015/11/05 Javascript
js如何判断输入字符串长度
2015/12/16 Javascript
JS中mouseover和mouseout多次触发问题如何解决
2016/06/06 Javascript
如何解决jQuery EasyUI 已打开Tab重新加载问题
2016/12/19 Javascript
vuejs开发组件分享之H5图片上传、压缩及拍照旋转的问题处理
2017/03/06 Javascript
小程序实现列表删除功能
2018/10/30 Javascript
webpack5 联邦模块介绍详解
2020/07/08 Javascript
swiper自定义分页器的样式
2020/09/14 Javascript
vue实现div可拖动位置也可改变盒子大小的原理
2020/09/16 Javascript
[04:15]DOTA2-DPC中国联赛1月19日Recap集锦
2021/03/11 DOTA
python编码总结(编码类型、格式、转码)
2016/07/01 Python
Python并发之多进程的方法实例代码
2018/08/15 Python
python系列 文件操作的代码
2019/10/06 Python
利用Pytorch实现简单的线性回归算法
2020/01/15 Python
解决c++调用python中文乱码问题
2020/07/29 Python
德国隐形眼镜店:LuckyLens
2018/07/29 全球购物
Strawberrynet草莓网新加坡站:护肤、彩妆、香水及美发产品
2018/08/31 全球购物
澳大利亚最大的护发和护肤品购物网站:RY
2019/12/26 全球购物
什么是触发器(trigger)? 触发器有什么作用?
2013/09/18 面试题
JAVA招聘远程笔试题
2015/07/23 面试题
建筑自我鉴定
2013/10/19 职场文书
医学专业本科毕业生自我鉴定
2013/12/28 职场文书
2014迎新年晚会策划方案
2014/02/23 职场文书
开业庆典主持词
2014/03/21 职场文书
单位个人查摆问题及整改措施
2014/10/28 职场文书
SQL实战演练之网上商城数据库商品类别数据操作
2021/10/24 MySQL
python 标准库原理与用法详解之os.path篇
2021/10/24 Python