Vue监听滚动实现导航栏锚点定位

父级

<div>
       <div id="floor0"></div>
        <div id="floor1"></div>
        <div id="floor2"></div>
        <div id="floor3"></div>
   

子组件

   <ul id="tab"  slot="center" class="compreDiagnosisInfoUl" :class="navBarFixed == true ? 'navBarWrap':''">
                <li  id="tab1" class="active" @click="itemClick('floor0',0)">
                    <h2 class="top">导航一</h2>
                </li>
                <li id="tab2" @click="itemClick('floor1',1)"  v-if="header.fundtype != '货币型'">
                    <h2 class="top">导航二</h2>                 
                </li>
                <li id="tab3" @click="itemClick('floor2',2)">
                    <h2 class="top">导航三</h2>
                     </li>
                <li id="tab4" @click="itemClick('floor3',3)">
                    <h2 class="top">导航四</h2>
                     </li>
            </ul>

定义顶部吸附变量
data() {
navBarFixed:false
}

   methods: {
      itemClick(index,i){
                this.moveIndex = i;
                let anchorElement = document.getElementById(index);
                // console.log(anchorElement)
                let scrollTop = document.body.scrollTop ? document.body.scrollTop : document.documentElement.scrollTop;
                if(anchorElement && i != 1) {
                    anchorElement.scrollIntoView();
                }
                // console.log(scrollTop)
                // 点击的时候 滚动到对应的那个内容区
                // 1:获取点击的按钮对应页面的id
                let PageId = document.querySelector("#floor" + i);
                //:2:设置滚动 并且带有丝滑的滚动事件
                window.scrollTo({
                    top: PageId.offsetTop - 80,
                    behavior: "smooth"
                });

                this.tabSelect(i);
            },
            tabSelect(i){
                let docList = document.querySelectorAll('li');
                let doc = document.querySelector('#tab' + i);
                for(let i = 0; i < docList.length; i++){
                    docList[i].classList.remove('active');
                }
                doc.classList.add('active');
            },
            handleScroll(){
                 let scrollTop = window.pageYOffset + 80|| document.documentElement.scrollTop + 80|| document.body.scrollTop + 80
                let floor_0 = document.querySelector('#floor0').offsetTop;
                let floor_1 = document.querySelector('#floor1').offsetTop;
                let floor_2 = document.querySelector('#floor2').offsetTop;
                let floor_3 = document.querySelector('#floor3').offsetTop;

                //当滚动超过500时,实现吸顶效果
                if(scrollTop  > 500){
                    this.navBarFixed = true;
                }else {
                    this.navBarFixed = false
                }

                if (floor_0 <= scrollTop && scrollTop < floor_1) {
                    this.tabSelect(1);

                } else if (floor_1 <= scrollTop && scrollTop < floor_2) {
                    this.tabSelect(2);

                } else if (floor_2 <= scrollTop && scrollTop < floor_3) {
                    this.tabSelect(3);

                } else if (scrollTop >= floor_3) {
                    this.tabSelect(4);

                }

          
            },
   }
 mounted() {
   //事件监听滚动
            window.addEventListener('scroll',this.handleScroll)
}
 destroyed() {
            // 移除事件监听
            window.removeEventListener("scroll", this.handleScroll);
        },
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值