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 相关文章推荐
this[] 指的是什么内容 讨论
Mar 24 Javascript
javascript 写类方式之一
Jul 05 Javascript
jquery 学习之二 属性(类)
Nov 25 Javascript
控制input输入框中提示信息的显示和隐藏的方法
Feb 12 Javascript
JavaScript中的bold()方法使用详解
Jun 08 Javascript
js显示当前日期时间和星期几
Oct 22 Javascript
WordPress中鼠标悬停显示和隐藏评论及引用按钮的实现
Jan 12 Javascript
JavaScript结合Bootstrap仿微信后台多图文界面管理
Jul 22 Javascript
详解Vue.js 2.0 如何使用axios
Apr 21 Javascript
Vue如何实现组件的源码解析
Jun 08 Javascript
vuejs使用$emit和$on进行组件之间的传值的示例
Oct 04 Javascript
js判断文件类型大小并给出提示的实现方法
Jan 03 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
综合图片计数器
2006/10/09 PHP
php发送post请求的三种方法
2014/02/11 PHP
PHP采用XML-RPC构造Web Service实例教程
2014/07/16 PHP
PHP中文编码小技巧
2014/12/25 PHP
VPS中使用LNMP安装WordPress教程
2014/12/28 PHP
thinkphp中多表查询中防止数据重复的sql语句(必看)
2016/09/22 PHP
菜鸟javascript基础资料整理2
2010/12/06 Javascript
使用Json比用string返回数据更友好,也更面向对象一些
2011/09/13 Javascript
jquery应该如何来设置改变按钮input的onclick事件
2012/12/10 Javascript
js中直接声明一个对象的方法
2014/08/10 Javascript
JS来动态的修改url实现对url的增删查改
2014/09/05 Javascript
JavaScript中的object转换成number或string规则介绍
2014/12/31 Javascript
JS实现网页每隔3秒弹出一次对话框的方法
2015/11/09 Javascript
javascript中FOREACH数组方法使用示例
2016/03/01 Javascript
jQuery实现可拖拽的许愿墙效果【附demo源码下载】
2016/09/14 Javascript
微信小程序中做用户登录与登录态维护的实现详解
2017/05/17 Javascript
JS实现发送短信验证后按钮倒计时功能(防止刷新倒计时失效)
2017/07/07 Javascript
[00:58]2016年国际邀请赛勇士令状宣传片
2016/06/01 DOTA
Python的Flask框架中@app.route的用法教程
2015/03/31 Python
django认证系统实现自定义权限管理的方法
2018/07/16 Python
在matplotlib的图中设置中文标签的方法
2018/12/13 Python
Python 异常的捕获、异常的传递与主动抛出异常操作示例
2019/09/23 Python
python实现四人制扑克牌游戏
2020/04/22 Python
Python中内建模块collections如何使用
2020/05/27 Python
怎么快速自学python
2020/06/22 Python
如何教少儿学习Python编程
2020/07/10 Python
Python通过getattr函数获取对象的属性值
2020/10/16 Python
canvas画布实现手写签名效果的示例代码
2019/04/23 HTML / CSS
生物专业个人自荐信范文
2013/11/29 职场文书
学生安全责任书
2014/04/15 职场文书
乡镇镇长个人整改措施
2014/10/01 职场文书
起诉离婚协议书样本
2014/11/25 职场文书
小学校园广播稿
2015/08/18 职场文书
2016年六一儿童节开幕词
2016/03/04 职场文书
总结Python连接CS2000的详细步骤
2021/06/23 Python
git stash(储藏)的用法总结
2022/06/25 Servers