vue實(shí)現(xiàn)滾動(dòng)鼠標(biāo)滾輪切換頁(yè)面
本文實(shí)例為大家分享了vue實(shí)現(xiàn)滾動(dòng)鼠標(biāo)滾輪切換頁(yè)面的具體代碼,供大家參考,具體內(nèi)容如下
新項(xiàng)目產(chǎn)品被甲方的要求逼瘋了,大概返稿了100+次吧,最后甲方網(wǎng)上找了個(gè)他們認(rèn)為的比較有科技感的模板,讓我們照著寫,首頁(yè)就是類似于縱向走馬燈,鼠標(biāo)滾動(dòng)切換,一次切換一整屏的效果。之前沒(méi)接觸過(guò),寫了個(gè)簡(jiǎn)單的demo,僅作為學(xué)習(xí)筆記。
其實(shí)原理很簡(jiǎn)單,就是把所有頁(yè)面放在一個(gè)div中,然后滾動(dòng)的時(shí)候改變外層div的top即可。
因?yàn)闈L動(dòng)條監(jiān)聽(tīng)事件是實(shí)時(shí)的,所以要加上節(jié)流來(lái)防止頁(yè)面切換太快速,我這控制在1.5s才能切換一頁(yè)。
其實(shí)vue不應(yīng)該操作dom,應(yīng)該用數(shù)據(jù)來(lái)渲染虛擬dom,但是有些地方暫時(shí)沒(méi)找到合適的方法,還是用的dom操作。
<template>
<div id="wrap" :style="{ height: screenHeight + 'px' }">
<div id="main" :style="{ top: nowTop + 'px' }">
<ul id="pageUl" type="circle">
<li id="pageUlLi1" class="pageUlLi" :class="{'active': curIndex == 1}"> </li>
<li id="pageUlLi2" class="pageUlLi" :class="{'active': curIndex == 2}"> </li>
<li id="pageUlLi3" class="pageUlLi" :class="{'active': curIndex == 3}"> </li>
<li id="pageUlLi4" class="pageUlLi" :class="{'active': curIndex == 4}"> </li>
<li id="pageUlLi5" class="pageUlLi" :class="{'active': curIndex == 5}"> </li>
</ul>
<div style="background-color: #1b6d85" id="page1" class="page"></div>
<div style="background-color: #5cb85c" id="page2" class="page"></div>
<div style="background-color: #8a6d3b" id="page3" class="page"></div>
<div style="background-color: #337ab7" id="page4" class="page"></div>
<div style="background-color: #66512c" id="page5" class="page"></div>
</div>
</div>
</template>
<script>
export default {
name: 'Home',
data(){
return{
screenWeight: 0, // 屏幕寬度
screenHeight: 0, // 屏幕高度
index: 1, // 用于判斷翻頁(yè)
curIndex: 1, // 當(dāng)前頁(yè)的index
startTime: 0, // 翻屏起始時(shí)間
endTime: 0, // 上一次翻屏結(jié)束時(shí)間
nowTop: 0, // 翻屏后top的位置
pageNum: 0, // 一共有多少頁(yè)
main: Object,
obj: Object
}
},
mounted(){
this.screenWeight = document.documentElement.clientWidth;
this.screenHeight = document.documentElement.clientHeight;
this.main = document.getElementById("main");
this.obj = document.getElementsByTagName("div");
for (let i = 0; i < this.obj.length; i++) {
if (this.obj[i].className == 'page') {
this.obj[i].style.height = this.screenHeight + "px";
}
}
this.pageNum = document.querySelectorAll(".page").length;
// 瀏覽器兼容
if ((navigator.userAgent.toLowerCase().indexOf("firefox") != -1)) {
document.addEventListener("DOMMouseScroll", this.scrollFun, false);
} else if (document.addEventListener) {
document.addEventListener("mousewheel", this.scrollFun, false);
} else if (document.attachEvent) {
document.attachEvent("onmousewheel", this.scrollFun);
} else {
document.onmousewheel = this.scrollFun;
}
},
methods:{
scrollFun(event) {
this.startTime = new Date().getTime();
// mousewheel事件中的 “event.wheelDelta” 屬性值:返回的如果是正值說(shuō)明滾輪是向上滾動(dòng)
// DOMMouseScroll事件中的 “event.detail” 屬性值:返回的如果是負(fù)值說(shuō)明滾輪是向上滾動(dòng)
let delta = event.detail || (-event.wheelDelta);
// 如果當(dāng)前滾動(dòng)開(kāi)始時(shí)間和上次滾動(dòng)結(jié)束時(shí)間的差值小于1.5s,則不執(zhí)行翻頁(yè)動(dòng)作,這樣做是為了實(shí)現(xiàn)類似節(jié)流的效果
if ((this.startTime - this.endTime) > 1500) {
if (delta > 0 && parseInt(this.main.offsetTop) >= -(this.screenHeight * (this.pageNum - 2))) {
// 向下滾動(dòng)
this.index++;
this.toPage(this.index);
}else if (delta < 0 && parseInt(this.main.offsetTop) < 0) {
// 向上滾動(dòng)
this.index--;
this.toPage(this.index);
}
// 本次翻頁(yè)結(jié)束,記錄結(jié)束時(shí)間,用于下次判斷
this.endTime = new Date().getTime();
}
},
// 翻頁(yè)
toPage(index) {
if (index != this.curIndex) {
let delta = index - this.curIndex;
this.nowTop = this.nowTop - delta * this.screenHeight;
this.curIndex = index;
}
}
}
}
</script>
<style>
html, body {
height: 100%;
}
body, ul, li, a, p, div {
/*慎刪*/
padding: 0px;
margin: 0px;
}
#wrap {
overflow: hidden;
width: 100%;
}
#main {
position: relative;
transition:top 1.5s;
}
.page {
/*謹(jǐn)刪*/
width: 100%;
margin: 0;
}
#pageUl {
position: fixed;
right: 10px;
bottom: 50%;
}
.active{
color: red;
}
</style>
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Vue鼠標(biāo)滾輪滾動(dòng)切換路由效果的實(shí)現(xiàn)方法
- vue tab滾動(dòng)到一定高度,固定在頂部,點(diǎn)擊tab切換不同的內(nèi)容操作
- vue實(shí)現(xiàn)整屏滾動(dòng)切換
- vue滾動(dòng)tab跟隨切換效果
- vue2.0路由切換后頁(yè)面滾動(dòng)位置不變BUG的解決方法
- vue頁(yè)面切換到滾動(dòng)頁(yè)面顯示頂部的實(shí)例
- vue中使用vue-router切換頁(yè)面時(shí)滾動(dòng)條自動(dòng)滾動(dòng)到頂部的方法
- 詳解使用vue-router進(jìn)行頁(yè)面切換時(shí)滾動(dòng)條位置與滾動(dòng)監(jiān)聽(tīng)事件
- vue實(shí)現(xiàn)圖片滾動(dòng)的示例代碼(類似走馬燈效果)
- vue實(shí)現(xiàn)3D切換滾動(dòng)效果
相關(guān)文章
vue.js綁定事件監(jiān)聽(tīng)器示例【基于v-on事件綁定】
這篇文章主要介紹了vue.js綁定事件監(jiān)聽(tīng)器的方法,結(jié)合實(shí)例形式分析了vue.js基于v-on事件綁定響應(yīng)鼠標(biāo)點(diǎn)擊相關(guān)操作技巧,需要的朋友可以參考下2018-07-07
vue3.0 CLI - 1 - npm 安裝與初始化的入門教程
這篇文章主要介紹了vue3.0 CLI - 1 - npm 安裝與初始化的入門教程,本文通過(guò)實(shí)例代碼相結(jié)合的形式,給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-09-09
axios取消請(qǐng)求與避免重復(fù)請(qǐng)求
在項(xiàng)目中經(jīng)常有一些場(chǎng)景會(huì)連續(xù)發(fā)送多個(gè)請(qǐng)求,而異步會(huì)導(dǎo)致最后得到的結(jié)果不是我們想要的,并且對(duì)性能也有非常大的影響,這篇文章主要給大家介紹了關(guān)于axios取消請(qǐng)求與避免重復(fù)請(qǐng)求的相關(guān)資料,需要的朋友可以參考下2021-06-06
前端+接口請(qǐng)求實(shí)現(xiàn)vue動(dòng)態(tài)路由
在Vue應(yīng)用中,結(jié)合前端和后端接口請(qǐng)求實(shí)現(xiàn)動(dòng)態(tài)路由,可根據(jù)用戶權(quán)限動(dòng)態(tài)生成路由,提高安全性與靈活性,本文就來(lái)介紹一下前端+接口請(qǐng)求實(shí)現(xiàn)vue動(dòng)態(tài)路由,感興趣的可以了解一下2024-09-09
django+vue實(shí)現(xiàn)跨域的示例代碼
在我們的項(xiàng)目中需要用到django實(shí)現(xiàn)跨域的問(wèn)題,本文通過(guò)示例代碼給大家詳細(xì)介紹django+vue實(shí)現(xiàn)跨域的方法,感興趣的朋友跟隨小編一起看看吧2022-03-03
解決Vue使用swiper動(dòng)態(tài)加載數(shù)據(jù),動(dòng)態(tài)輪播數(shù)據(jù)顯示白屏的問(wèn)題
今天小編就為大家分享一篇解決Vue使用swiper動(dòng)態(tài)加載數(shù)據(jù),動(dòng)態(tài)輪播數(shù)據(jù)顯示白屏的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-09-09
詳解VS Code使用之Vue工程配置format代碼格式化
這篇文章主要介紹了詳解VS Code使用之Vue工程配置format代碼格式化,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03
vue 實(shí)現(xiàn)購(gòu)物車總價(jià)計(jì)算
今天小編就為大家分享一篇vue 實(shí)現(xiàn)購(gòu)物車總價(jià)計(jì)算,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11
Element input樹(shù)型下拉框的實(shí)現(xiàn)代碼
這篇文章主要介紹了Element input樹(shù)型下拉框的實(shí)現(xiàn)代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-12-12

