vue監(jiān)聽頁面中的某個div的滾動事件并判斷滾動的位置
在開發(fā)中常常會遇到這樣一個vue頁面,頁面分為左右兩部分,左邊是目錄樹,右邊是一個類名為xq-box的div,在xq-box中多個div上下并列布局,每個div中的內(nèi)容就對應(yīng)著左邊目錄樹中的相應(yīng)節(jié)點,現(xiàn)在的目標是,要監(jiān)聽這個xq-box滾動事件,右邊一旦開始滾動,就要知道滾動到哪個子div,并讓左邊的目錄樹中對應(yīng)的節(jié)點高亮顯示。要怎么做呢?
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"
>
<!--這里渲染出目錄內(nèi)容-->
<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高度,設(shè)置其超出能滾動:
<style lang="stylus" scoped>
.right-box
height 600px
.xq-box
height 100%
overflow-y auto
<style>3、接著,在計算屬性獲取到這個ref="xqBox"的dom元素,寫一個函數(shù)handleScroll()獲取滾動距離并判斷滾動到哪兩個子div之間,并在頁面渲染完后監(jiān)聽這個xq-box的滾動事件。
export default {
name: "menuList",
data() {
return {
menuActive: 0, //左側(cè)高亮的item
menuList: [], //左側(cè)目錄樹
xqConList: [] //右側(cè)目錄內(nèi)容列表
}
},
computed: {
xqBox() {
return this.$refs.xqBox;
}
},
mounted() {
this.$nextTick(() => {
// //監(jiān)聽這個dom的scroll事件
// this.xqBox.onscroll = () => {
// console.log("on scroll");
// this.handleScroll();
// };
//監(jiān)聽這個dom的scroll事件
this.xqBox.addEventListener("scroll", this.handleScroll);
});
},
methods: {
handleScroll() {
//獲取dom滾動距離
const scrollTop = this.xqBox.scrollTop;
//獲取可視區(qū)高度
const offsetHeight = this.xqBox.offsetHeight;
//獲取滾動條總高度
const scrollHeight = this.xqBox.scrollHeight;
//xqConList 為目錄內(nèi)容列表
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;
//根據(jù)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) {
// 把距離頂部的距離加上可視區(qū)域的高度 等于或者大于滾動條的總高度就是到達底部
// console.log("已滾動到底部");
if (this.menuActive < i) {
this.menuActive = i;
}
} else {
this.menuActive = i;
}
break;
}
}
},
}
};經(jīng)查詢得知,Vue組件在patch階段結(jié)束時會把this.$el賦值為掛載的根dom元素,我們可以直接使用$el的querySelector, querySelectorAll等方法獲取匹配的元素。因1中每個內(nèi)容塊子div已經(jīng)綁定id,所以此處可以用 this.$el.querySelector("#xqItem" + i) 獲取到每個子div。
還有一個要注意的是,這里之所以要判斷是否滾動到了底部,是因為xq-box一旦滾動到底部,就可以看到最后幾個目錄對應(yīng)的子div,此時的滾動距離scrollTop只會落在這最后幾個子div的第一個子div(序號即當前本次循環(huán)中的i)的離頂部距離位置上,這個時候如果左側(cè)目錄樹高亮的正好是這最后幾個目錄的其中任意一個,則無需更改高亮;但是如果此時 this.menuActive 的值還比最后幾個子div中的第一個的序號要小,即比本次循環(huán)的 i 要小,則需要更改為當前的 i 值。
4、如果要點擊左邊目錄樹,右邊xq-box也要自動滾動到相應(yīng)的目錄內(nèi)容,則要增加以下方法:
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;
},這樣,“監(jiān)聽這個xq-box滾動事件,右邊一旦開始滾動,就要知道滾動到哪個子div,并讓左邊的目錄樹中對應(yīng)的節(jié)點高亮顯示”這個功能便實現(xiàn)了。
到此這篇關(guān)于vue監(jiān)聽頁面中的某個div的滾動事件并判斷滾動的位置的文章就介紹到這了,更多相關(guān)vue監(jiān)聽div滾動事件 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 解決Vue頁面固定滾動位置的處理辦法
- Vue實現(xiàn)渲染數(shù)據(jù)后控制滾動條位置(推薦)
- vue實現(xiàn)滾動條到頂部或者到指定位置
- vue中實現(xiàn)點擊按鈕滾動到頁面對應(yīng)位置的方法(使用c3平滑屬性實現(xiàn))
- Vue滾動到指定位置的多種方式示例詳解
- Vue滾動頁面到指定位置的實現(xiàn)及避坑
- Vue列表如何實現(xiàn)滾動到指定位置樣式改變效果
- 解決vue無法設(shè)置滾動位置的問題
- vue通過滾動行為實現(xiàn)從列表到詳情,返回列表原位置的方法
- vue-scroller記錄滾動位置的示例代碼
- Vue頁面返回滾動位置恢復(keep-alive滾動記憶)
相關(guān)文章
Vue elementUI 自定義表單模板組件功能實現(xiàn)
在項目開發(fā)中,我們會遇到這種需求,在管理后臺添加自定義表單,在指定的頁面使用定義好的表單,這篇文章主要介紹了Vue elementUI 自定義表單模板組件,需要的朋友可以參考下2022-12-12
element-ui table span-method(行合并)的實現(xiàn)代碼
element-ui官網(wǎng)中關(guān)于行合并的例子是根據(jù)行號進行合并的,這顯然不符合我們?nèi)粘i_發(fā)需求,因為通常我們table中的數(shù)據(jù)都是動態(tài)生成的,非常具有實用價值,需要的朋友可以參考下2018-12-12
vue如何將base64流數(shù)據(jù)轉(zhuǎn)成pdf文件并在新頁面打開
這篇文章主要介紹了vue如何將base64流數(shù)據(jù)轉(zhuǎn)成pdf文件并在新頁面打開問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02
在小程序/mpvue中使用flyio發(fā)起網(wǎng)絡(luò)請求的方法
這篇文章主要介紹了在小程序/mpvue中使用flyio發(fā)起網(wǎng)絡(luò)請求的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-09-09

