Vue實(shí)現(xiàn)監(jiān)聽某個(gè)元素滾動(dòng),親測(cè)有效
監(jiān)聽某個(gè)元素滾動(dòng),親測(cè)有效
Vue 開發(fā),有時(shí)候只需要監(jiān)聽某個(gè)元素是否滾動(dòng)就行了,不需要去監(jiān)聽整個(gè)頁(yè)面。
Vue 有自帶的 @scroll 但是并沒(méi)有什么用,給某個(gè)滾動(dòng)元素加上,滾動(dòng)該元素并不會(huì)調(diào)用,加上 CSS 支持滾動(dòng)樣式也一樣。
怎么監(jiān)聽呢?通過(guò) addEventListener 與 @mousewheel 配合實(shí)現(xiàn)
addEventListener: 增加的是拖拽滾動(dòng)條也能監(jiān)聽到滾動(dòng)@mousewheel:添加的是非拖拽滾動(dòng)條滾動(dòng),比如在元素上鼠標(biāo)或者觸摸板滾動(dòng)。
<template> ? <!-- 滾動(dòng)視圖 --> ? <div class="scrollview" ref="scrollview" @mousewheel="scrollChange"> ? ? <!-- 內(nèi)容區(qū)域 --> ? ? <div class="content"></div> ? </div> </template>
<script>
export default {
? mounted () {
? ? // 獲取指定元素
? ? const scrollview = this.$refs['scrollview']
? ? // 添加滾動(dòng)監(jiān)聽,該滾動(dòng)監(jiān)聽了拖拽滾動(dòng)條
? ? // 尾部的 true 最好加上,我這邊測(cè)試沒(méi)加 true ,拖拽滾動(dòng)條無(wú)法監(jiān)聽到滾動(dòng),加上則可以監(jiān)聽到拖拽滾動(dòng)條滾動(dòng)回調(diào)
? ? scrollview.addEventListener('scroll', this.scrollChange, true)
? },
? // beforeDestroy 與 destroyed 里面移除都行
? beforeDestroy () {
? ? // 獲取指定元素
? ? const scrollview = this.$refs['scrollview']
? ? // 移除監(jiān)聽
? ? scrollview.removeEventListener('scroll', this.scrollChange, true)
? },
? methods: {
? ? // 滾動(dòng)監(jiān)聽
? ? scrollChange () {
? ? ? console.log('滾動(dòng)中')
? ? }
? }
}
</script><style scoped>
.scrollview {
? height: 100px;
? overflow-y: auto;
? background-color: yellow;
}
.content {
? height: 500px;
? background-color: red;
}
</style>案例效果

監(jiān)聽dom元素滾動(dòng)到了可視區(qū)?
場(chǎng)景:當(dāng)某個(gè)元素滾動(dòng)到可視區(qū)時(shí),為其添加動(dòng)畫樣式(animate.css)。
common/utils.js
export const isElementNotInViewport = function(el) {
?? ?if (el) {
?? ??? ?let rect = el.getBoundingClientRect();
?? ??? ?return (
?? ??? ??? ?rect.top >=
?? ??? ??? ??? ?(window.innerHeight || document.documentElement.clientHeight) ||
?? ??? ??? ?rect.bottom <= 0
?? ??? ?);
?? ?}
};在組件內(nèi)的使用
import { isElementNotInViewport } from "common/utils";
export default {
? ?...
? data() {
? ? return {
? ? ? header_Animate: false
? ? }
? },
? mounted() {
? ? // 監(jiān)聽滾動(dòng)事件
? ? window.addEventListener("scroll", this.scrollToTop);
? },
? beforeRouteLeave(to, form, next) {
? ? // 離開路由移除滾動(dòng)事件
? ? window.removeEventListener('scroll',this.scrollToTop);
? ? next();
? },
? methods: {
? ? // 滾動(dòng)事件
? ? scrollToTop() {
?? ? ?!isElementNotInViewport(this.$refs.header) ? this.header_Animate = true: '';
? ? }
? }
}<template>
? <div?
? ? ref="header"?
? ? class="animate__animated"?
? ? :class="{animate__slideInLeft:header_Animate}">
? </div>
</template>這樣就可以控制當(dāng)dom元素滾動(dòng)到可視區(qū)的時(shí)候,給他添加動(dòng)畫樣式了。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Vue實(shí)現(xiàn)簡(jiǎn)單基礎(chǔ)的圖片裁剪功能
這篇文章主要為大家詳細(xì)介紹了如何利用Vue2實(shí)現(xiàn)簡(jiǎn)單基礎(chǔ)的圖片裁剪功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下2022-09-09
vue-router路由參數(shù)刷新消失的問(wèn)題解決方法
本篇文章主要介紹了vue-router路由參數(shù)刷新消失的問(wèn)題解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06
vue-pdf打包后無(wú)法預(yù)覽問(wèn)題及修復(fù)方式
這篇文章主要介紹了vue-pdf打包后無(wú)法預(yù)覽問(wèn)題及修復(fù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03
Vue項(xiàng)目中實(shí)現(xiàn)描點(diǎn)跳轉(zhuǎn)scrollIntoView的案例
這篇文章主要介紹了Vue項(xiàng)目中實(shí)現(xiàn)描點(diǎn)跳轉(zhuǎn)scrollIntoView的案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09
vue進(jìn)度條組件實(shí)現(xiàn)代碼(可拖拽可點(diǎn)擊)
在日常開發(fā)中隨著需求的個(gè)性化,邏輯的復(fù)雜化,自定義組件也變得越來(lái)越常見,這篇文章主要給大家介紹了關(guān)于vue進(jìn)度條組件實(shí)現(xiàn)(可拖拽可點(diǎn)擊)的相關(guān)資料,需要的朋友可以參考下2023-12-12

