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 相关文章推荐
javascript获得CheckBoxList选中的数量
Oct 27 Javascript
jquery 查找iframe父级页面元素的实现代码
Aug 28 Javascript
httpclient模拟登陆具体实现(使用js设置cookie)
Dec 11 Javascript
js读取被点击次数的简单实例(从数据库中读取)
Mar 07 Javascript
JQuery显示隐藏DIV的方法及代码实例
Apr 16 Javascript
在vue-cli脚手架中配置一个vue-router前端路由
Jul 03 Javascript
vue resource post请求时遇到的坑
Oct 19 Javascript
Vue中使用canvas方法总结
Feb 12 Javascript
ES6知识点整理之数组解构和字符串解构的应用示例
Apr 17 Javascript
js实现一款简单踩白块小游戏(曾经很火)
Dec 02 Javascript
Javascript查看大图功能代码实现
May 07 Javascript
原生JavaScript写出Tabs标签页的实例代码
Jul 20 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
PHP下使用CURL方式POST数据至API接口的代码
2013/02/14 PHP
功能强大的php文件上传类
2016/08/29 PHP
PHP接收App端发送文件流的方法
2016/09/23 PHP
Laravel Intervention/image图片处理扩展包的安装、使用与可能遇到的坑详解
2017/11/14 PHP
PHP7 安装event扩展的实现方法
2019/10/08 PHP
JavaScript高级程序设计
2006/12/29 Javascript
你真的了解JavaScript吗?
2007/02/24 Javascript
解析Jquery取得iframe中元素的几种方法
2013/07/04 Javascript
浅析Javascript使用include/require
2013/11/13 Javascript
深入理解JavaScript编程中的同步与异步机制
2015/06/24 Javascript
JS中Eval解析JSON字符串的一个小问题
2016/02/21 Javascript
浅谈js中的三种继承方式及其优缺点
2016/08/10 Javascript
D3.js实现柱状图的方法详解
2016/09/21 Javascript
利用浮层使select不可选的实现方法
2016/12/03 Javascript
js中new一个对象的过程
2017/02/20 Javascript
解析jquery easyui tree异步加载子节点问题
2017/03/08 Javascript
JavaScript实现简单生成随机颜色的方法
2017/09/21 Javascript
解决vue中使用swiper插件问题及swiper在vue中的用法
2018/04/04 Javascript
使用angularjs.foreach时return的问题解决
2018/09/30 Javascript
微信小程序实现联动选择器
2019/02/15 Javascript
Node.js动手撸一个静态资源服务器的方法
2019/03/09 Javascript
关于JavaScript 数组你应该知道的事情(推荐)
2019/04/10 Javascript
Vue-input框checkbox强制刷新问题
2019/04/18 Javascript
[02:30]DOTA2放量测试专访海涛:呼吁保护新手玩家
2013/08/26 DOTA
[56:12]LGD vs Optic Supermajor小组赛D组胜者组决赛 BO3 第一场 6.3
2018/06/04 DOTA
决策树剪枝算法的python实现方法详解
2019/09/18 Python
Python for循环及基础用法详解
2019/11/08 Python
Django框架之中间件MiddleWare的实现
2019/12/30 Python
英国露营设备和户外服装购物网站:Simply Hike
2019/05/05 全球购物
alice McCALL官网:澳大利亚时尚品牌
2020/11/16 全球购物
《胡杨》教学反思
2014/02/16 职场文书
党员个人对照检查材料思想汇报
2014/09/16 职场文书
群众路线教育实践活动对照检查材料思想汇报(副处级领导)
2014/10/04 职场文书
乡镇一岗双责责任书
2015/01/29 职场文书
Python中super().__init__()测试以及理解
2021/12/06 Python
python中pd.cut()与pd.qcut()的对比及示例
2022/06/16 Python