返回顶部
首页 > 资讯 > 前端开发 > JavaScript >vue监听页面中的某个div的滚动事件并判断滚动的位置
  • 571
分享到

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

2024-04-02 19:04:59 571人浏览 泡泡鱼
摘要

  在开发中常常会遇到这样一个Vue页面,页面分为左右两部分,左边是目录树,右边是一个类名为xq-box的div,在xq-box中多个div上下并列布局,每个di

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

1、首先,先写好大概的页面布局,这里要注意,右边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 :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>

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

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

3、接着,在计算属性获取到这个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 值。

4、如果要点击左边目录树,右边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的滚动事件并判断滚动的位置的文章就介绍到这了,更多相关vue监听div滚动事件 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: vue监听页面中的某个div的滚动事件并判断滚动的位置

本文链接: https://lsjlt.com/news/142966.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • vue监听页面中的某个div的滚动事件并判断滚动的位置
      在开发中常常会遇到这样一个vue页面,页面分为左右两部分,左边是目录树,右边是一个类名为xq-box的div,在xq-box中多个div上下并列布局,每个di...
    99+
    2024-04-02
  • 如何使用vue监听页面中某个div的滚动事件并判断滚动位置
    这篇文章主要介绍如何使用vue监听页面中某个div的滚动事件并判断滚动位置,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!  在开发中常常会遇到这样一个vue页面,页面分为左右两部分,左边是目录树,...
    99+
    2023-06-29
  • vue监听页面滚动事件怎么配置
    在Vue中监听页面滚动事件,可以通过在`mounted`钩子函数中添加滚动事件监听器。具体步骤如下:1. 在Vue组件中添加一个监听...
    99+
    2023-09-20
    vue
  • vue监听页面滚动到某个高度触发事件流程
    目录监听页面滚动到某个高度触发事件动态监听页面滚动高度监听页面滚动到某个高度触发事件 methods: {    showIcon() {       if (         !!...
    99+
    2024-04-02
  • vue怎么监听页面滚动到某个高度触发事件
    本篇内容主要讲解“vue怎么监听页面滚动到某个高度触发事件”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“vue怎么监听页面滚动到某个高度触发事件”吧!监听页面滚动到某个高度触发事件methods...
    99+
    2023-06-30
  • CSS网页滚动监听:监听网页滚动事件并执行相应的操作
    CSS网页滚动监听:监听网页滚动事件并执行相应的操作随着前端技术的不断发展,网页的效果和交互也越来越丰富多样。其中,滚动监听是一种常见的技术,可以实现在用户滚动网页时,根据滚动位置执行一些特效或者操作。一般来说,滚动监听可以通过JavaSc...
    99+
    2023-11-18
    CSS 操作 滚动监听
  • js如何监听html页面的上下滚动事件
    这篇文章将为大家详细讲解有关js如何监听html页面的上下滚动事件,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。最近在一个项目中,在写前端页面的时候,想像以前做Andro...
    99+
    2024-04-02
  • jquery怎么判断滚动条滚到页面底部并执行事件
    本文小编为大家详细介绍“jquery怎么判断滚动条滚到页面底部并执行事件”,内容详细,步骤清晰,细节处理妥当,希望这篇“jquery怎么判断滚动条滚到页面底部并执行事件”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧...
    99+
    2023-07-04
  • vue如何监听页面的滚动的开始和结束
    目录监听页面的滚动的开始和结束vue监听页面滚动事件方法:监听滚动实现问题:监听不到页面的滚动监听页面的滚动的开始和结束 export default { data(...
    99+
    2024-04-02
  • js实现控制整个页面滚动条的位置
    目录js控制整个页面滚动条位置方法一方法二js滚动条属性、设置滚动条滚动速度设置滚动条速度代码示例js控制整个页面滚动条位置 方法一 1、通过div的scrollTop变动控制垂直滚...
    99+
    2022-11-13
    js滚动条 滚动条位置 js控制滚动条位置
  • 小程序中监听页面滚动的几种方法实例
    目录目录实现效果下面是Intersection Observer在MDN上的介绍IntersectionObserverrelativeToViewport接受参数 Object m...
    99+
    2024-04-02
  • 如何解决Vue页面固定滚动位置的问题
    这篇文章将为大家详细讲解有关如何解决Vue页面固定滚动位置的问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。问题描述:通常见于 列表页Li...
    99+
    2024-04-02
  • Vue滚动页面到指定位置的实现及避坑
    目录Vue滚动页面到指定位置方法1方法2方法3避坑指南滚动页面到一定距离后固定Vue滚动页面到指定位置 在Vue中,有三种方式可以实现H5页面滑动至指定位置 方法1 //先获取目标位...
    99+
    2024-04-02
  • JS实现页面滚动到关闭时的位置与不滚动效果
    目录滚动不滚动标题显而易见,要说两种情况:重新打开页面或者返回某个页面时滚动到上次离开时的位置,以及不滚动保持在顶部。 滚动 这也有两种情况:页面重新打开,与返回某个页面。如果是前者...
    99+
    2024-04-02
  • JavaScript中怎么获取当前页面的滚动位置
    这期内容当中小编将会给大家带来有关JavaScript中怎么获取当前页面的滚动位置,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。要获取当前页面的滚动条纵坐标位置,用:do...
    99+
    2024-04-02
  • JS如何实现页面滚动到关闭时的位置与不滚动效果
    这篇文章主要讲解了“JS如何实现页面滚动到关闭时的位置与不滚动效果”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JS如何实现页面滚动到关闭时的位置与不滚动效果”吧!标题显而易见,要说两种情况...
    99+
    2023-06-30
  • vue中记录滚动条位置的两种方法
    目录1、方法一2、方法二总结1、方法一 在点击的时候记录滚动条位置,存入本地再次进入该路由读取滚动跳位置 1、1 跳转时路由存入scroll 如果要有多个页面,可以把名称也存进去,这...
    99+
    2023-01-16
    vue 滚动条位置 vue监听滚动条的位置 vue获取滚动条位置
  • layui中自动滚动二级iframe页面到指定位置的示例分析
    小编给大家分享一下layui中自动滚动二级iframe页面到指定位置的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、...
    99+
    2024-04-02
  • vue如何实现返回上一页面时回到原先滚动的位置
    这篇文章主要为大家展示了“vue如何实现返回上一页面时回到原先滚动的位置”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“vue如何实现返回上一页面时回到原先滚动的...
    99+
    2024-04-02
  • 强大的CSS:scroll-snap滚动事件停止及元素位置检测
    一、Scroll Snap是前端必备技能CSS Scroll Snap是个非常好用的特性,可以让网页容器滚动停止的时候,无需任何JS代码的参与,浏览器可以自动平滑定位到指定元素的指定位置。类似幻灯片广告效果就可以纯CSS实现。而且CSS S...
    99+
    2023-06-03
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作