如何使用vue监听页面中某个div的滚动事件并判断滚动位置
如何使用vue监听页面中某个div的滚动事件并判断滚动位置
这篇文章主要介绍如何使用vue监听页面中某个div的滚动事件并判断滚动位置,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
在开发中常常会遇到这样一个vue页面,页面分为左右两部分,左边是目录树,右边是一个类名为xq-box的div,在xq-box中多个div上下并列布局,每个div中的内容就对应着左边目录树中的相应节点,现在的目标是,要监听这个xq-box滚动事件,右边一旦开始滚动,就要知道滚动到哪个子div,并让左边的目录树中对应的节点高亮显示。要怎么做呢?
1、首先,先写好大概的页面布局,这里要注意,右边xq-box的子div要绑定"'xqItem'+序号"的id,为了下面用js能获取到匹配的dom元素:
<template><divclass="container"><divclass="left-box"><divclass="menu-box"><divclass="menu-title"><p>目录</p></div><divclass="menu-item"v-for="(menu,index)inmenuList":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><divclass="right-box"><divclass="xq-box"ref="xqBox"><divclass="xq-item":id="'xqItem'+index"v-for="(item,index)inxqConList":key="index"><!--这里渲染出目录内容--><divclass="xq-item-name">{{item.name}}</div><divclass="xq-item-con">{{item.content}}</div></div></div></div></div></template>
2、然后,在css里给xq-box高度,设置其超出能滚动:
<stylelang="stylus"scoped>.right-boxheight600px.xq-boxheight100%overflow-yauto<style>
3、接着,在计算属性获取到这个ref="xqBox"的dom元素,写一个函数handleScroll()获取滚动距离并判断滚动到哪两个子div之间,并在页面渲染完后监听这个xq-box的滚动事件。
exportdefault{name:"menuList",data(){return{menuActive:0,//左侧高亮的itemmenuList:[],//左侧目录树xqConList:[]//右侧目录内容列表}},computed:{xqBox(){returnthis.$refs.xqBox;}},mounted(){this.$nextTick(()=>{////监听这个dom的scroll事件//this.xqBox.onscroll=()=>{//console.log("onscroll");//this.handleScroll();//};//监听这个dom的scroll事件this.xqBox.addEventListener("scroll",this.handleScroll);});},methods:{handleScroll(){//获取dom滚动距离constscrollTop=this.xqBox.scrollTop;//获取可视区高度constoffsetHeight=this.xqBox.offsetHeight;//获取滚动条总高度constscrollHeight=this.xqBox.scrollHeight;//xqConList为目录内容列表for(leti=0;i<this.xqConList.length-1;i++){//offsetTop:获取当前元素到其定位父级(offsetParent)的顶部距离letoffset_before=this.$el.querySelector("#xqItem"+i).offsetTop;letoffset_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"//});letoffsetTop=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组件的自定义事件和全局事件总线怎么使用
-
vue中消息订阅与发布如何使用
vue中消息订阅与发布如何使用这篇文章主要介绍“vue中消息订阅与...
-
Vue显示图片的方式有哪些
-
vue引入静态jquery报错如何解决
vue引入静态jquery报错如何解决这篇文章主要介绍“vue引入...
-
vue-cropper怎么实现裁剪图片
-
怎么用Vue+NodeJS实现大文件上传
-
Vue如何实现简易跑马灯效果
-
Vue怎么指定不编译的文件夹和favicon.ico
Vue怎么指定不编译的文件夹和favicon.ico这篇文章主要介...
-
Vue中的插槽怎么使用
-
Vue WebPack怎么忽略指定文件或目录