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 isType() 类型判断代码
Feb 14 Javascript
jQuery-onload让第一次页面加载时图片是淡入方式显示
May 23 Javascript
document.createElement()用法
Mar 13 Javascript
window.onload和$(function(){})的区别介绍
Oct 30 Javascript
javascript中不易分清的slice,splice和split三个函数
Mar 29 Javascript
AngularJS基础 ng-srcset 指令简单示例
Aug 03 Javascript
jQuery的ajax中使用FormData实现页面无刷新上传功能
Jan 16 Javascript
json2.js 入门教程之使用方法与实例分析
Sep 14 Javascript
微信小程序录音与播放录音功能
Dec 25 Javascript
vuex与组件联合使用的方法
May 10 Javascript
jQuery实现合并表格单元格中相同行操作示例
Jan 28 jQuery
微信小程序性能优化之checkSession的使用
Mar 06 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
重量级动漫纷纷停播!唯独OVERLORD第四季正在英魂之刃继续更新
2020/05/06 日漫
PHP中英混合字符串截取函数代码
2011/07/17 PHP
PHP cdata 处理(详细介绍)
2013/07/05 PHP
PHP翻页跳转功能实现方法
2020/11/30 PHP
phpstorm激活码2020附使用详细教程
2020/09/25 PHP
文本加密解密
2006/06/23 Javascript
基于jquery的修改当前TAB显示标题的代码
2010/12/11 Javascript
日历查询的算法 如何计算某一天是星期几
2012/12/12 Javascript
JS刷新父窗口的几种方式小结(推荐)
2016/11/09 Javascript
原生JS实现圣旨卷轴展开效果
2017/03/06 Javascript
详谈jQuery中使用attr(), prop(), val()获取value的异同
2017/04/25 jQuery
Js中使用正则表达式验证输入是否有特殊字符
2018/09/07 Javascript
详解vue的双向绑定原理及实现
2019/05/05 Javascript
javascript canvas实现简易时钟例子
2020/09/05 Javascript
[02:51]2014DOTA2国际邀请赛 IG战队官方纪录片
2014/07/21 DOTA
[01:12]DOTA2次级职业联赛 - Newbee.Y 战队宣传片
2014/12/01 DOTA
[39:19]完美世界DOTA2联赛PWL S2 SZ vs LBZS 第二场 11.26
2020/11/30 DOTA
对pandas中apply函数的用法详解
2018/04/10 Python
Python运维自动化之nginx配置文件对比操作示例
2018/08/29 Python
python使用zip将list转为json的方法
2018/12/31 Python
python实现五子棋人机对战游戏
2020/03/25 Python
Java ExcutorService优雅关闭方式解析
2020/05/30 Python
Python 基于jwt实现认证机制流程解析
2020/06/22 Python
详解Python中@staticmethod和@classmethod区别及使用示例代码
2020/12/14 Python
CSS3弹性布局内容对齐(justify-content)属性使用详解
2017/07/31 HTML / CSS
CSS3制作苹果风格键盘特效
2015/02/26 HTML / CSS
HTML5本地存储之Database Storage应用介绍
2013/01/06 HTML / CSS
使用canvas绘制超炫时钟
2014/12/17 HTML / CSS
酒店管理专业毕业生推荐信
2013/11/10 职场文书
九年级体育教学反思
2014/01/23 职场文书
高校教师岗位职责
2014/03/18 职场文书
初中班主任评语大全
2014/04/24 职场文书
工会趣味活动方案
2014/08/18 职场文书
自荐信格式模板
2015/03/27 职场文书
导游词之吉林花园山
2019/10/17 职场文书
Mysql中常用的join连接方式
2022/05/11 MySQL