原生JS实现滚动监听与ID自动定位及Vue集成

作者:青山有信

时间:2026-10-22

浏览:112

本文介绍如何使用原生JS实现滚动监听与ID定位功能,效果类似锚点但更灵活。通过监听scroll事件获取滚动距离,结合offsetTop实现自动定位,并演示如何在Vue项目中集成,例如控制顶部菜单透明度随滚动变化,适用于需要精细滚动控制的场景。

文章目录

原生JS滚动监听与ID定位概述

本文主要讲解如何使用原生JavaScript实现滚动监听以及通过ID进行自动定位滚动,其效果类似于传统的锚点链接,但具备更高的灵活性,并且该方案同样适用于Vue框架环境。

实现这一功能的关键代码逻辑如下所示:

获取滚动距离的核心代码


var scroll = document.documentElement.scrollTop || document.body.scrollTop; //获取屏幕距离顶部的距离

以下代码片段展示了在引入mui库并结合Vue的项目中,如何在methods方法内部实现相关逻辑。

Vue中滚动监听与定位实现



init:function(){
  doc.addEventListener("scroll",function(){ // 实时监听,如果是ios需要做300ms延迟,否则点击索引的时候,对象距离顶部的高度不够,会出现闪动的效果,体验感不佳
    if(!noScroll){
      var appealDo = vm.$el.querySelector("#appealDo").offsetTop- 45; //获取#appealDo距离顶部的距离
      var appealComm = vm.$el.querySelector("#appealComm").offsetTop- 45; //获取#appealComm距离顶部的距离
      var scrollTop = doc.body.scrollTop || doc.documentElement.scrollTop; //获取屏幕距离顶部的距离
      if(scrollTop <= appealDo){
        vm.activeIdx = 0; // activeIdx 是表示高亮,用作顶栏菜单
      }else if(scrollTop > appealDo && scrollTop <= appealComm){
        vm.activeIdx = 1;
      }else if(scrollTop > appealComm){
        vm.activeIdx = 2;
      }
    }
    noScroll = false;
  });
},

toggleTypes:function(idx){
  noScroll = true;
  if (vm.activeIdx != idx) {
    if (idx === 0) {
      doc.body.scrollTop = 0;
      doc.documentElement.scrollTop = 0;
    }else if(idx === 1){
      vm.$nextTick(function(){
        doTop = vm.$el.querySelector("#appealDo").offsetTop - 45;
        doc.body.scrollTop = doTop;
        doc.documentElement.scrollTop = doTop;
      });
    }else{
      vm.$nextTick(function(){
        doTop = vm.$el.querySelector("#appealComm").offsetTop - 45;
        doc.body.scrollTop = doTop;
        doc.documentElement.scrollTop = doTop;
      });
    }
    vm.activeIdx = idx;
  }
},

在基于Vue脚手架构建的项目中,可以按照以下方式进行操作。以下案例具体演示了如何通过高度监听来控制顶部菜单的透明度变化效果。

Vue项目中的滚动透明度控制示例


mounted() {
  window.addEventListener('scroll', this.menu)
},
methods: {
  menu() {
    this.scroll = document.documentElement.scrollTop || document.body.scrollTop;
    var opacity = this.scroll / 44;
    if (opacity <= 1) {
      this.$nextTick(() => {
        this.opacity = opacity
      });
    } else {
      this.opacity = 1
    }

  }
 }

以上内容即为本文的全部介绍,希望能为读者的学习提供有益帮助,同时也欢迎大家继续支持本站获取更多技术分享。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章