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不可用的问题探究
Oct 01 Javascript
javascript单例模式的简单实现方法
Jul 25 Javascript
js检测离开或刷新页面时表单数据是否更改的方法
Aug 02 Javascript
微信小程序 slider 详解及实例代码
Jan 10 Javascript
使用angular帮你实现拖拽的示例
Jul 05 Javascript
基于js 本地存储(详解)
Aug 16 Javascript
基于jQuery实现图片推拉门动画效果的两种方法
Aug 26 jQuery
详解给Vue2路由导航钩子和axios拦截器做个封装
Apr 10 Javascript
讲解vue-router之什么是编程式路由
May 28 Javascript
JS数组求和的常用方法总结【5种方法】
Jan 14 Javascript
javascript设计模式 ? 迭代器模式原理与用法实例分析
Apr 17 Javascript
如何在JavaScript中正确处理变量
Dec 25 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中Date获取时间不正确怎么办
2008/06/05 PHP
php array_map array_multisort 高效处理多维数组排序
2009/06/11 PHP
php 生成文字png图片的代码
2011/04/17 PHP
php类自动加载器实现方法
2015/07/28 PHP
PHP实现求连续子数组最大和问题2种解决方法
2017/12/26 PHP
ThinkPHP3.2框架自带分页功能实现方法示例
2019/05/13 PHP
javascript判断单选框或复选框是否选中方法集锦
2007/04/04 Javascript
php对mongodb的扩展(小试牛刀)
2012/11/11 Javascript
jQuery删除节点的三个方法即remove()detach()和empty()
2013/12/27 Javascript
jQuery中delegate和on的用法与区别详细解析
2014/01/26 Javascript
使用jquery清空、复位整个输入域
2015/04/02 Javascript
jquery实现页面虚拟键盘特效
2015/08/08 Javascript
js中实现字符串和数组的相互转化详解
2016/01/24 Javascript
BootStrap table表格插件自适应固定表头(超好用)
2016/08/24 Javascript
js遍历json的key和value的实例
2017/01/22 Javascript
浅谈javascript的闭包
2017/01/23 Javascript
微信小程序图片选择、上传到服务器、预览(PHP)实现实例
2017/05/11 Javascript
vue实现样式之间的切换及vue动态样式的实现方法
2017/12/19 Javascript
javascript使用substring实现的展开与收缩文字功能示例
2019/06/17 Javascript
Layui Form 自定义验证的实例代码
2019/09/14 Javascript
Python数据库的连接实现方法与注意事项
2016/02/27 Python
python matplotlib 注释文本箭头简单代码示例
2018/01/08 Python
python PIL和CV对 图片的读取,显示,裁剪,保存实现方法
2019/08/07 Python
Python selenium爬取微博数据代码实例
2020/05/22 Python
python golang中grpc 使用示例代码详解
2020/06/03 Python
python实现MySQL指定表增量同步数据到clickhouse的脚本
2021/02/26 Python
利用CSS3制作简单的3d半透明立方体图片展示
2017/03/25 HTML / CSS
html5开发之viewport使用
2013/10/17 HTML / CSS
html2canvas把div保存图片高清图的方法示例
2018/03/05 HTML / CSS
写一个在SQL Server创建表的SQL语句
2012/03/10 面试题
工商学院毕业生个人自我评价
2013/09/19 职场文书
生物学学生自我评价
2014/01/17 职场文书
《槐乡五月》教学反思
2014/04/25 职场文书
管理岗位竞聘演讲稿
2014/08/18 职场文书
2014应届本科生自我评价
2014/09/13 职场文书
Nginx搭建rtmp直播服务器实现代码
2021/03/31 Servers