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)為的比較有科技感的模板,讓我們照著寫(xiě),首頁(yè)就是類似于縱向走馬燈,鼠標(biāo)滾動(dòng)切換,一次切換一整屏的效果。之前沒(méi)接觸過(guò),寫(xiě)了個(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)文章
vue3?setup語(yǔ)法糖中獲取slot插槽的dom對(duì)象代碼示例
slot元素是一個(gè)插槽出口,標(biāo)示了父元素提供的插槽內(nèi)容將在哪里被渲染,這篇文章主要給大家介紹了關(guān)于vue3?setup語(yǔ)法糖中獲取slot插槽的dom對(duì)象的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-04-04在Vue3中處理異步API調(diào)用并更新表單數(shù)據(jù)的方法示例
這篇文章主要介紹了如何在Vue3中處理異步API調(diào)用并更新表單數(shù)據(jù)(附Demo),文中通過(guò)代碼示例講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-06-06vue路由$router.push()使用query傳參的實(shí)際開(kāi)發(fā)使用
在vue項(xiàng)目中我們用函數(shù)式編程this.$router.push跳轉(zhuǎn),用query傳遞一個(gè)對(duì)象時(shí)要把這個(gè)對(duì)象先轉(zhuǎn)化為字符串,然后在接收的時(shí)候要轉(zhuǎn)化為對(duì)象,下面這篇文章主要給大家介紹了關(guān)于vue路由$router.push()使用query傳參的實(shí)際開(kāi)發(fā)使用,需要的朋友可以參考下2022-11-11vue.js添加一些觸摸事件以及安裝fastclick的實(shí)例
今天小編就為大家分享一篇vue.js添加一些觸摸事件以及安裝fastclick的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-08-08Vue.js結(jié)合Ueditor富文本編輯器的實(shí)例代碼
本篇文章主要介紹了Vue.js結(jié)合Ueditor的項(xiàng)目實(shí)例代碼,這里整理了詳細(xì)的代碼,具有一定的參考價(jià)值,有興趣的可以了解一下2017-07-07element el-table實(shí)現(xiàn)多級(jí)表頭的代碼
多級(jí)表頭的作用與優(yōu)勢(shì),多級(jí)表頭能夠清晰地展示數(shù)據(jù)的層次結(jié)構(gòu),幫助我們更好地理解數(shù)據(jù)之間的關(guān)系,下面通過(guò)本文給大家介紹element el-table實(shí)現(xiàn)多級(jí)表頭的代碼,感興趣的朋友跟隨小編一起看看吧2024-04-04vue3中emit('update:modelValue')使用簡(jiǎn)單示例
這篇文章主要給大家介紹了關(guān)于vue3中emit('update:modelValue')使用的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-09-09解決vue無(wú)法設(shè)置滾動(dòng)位置的問(wèn)題
這篇文章主要介紹了解決vue無(wú)法設(shè)置滾動(dòng)位置的問(wèn)題 ,需要的朋友可以參考下2018-10-10