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 validate 验证注册表单实例演示
Mar 25 Javascript
元素未显示设置width/height时IE中使用currentStyle获取为auto
May 04 Javascript
node.js中的fs.lstat方法使用说明
Dec 16 Javascript
简介AngularJS的视图功能应用
Jun 17 Javascript
C#微信小程序服务端获取用户解密信息实例代码
Mar 10 Javascript
老生常谈js中的MVC
Jul 25 Javascript
vue的基本用法与常见指令
Aug 15 Javascript
vuex学习之Actions的用法详解
Aug 29 Javascript
zTree树形菜单交互选项卡效果的实现方法
Dec 25 Javascript
教你使用vue-cli快速构建的小说阅读器
May 13 Javascript
JavaScript命名空间模式实例详解
Jun 20 Javascript
详解如何在Javascript和Sass之间共享变量
Nov 13 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中var_dump,var_export,print_r三个函数的区别
2013/06/21 PHP
php模拟ping命令(php exec函数的使用方法)
2013/10/25 PHP
php使用unset()删除数组中某个单元(键)的方法
2015/02/17 PHP
PHP数字前补0的自带函数sprintf 和number_format的用法(详解)
2017/02/06 PHP
PHP高效获取远程图片尺寸和大小的实现方法
2017/10/20 PHP
PHP实现支持CURL字符串证书传输的方法
2019/03/23 PHP
ie focus bug 解决方法
2009/09/03 Javascript
javascript 面向对象编程 function也是类
2009/09/17 Javascript
浅谈JavaScript的事件
2015/02/27 Javascript
Node.js Addons翻译(C/C++扩展)
2016/06/12 Javascript
使用vue编写一个点击数字计时小游戏
2016/08/31 Javascript
JavaScript正则表达式实例详解
2016/10/16 Javascript
jQuery+json实现动态创建复杂表格table的方法
2016/10/25 Javascript
vue模板语法-插值详解
2017/03/06 Javascript
AngularJS基于http请求实现下载php生成的excel文件功能示例
2018/01/23 Javascript
Spring boot 和Vue开发中CORS跨域问题解决
2018/09/05 Javascript
使用webpack搭建pixi.js开发环境
2020/02/12 Javascript
js实现无缝轮播图
2020/03/09 Javascript
js前端对于大量数据的展示方式及处理方法
2020/12/02 Javascript
[52:20]VP vs VG Supermajor小组赛 B组胜者组决赛 BO3 第一场 6.2
2018/06/03 DOTA
Python字符转换
2008/09/06 Python
Python查询Mysql时返回字典结构的代码
2012/06/18 Python
python获取当前用户的主目录路径方法(推荐)
2017/01/12 Python
django 将model转换为字典的方法示例
2018/10/16 Python
python同时替换多个字符串方法示例
2019/09/17 Python
TensorFlow自定义损失函数来预测商品销售量
2020/02/05 Python
Pytorch mask-rcnn 实现细节分享
2020/06/24 Python
细说NumPy数组的四种乘法的使用
2020/12/18 Python
AmazeUI中模态框的实现
2020/08/19 HTML / CSS
伦敦的高级牛仔布专家:Trilogy
2018/08/06 全球购物
美国优质宠物用品购买网站:Muttropolis
2020/02/17 全球购物
小学家长评语大全
2014/04/16 职场文书
社会调查研究计划书
2014/05/01 职场文书
2014年计划生育工作总结
2014/11/14 职场文书
2014年销售工作总结范文
2014/12/01 职场文书
MySQL 数据恢复的多种方法汇总
2021/06/21 MySQL