vue 楼层滚动(导航切换以及滚动高亮)

实现功能:左侧导航高亮,右侧滚动对应左侧导航,左边点击对应右边内容

<template>
	<div>
	  <div class="left">
	     <div  @click="toJump(item.name)" v-for="(item,index) list" :key='index' :class="{ active: activeClass ===item.name }">{{item.name}}</div>
	     <div>B</div>
	  </div>
	   <div class="right">
	      <div class="item" ref="A" data-myName="A">一楼</div>
	      <div class="item" ref="B" data-myName="B">二楼</div>
	  </div>
	</div>
</template>
<script>
  export default{
    data(){
      return:{
        list:[
         {name:'A'},
         {name:'B'}
        ],
        activeClass :'A'
      }
    },
    methods:{
      toJump(name){
          this.$nextTick(() => {
	        this.$refs[name].scrollIntoView(true);
	        this.activeClass = name;
	        this.jumpFlag = true;
	      });
      },
      initDom(){
        this.$nextTick(() => {
	        const el = document.querySelector('.right'); // 父元素,其内部元素滚动
	        const h = el.querySelectorAll('.item');
	        const offettopList = [];
	        for (const k of h) {
	          // 将所有内容的标题以及距离顶部的距离存成一个数组
	          offettopList.push({ offsetTop: k.offsetTop, name: k.getAttribute('data-myName') });
	        }
	         el.addEventListener('scroll', this.handleScroll);
        });
      },
      handleScroll(){
         // 点击跳转的时候 滚动事件也会执行(所以点击的时候return)
         if (this.jumpFlag) {
	        this.jumpFlag = false;
	        return;
	      }
	      const el = document.querySelector('.right'); // 父元素,其内部元素滚动
	      if (!el) return;
      	  this.offsetTopList.forEach((t, i) => {
      	  // +50 是为了让他提前50px的时候导航栏高亮
	      if (el.scrollTop + 50 >= t.offsetTop) {
	          this.activeClass = t.name;
	        }
	      });
      },
      // 清除事件
       removeScrollFun() {
	      this.$nextTick(() => {
	        if (document.querySelector('.form')) {
	          document.querySelector('.form').removeEventListener('scroll', this.handleScroll);
	        }
	      });
	   }
    }
  }
</script>

思路:
offsetTop :(参考的对象是)祖先(不一定是父元素,一直往上找)元素、离自己最近、position不为static(static是position的默认值,如果一个元素不设置position,默认是static定位,因此offsetTop所参考的对象的position必须是relative,absolute,fixed中的一个)
scrollTop:获取对象最顶端与对象可见区域最顶端的距离
第一层offsetTop =0
第二层 offsetTop =第一层高度(有一点误差)
滚动的距离的距离大于等于这些的时候让导航栏高亮

this. n e x t T i c k ( c a l l b a c k ) ,当数据发生变化,更新后执行回调。 t h i s . nextTick(callback),当数据发生变化,更新后执行回调。 this. nextTick(callback),当数据发生变化,更新后执行回调。this.nextTick(callback),当dom发生变化,更新后执行的回调。
加this.$nextTick()是因为,this.activeClass没有变化,应该是因为我在watch中调用这个函数的,此时dom还没有渲染出来,

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
关于Vue· 美籍华人尤雨溪所作,文档健全,生态完整,与脸谱的React各领前端半边天下;· 相对于React,Vue相对于初学者更容易上手;· 目前统治C端市场的跨平台框架uni-app也是基于Vue的基础技术栈进行开发;· Vue与React在框架设计上有极高的相似度,上手Vue以后,我们可以轻松过渡到React学习;课程特色· 零基础教学,由浅入深,轻松诙谐,物超所值;· 基于官方文档教学,在学习Vue的同时学习阅读文档的方式,授人以鱼更授人以渔;· 课程包含Vuex和Vue-Router最新版内容,即所谓【Vue全家桶开发】;· 完整包含Vue3全部内容;· 含京东商城完整项目从零到一开发过程;· 含最新版@vue/cli的开发和生产环境打包流程;· 含Vite两套脚手架的开发和生产环境打包流程;· 含项目部署上线全流程;· 含自定义组件库高阶课程,带你从零到一完成电梯组件开发与发布;· 附Vue高频面试题50余道,OFFER轻松斩获;课程收益· 掌握Vue2+Vue3的框架基础知识;· 掌握Vue全家桶项目开发+打包+上线全流程;· 掌握自定义组件库技巧;· 掌握Vue高频面试题回答技巧;课程关键词Vue2 Vue3 Vuex Vue-RouterVue项目 Vue全家桶@vue/cli Vite 项目打包 项目上线 自定义组件库 Vue面试题写在最后就连太阳光照到地球都需要8分钟,所以,你也需要时间,耐心一点,持续修炼。 

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值