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 相关文章推荐
响应鼠标变换表格背景或者颜色的代码
Mar 30 Javascript
利用JS重写Cognos右键菜单的实现代码
Apr 11 Javascript
js获取光标位置和设置文本框光标位置示例代码
Jan 09 Javascript
jQuery简单实现遍历数组的方法
Apr 14 Javascript
Backbone.js的一些使用技巧
Jul 01 Javascript
javascript实现Email邮件显示与删除功能
Nov 21 Javascript
JavaScript事件处理的方式(三种)
Apr 26 Javascript
JS开发中基本数据类型具体有哪几种
Oct 19 Javascript
vue 实现的树形菜的实例代码
Mar 19 Javascript
图文讲解用vue-cli脚手架创建vue项目步骤
Feb 12 Javascript
jQuery实现王者荣耀手风琴效果
Jan 17 jQuery
javascript canvas API内容整理
Feb 16 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
【星际争霸1】人族1v7家ZBath
2020/03/04 星际争霸
第七节--类的静态成员
2006/11/16 PHP
PHP HTML JavaScript MySQL代码如何互相传值的方法分享
2012/09/30 PHP
php判断页面是否是微信打开的示例(微信打开网页)
2014/04/25 PHP
PHP获取数组的键与值方法小结
2015/06/13 PHP
简单介绍PHP非阻塞模式
2016/03/03 PHP
php 多文件上传的实现实例
2016/10/23 PHP
Laravel5.3+框架定义API路径取消CSRF保护方法详解
2020/04/06 PHP
jQuery控制图片的hover效果(smartRollover.js)
2012/03/18 Javascript
S2SH整合JQuery+Ajax实现登录验证功能实现代码
2013/01/30 Javascript
Bootstrap编写一个在当前网页弹出可关闭的对话框 非弹窗
2016/06/30 Javascript
浅谈在js传递参数中含加号(+)的处理方式
2016/10/11 Javascript
vue-router项目实战总结篇
2018/02/11 Javascript
babel的使用及安装配置教程
2018/02/22 Javascript
JS限制输入框输入的实现代码
2018/07/02 Javascript
更改BootStrap popover的默认样式及popover简单用法
2018/09/13 Javascript
在Vant的基础上封装下拉日期控件的代码示例
2018/12/05 Javascript
用原生JS实现爱奇艺首页导航栏代码实例
2019/09/19 Javascript
小程序实现录音功能
2020/09/22 Javascript
python抓取网页中的图片示例
2014/02/28 Python
python 使用get_argument获取url query参数
2017/04/28 Python
解决python3运行selenium下HTMLTestRunner报错的问题
2018/12/27 Python
Django REST framework 如何实现内置访问频率控制
2019/07/23 Python
ipad上运行python的方法步骤
2019/10/12 Python
Python enumerate() 函数如何实现索引功能
2020/06/29 Python
网站性能延迟加载图像的五种技巧(小结)
2020/08/13 HTML / CSS
Dower & Hall官网:英国小众轻奢珠宝品牌
2019/01/31 全球购物
红领巾心向党广播稿
2014/01/19 职场文书
信息学院毕业生自荐信范文
2014/03/04 职场文书
《毛主席在花山》教学反思
2014/04/20 职场文书
高中生评语大全
2014/04/25 职场文书
在职证明格式样本
2015/06/15 职场文书
党员学习型组织心得体会
2019/06/21 职场文书
python实现ROA算子边缘检测算法
2021/04/05 Python
opencv 分类白天与夜景视频的方法
2021/06/05 Python
springboot 启动如何排除某些bean的注入
2021/08/02 Java/Android