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封装的不错的选项卡效果代码
Feb 15 Javascript
jQuery 可以拖动的div实现代码 脚本之家修正版
Jun 26 Javascript
javascript实现的距离现在多长时间后的一个格式化的日期
Oct 29 Javascript
jQuery中append()方法用法实例
Jan 08 Javascript
Vue中img的src属性绑定与static文件夹实例
May 18 Javascript
vue中实现移动端的scroll滚动方法
Mar 03 Javascript
JavaScript中的E-mail 地址格式验证
Mar 28 Javascript
JS实现模糊查询带下拉匹配效果
Jun 21 Javascript
webpack 开发和生产并行设置的方法
Nov 08 Javascript
JS实现排行榜文字向上滚动轮播效果
Nov 26 Javascript
原生JS实现烟花效果
Mar 10 Javascript
Vue组件间的通信pubsub-js实现步骤解析
Mar 11 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 图片加水印与上传图片加水印php类
2010/05/12 PHP
codeigniter框架批量插入数据
2014/01/09 PHP
PHP中创建和验证哈希的简单方法实探
2015/07/06 PHP
获取网站跟路径的javascript代码(站点及虚拟目录)
2009/10/20 Javascript
jQuery学习笔记之控制页面实现代码
2012/02/27 Javascript
深入理解JavaScript中的传值与传引用
2013/12/09 Javascript
jquery中each遍历对象和数组示例
2014/08/05 Javascript
AngularJS中指令的四种基本形式实例分析
2016/11/22 Javascript
Angular2学习笔记——详解路由器模型(Router)
2016/12/02 Javascript
Vue实现百度下拉提示搜索功能
2017/06/21 Javascript
微信小程序icon组件使用详解
2018/01/31 Javascript
vue-cli+webpack项目 修改项目名称的方法
2018/02/28 Javascript
基于Vue渲染与插件的加载顺序的问题详解
2018/03/05 Javascript
vue获取当前点击的元素并传值的实例
2018/03/09 Javascript
详解简单易懂的 ES6 Iterators 指南和示例
2019/09/24 Javascript
BootstrapValidator实现表单验证功能
2019/11/08 Javascript
在Vue里如何把网页的数据导出到Excel的方法
2020/09/30 Javascript
详解Django中的ifequal和ifnotequal标签使用
2015/07/16 Python
ubuntu安装sublime3并配置python3环境的方法
2018/03/15 Python
Python实现的读取文件内容并写入其他文件操作示例
2019/04/09 Python
python并发编程 Process对象的其他属性方法join方法详解
2019/08/20 Python
Python+Redis实现布隆过滤器
2019/12/08 Python
通过Canvas及File API缩放并上传图片完整示例
2013/08/08 HTML / CSS
家得宝加拿大家装网上商店:The Home Depot加拿大
2016/08/27 全球购物
Order by的几种用法
2013/06/16 面试题
幼儿教师师德承诺书
2014/05/23 职场文书
关于运动会的口号
2014/06/07 职场文书
竞选班干部演讲稿500字
2014/08/20 职场文书
2015年幼儿园元旦游艺活动策划书
2014/12/09 职场文书
领导干部考核评语
2015/01/04 职场文书
领导欢迎词范文
2015/01/26 职场文书
师范生教育见习总结
2015/06/23 职场文书
暑期社会实践新闻稿
2015/07/17 职场文书
三八节祝酒词
2015/08/11 职场文书
优秀共产党员主要事迹材料
2015/11/05 职场文书
2016领导干部廉洁自律心得体会
2016/01/13 职场文书