我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何使用vue监听页面中某个div的滚动事件并判断滚动位置

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何使用vue监听页面中某个div的滚动事件并判断滚动位置

这篇文章主要介绍如何使用vue监听页面中某个div的滚动事件并判断滚动位置,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

  在开发中常常会遇到这样一个vue页面,页面分为左右两部分,左边是目录树,右边是一个类名为xq-box的div,在xq-box中多个div上下并列布局,每个div中的内容就对应着左边目录树中的相应节点,现在的目标是,要监听这个xq-box滚动事件,右边一旦开始滚动,就要知道滚动到哪个子div,并让左边的目录树中对应的节点高亮显示。要怎么做呢?

首先,先写好大概的页面布局,这里要注意,右边xq-box的子div要绑定"'xqItem'+序号"的id,为了下面用js能获取到匹配的dom元素:

<template>    <div class="container">        <div class="left-box">          <div class="menu-box">            <div class="menu-title">              <p>目录</p>            </div>            <div              class="menu-item"              v-for="(menu, index) in menuList"              :key="index"              :class="{ 'active': menuActive === index }"              @click="chooseMenu(menu.name, index)"            >              <img :class="lazy" data-src="menu.icon" class="menu-icon" />              <p>{{ menu.name }}</p>            </div>          </div>        </div>        <div class="right-box">          <div class="xq-box" ref="xqBox">            <div                class="xq-item"                :id="'xqItem' + index"                v-for="(item, index) in xqConList"                :key="index"              >                 <!--这里渲染出目录内容-->                 <div class="xq-item-name">                    {{ item.name }}                  </div>                  <div class="xq-item-con">                    {{ item.content }}                  </div>              </div>          </div>        </div>    </div></template>

然后,在css里给xq-box高度,设置其超出能滚动:

<style lang="stylus" scoped>  .right-box      height 600px      .xq-box          height 100%          overflow-y auto<style>

接着,在计算属性获取到这个ref="xqBox"的dom元素,写一个函数handleScroll()获取滚动距离并判断滚动到哪两个子div之间,并在页面渲染完后监听这个xq-box的滚动事件。

export default {  name: "menuList",   data() {    return {      menuActive: 0,  //左侧高亮的item      menuList: [],  //左侧目录树      xqConList: []  //右侧目录内容列表    }  },  computed: {    xqBox() {      return this.$refs.xqBox;    }  },  mounted() {    this.$nextTick(() => {      // //监听这个dom的scroll事件      // this.xqBox.onscroll = () => {      //   console.log("on scroll");      //   this.handleScroll();      // };      //监听这个dom的scroll事件      this.xqBox.addEventListener("scroll", this.handleScroll);    });  },  methods: {    handleScroll() {      //获取dom滚动距离      const scrollTop = this.xqBox.scrollTop;      //获取可视区高度      const offsetHeight = this.xqBox.offsetHeight;      //获取滚动条总高度      const scrollHeight = this.xqBox.scrollHeight;      //xqConList 为目录内容列表      for (let i = 0; i < this.xqConList.length - 1; i++) {        //offsetTop: 获取当前元素到其定位父级(offsetParent)的顶部距离        let offset_before = this.$el.querySelector("#xqItem" + i).offsetTop;          let offset_after = this.$el.querySelector("#xqItem" + (i + 1))          .offsetTop;        //根据xqItem离顶部距离判断滚动距离落在哪两个item之间        if (scrollTop >= offset_before && scrollTop < offset_after) {          // console.log("offset", offset_before, offset_after, scrollTop);          // console.log("scrollHeight", scrollTop, offsetHeight, scrollHeight);          //判断是否滚动到了底部          if (scrollTop + offsetHeight >= scrollHeight) {            // 把距离顶部的距离加上可视区域的高度 等于或者大于滚动条的总高度就是到达底部            // console.log("已滚动到底部");            if (this.menuActive < i) {              this.menuActive = i;            }          } else {            this.menuActive = i;          }          break;        }      }    },  }};

       经查询得知,Vue组件在patch阶段结束时会把this.$el赋值为挂载的根dom元素,我们可以直接使用$el的querySelector, querySelectorAll等方法获取匹配的元素。因1中每个内容块子div已经绑定id,所以此处可以用 this.$el.querySelector("#xqItem" + i) 获取到每个子div。

       还有一个要注意的是,这里之所以要判断是否滚动到了底部,是因为xq-box一旦滚动到底部,就可以看到最后几个目录对应的子div,此时的滚动距离scrollTop只会落在这最后几个子div的第一个子div(序号即当前本次循环中的i)的离顶部距离位置上,这个时候如果左侧目录树高亮的正好是这最后几个目录的其中任意一个,则无需更改高亮;但是如果此时 this.menuActive 的值还比最后几个子div中的第一个的序号要小,即比本次循环的 i 要小,则需要更改为当前的 i 值。

如果要点击左边目录树,右边xq-box也要自动滚动到相应的目录内容,则要增加以下方法:

chooseMenu(name, index) {      this.menuActive = index;      // //可以用scrollIntoView      // document.querySelector("#xqItem" + index).scrollIntoView({      //   block: "start",      //   behavior: "smooth"      // });      let offsetTop = this.$el.querySelector("#xqItem" + index).offsetTop;      console.log("#xqItem" + index + " offsetTop: " + offsetTop);      this.xqBox.scrollTop = this.$el.querySelector(        "#xqItem" + index      ).offsetTop;},

这样,“监听这个xq-box滚动事件,右边一旦开始滚动,就要知道滚动到哪个子div,并让左边的目录树中对应的节点高亮显示”这个功能便实现了。

以上是“如何使用vue监听页面中某个div的滚动事件并判断滚动位置”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网行业资讯频道!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何使用vue监听页面中某个div的滚动事件并判断滚动位置

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何使用vue监听页面中某个div的滚动事件并判断滚动位置

这篇文章主要介绍如何使用vue监听页面中某个div的滚动事件并判断滚动位置,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! 在开发中常常会遇到这样一个vue页面,页面分为左右两部分,左边是目录树,右边是一个类名为xq
2023-06-29

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录