欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

VUE屏幕整體滾動(滑動或滾輪)原生方法舉例

 更新時間:2024年01月09日 11:19:50   作者:YIGE_MO  
為了實(shí)現(xiàn)全屏滾動效果,我們首先需要使用Vue.js框架搭建項(xiàng)目,這篇文章主要給大家介紹了關(guān)于VUE屏幕整體滾動(滑動或滾輪)原生方法的相關(guān)資料,需要的朋友可以參考下

前言

一年嗖的一下兒就過去了,最近幾年很流行搞年終總結(jié),因此也研究了一下相關(guān)的內(nèi)容,主要記錄一下手機(jī)端與電腦端分辨通過滑動與滾輪使得整個屏幕滾動的效果

一、基礎(chǔ)函數(shù)

不論是使用滑動還是滾輪的方式基礎(chǔ)的轉(zhuǎn)換邏輯是相通的

1、頁面部分

首先完成頁面部分的搭建,@mousewheel、@DOMMouseScroll主要是為了監(jiān)聽滾輪的事件。@touchstart、@touchend、@touchmove為觸摸事件。

<template>
  <div class="fullPage" ref="fullPage">
    <div
        class="fullPageContainer"
        ref="fullPageContainer"
        @mousewheel="mouseWheelHandle"
        @DOMMouseScroll="mouseWheelHandle"
        @touchstart="handleTouchstart"
        @touchend="handleTouchend"
        @touchmove="handleTouchmove"
    >
      <div class="section section1">1</div>
      <div class="section section2">2</div>
      <div class="section section3">3</div>
      <div class="section section4">4</div>
    </div>
  </div>
</template>

<style scoped lang="scss">
.fullPage {
  height: 100vh; //一定要設(shè)置,保證占滿
  overflow: hidden; //一定要設(shè)置,多余的先隱藏
  background-color: rgb(189, 211, 186);
}

.fullPageContainer {
  width: 100%;
  height: 100vh;
  transition: all linear 0.5s;
}

.section {
  width: 100%;
  height: 100vh;
  background-position: center center;
  background-repeat: no-repeat;
}

//下面的只是為了區(qū)分每個頁面的背景顏色
.section1 {
  background-color: rgb(189, 211, 186);
}

.section2 {
  background-color: rgb(44, 48, 43);
}

.section3 {
  background-color: rgb(116, 104, 109);
}

.section4 {
  background-color: rgb(201, 202, 157);
}
</style>

2、頁面切換使用的函數(shù)

全局變量

 data() {
    return {
      fullpage: {
        current: 1, // 當(dāng)前的頁面編號
        isScrolling: false, // 是否在滾動,是為了防止?jié)L動多頁,需要通過一個變量來控制是否滾動
        deltaY: 0 // 返回鼠標(biāo)滾輪的垂直滾動量,保存的鼠標(biāo)滾動事件的deleteY,用來判斷是往下還是往上滾
      },
      startTime: undefined, // 記錄觸摸開始的時間
      startX: undefined, // 記錄觸摸開始的X坐標(biāo),本次主要實(shí)現(xiàn)的是上下滑動,所以當(dāng)前坐標(biāo)不做強(qiáng)制要求
      startY: undefined, // 記錄觸摸開始的Y坐標(biāo)
    };
  },

實(shí)際的滾動方法

	// 滾動事件
    move(index) {
      this.fullpage.isScrolling = true; // 為了防止?jié)L動多頁,需要通過一個變量來控制是否滾動
      this.directToMove(index); //執(zhí)行滾動
      setTimeout(() => {  //這里的動畫是1s執(zhí)行完,使用setTimeout延遲1s后解鎖
        this.fullpage.isScrolling = false;
      }, 1010);
    },
	// 執(zhí)行滾動
    directToMove(index) {
      let height = this.$refs["fullPage"].clientHeight; //獲取屏幕的寬度
      let scrollPage = this.$refs["fullPageContainer"]; // 獲取執(zhí)行tarnsform的元素
      let scrollHeight; // 計(jì)算滾動的告訴,是往上滾還往下滾
      scrollHeight = -(index - 1) * height + "px";
      scrollPage.style.transform = `translateY(${scrollHeight})`;
      this.fullpage.current = index;
    }

上下切換事件

	// 往下切換
    next() {
      let len = 4; // 頁面的個數(shù)
      if (this.fullpage.current + 1 <= len) { // 如果當(dāng)前頁面編號+1 小于總個數(shù),則可以執(zhí)行向下滑動
        this.fullpage.current += 1; // 頁面+1
        this.move(this.fullpage.current); // 執(zhí)行切換
      }
    },
    // 往上切換
    pre() {
      if (this.fullpage.current - 1 > 0) { // 如果當(dāng)前頁面編號-1 大于0,則可以執(zhí)行向下滑動
        this.fullpage.current -= 1;// 頁面+1
        this.move(this.fullpage.current);// 執(zhí)行切換
      }
    },

二、鼠標(biāo)的滾輪控制實(shí)現(xiàn)切換

 	// 監(jiān)聽鼠標(biāo)監(jiān)聽
    mouseWheelHandle(event) {
      // 添加冒泡阻止
      let evt = event || window.event;
      if (evt.stopPropagation) {
        evt.stopPropagation();
      } else {
        evt.returnValue = false;
      }
      if (this.fullpage.isScrolling) { // 判斷是否可以滾動
        return false;
      }
      let e = event.originalEvent || event;
      this.fullpage.deltaY = e.deltaY || e.detail; // Firefox使用detail
      if (this.fullpage.deltaY > 0) {
        this.next();
      } else if (this.fullpage.deltaY < 0) {
        this.pre();
      }
    },

三、移動端觸摸實(shí)現(xiàn)切換

觸摸事件相當(dāng)于滾動事件來說更為復(fù)雜,首先要移除手指滑動時對屏幕的影響,否則很容易出現(xiàn)白邊,影響視覺效果。然后需要記錄移動的距離是否有效,移動的事件是否過長等等…

// 清除觸摸事件
    handleTouchmove(event) {
      event.preventDefault()
    },
    //手指按下屏幕
    handleTouchstart(event) {
      this.startTime = Date.now()
      this.startX = event.changedTouches[0].clientX
      this.startY = event.changedTouches[0].clientY
    },
    //手指離開屏幕
    handleTouchend(event) {
      const endTime = Date.now()
      const endX = event.changedTouches[0].clientX
      const endY = event.changedTouches[0].clientY
      //判斷按下的時長
      if (endTime - this.startTime > 2000) {
        return
      }
      //滑動的方向
      let direction = "";
      //先判斷用戶滑動的距離,是否合法,合法:判斷滑動的方向 注意 距離要加上絕對值
      if (Math.abs(endY - this.startY) > 10) {
        //滑動方向
        direction = endY - this.startY > 0 ? "down" : "up"
      } else {
        return
      }
      //用戶做了合法的滑動操作
      // console.log('方向'+direction)
      if (direction === 'up') {
        this.next();
      }
      if (direction === 'down') {
        this.pre();
      }
    }

總結(jié)

最后,將全部頁面文件貼一下,方便大家搬運(yùn).

<template>
  <div class="fullPage" ref="fullPage">
    <div
        class="fullPageContainer"
        ref="fullPageContainer"
        @mousewheel="mouseWheelHandle"
        @DOMMouseScroll="mouseWheelHandle"
        @touchstart="handleTouchstart"
        @touchend="handleTouchend"
        @touchmove="handleTouchmove"
    >
      <div class="section section1">1</div>
      <div class="section section2">2</div>
      <div class="section section3">3</div>
      <div class="section section4">4</div>
    </div>
  </div>
</template>
<script>
export default {
  name: "Home",
  data() {
    return {
      fullpage: {
        current: 1, // 當(dāng)前的頁面編號
        isScrolling: false, // 是否在滾動,是為了防止?jié)L動多頁,需要通過一個變量來控制是否滾動
        deltaY: 0 // 返回鼠標(biāo)滾輪的垂直滾動量,保存的鼠標(biāo)滾動事件的deleteY,用來判斷是往下還是往上滾
      },
      startTime: undefined, // 記錄觸摸開始的時間
      startX: undefined, // 記錄觸摸開始的X坐標(biāo),本次主要實(shí)現(xiàn)的是上下滑動,所以當(dāng)前坐標(biāo)不做強(qiáng)制要求
      startY: undefined, // 記錄觸摸開始的Y坐標(biāo)
    };
  },
  methods: {
	// 往下切換
    next() {
      let len = 4; // 頁面的個數(shù)
      if (this.fullpage.current + 1 <= len) { // 如果當(dāng)前頁面編號+1 小于總個數(shù),則可以執(zhí)行向下滑動
        this.fullpage.current += 1; // 頁面+1
        this.move(this.fullpage.current); // 執(zhí)行切換
      }
    },
    // 往上切換
    pre() {
      if (this.fullpage.current - 1 > 0) { // 如果當(dāng)前頁面編號-1 大于0,則可以執(zhí)行向下滑動
        this.fullpage.current -= 1;// 頁面+1
        this.move(this.fullpage.current);// 執(zhí)行切換
      }
    },
    // 滾動事件
    move(index) {
      this.fullpage.isScrolling = true; // 為了防止?jié)L動多頁,需要通過一個變量來控制是否滾動
      this.directToMove(index); //執(zhí)行滾動
      setTimeout(() => {  //這里的動畫是1s執(zhí)行完,使用setTimeout延遲1s后解鎖
        this.fullpage.isScrolling = false;
      }, 1010);
    },
    // 執(zhí)行滾動
    directToMove(index) {
      let height = this.$refs["fullPage"].clientHeight; //獲取屏幕的寬度
      let scrollPage = this.$refs["fullPageContainer"]; // 獲取執(zhí)行tarnsform的元素
      let scrollHeight; // 計(jì)算滾動的告訴,是往上滾還往下滾
      scrollHeight = -(index - 1) * height + "px";
      scrollPage.style.transform = `translateY(${scrollHeight})`;
      this.fullpage.current = index;
    },
    // 監(jiān)聽鼠標(biāo)監(jiān)聽
    mouseWheelHandle(event) {
      // 添加冒泡阻止
      let evt = event || window.event;
      if (evt.stopPropagation) {
        evt.stopPropagation();
      } else {
        evt.returnValue = false;
      }
      if (this.fullpage.isScrolling) { // 判斷是否可以滾動
        return false;
      }
      let e = event.originalEvent || event;
      this.fullpage.deltaY = e.deltaY || e.detail; // Firefox使用detail
      if (this.fullpage.deltaY > 0) {
        this.next();
      } else if (this.fullpage.deltaY < 0) {
        this.pre();
      }
    },
    // 清除觸摸事件
    handleTouchmove(event) {
      event.preventDefault()
    },
    //手指按下屏幕
    handleTouchstart(event) {
      this.startTime = Date.now()
      this.startX = event.changedTouches[0].clientX
      this.startY = event.changedTouches[0].clientY
    },
    //手指離開屏幕
    handleTouchend(event) {
      const endTime = Date.now()
      const endX = event.changedTouches[0].clientX
      const endY = event.changedTouches[0].clientY
      //判斷按下的時長
      if (endTime - this.startTime > 2000) {
        return
      }
      //滑動的方向
      let direction = "";
      //先判斷用戶滑動的距離,是否合法,合法:判斷滑動的方向 注意 距離要加上絕對值
      if (Math.abs(endY - this.startY) > 10) {
        //滑動方向
        direction = endY - this.startY > 0 ? "down" : "up"
      } else {
        return
      }
      //用戶做了合法的滑動操作
      // console.log('方向'+direction)
      if (direction === 'up') {
        this.next();
      }
      if (direction === 'down') {
        this.pre();
      }
    }
  }
};
</script>
<style scoped lang="scss">
.fullPage {
  height: 100vh; //一定要設(shè)置,保證占滿
  overflow: hidden; //一定要設(shè)置,多余的先隱藏
  background-color: rgb(189, 211, 186);
}

.fullPageContainer {
  width: 100%;
  height: 100vh;
  transition: all linear 0.5s;
}

.section {
  width: 100%;
  height: 100vh;
  background-position: center center;
  background-repeat: no-repeat;
}

.section1 {
  background-color: rgb(189, 211, 186);
}

.section2 {
  background-color: rgb(44, 48, 43);
}

.section3 {
  background-color: rgb(116, 104, 109);
}

.section4 {
  background-color: rgb(201, 202, 157);
}
</style>

總結(jié) 

到此這篇關(guān)于VUE屏幕整體滾動(滑動或滾輪)原生方法的文章就介紹到這了,更多相關(guān)VUE屏幕整體滾動內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Element-UI中Upload上傳文件前端緩存處理示例

    Element-UI中Upload上傳文件前端緩存處理示例

    這篇文章主要介紹了Element-UI中Upload上傳文件前端緩存處理示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-02-02
  • Vue專屬狀態(tài)管理庫Pinia的使用與實(shí)踐分享

    Vue專屬狀態(tài)管理庫Pinia的使用與實(shí)踐分享

    在 Vue 的開發(fā)中,狀態(tài)管理是一個不可或缺的部分,尤其是在復(fù)雜的應(yīng)用中,組件之間的狀態(tài)共享和管理變得至關(guān)重要,Pinia 作為 Vue 的專屬狀態(tài)管理庫,本文將深入介紹 Pinia 的基礎(chǔ)知識、核心功能以及實(shí)際使用場景,需要的朋友可以參考下
    2024-11-11
  • vue3+ts深入組件Props實(shí)例詳解

    vue3+ts深入組件Props實(shí)例詳解

    Props是組件之間進(jìn)行數(shù)據(jù)傳遞的一種方式,可以將數(shù)據(jù)從父組件傳遞給子組件,這篇文章主要介紹了vue3+ts深入組件Props的實(shí)例詳解,需要的朋友可以參考下
    2023-09-09
  • Composition API思想封裝NProgress示例詳解

    Composition API思想封裝NProgress示例詳解

    這篇文章主要為大家介紹了Composition API思想封裝NProgress示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • vue配置多代理服務(wù)接口地址操作

    vue配置多代理服務(wù)接口地址操作

    這篇文章主要介紹了vue配置多代理服務(wù)接口地址操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • element-ui封裝一個Table模板組件的示例

    element-ui封裝一個Table模板組件的示例

    這篇文章主要介紹了element-ui封裝一個Table模板組件的示例,幫助大家更好的理解和學(xué)習(xí)vue框架的使用,感興趣的朋友可以了解下
    2021-01-01
  • element-ui動態(tài)添加表單項(xiàng)并實(shí)現(xiàn)事件觸發(fā)驗(yàn)證代碼示例

    element-ui動態(tài)添加表單項(xiàng)并實(shí)現(xiàn)事件觸發(fā)驗(yàn)證代碼示例

    這篇文章主要給大家介紹了關(guān)于element-ui動態(tài)添加表單項(xiàng)并實(shí)現(xiàn)事件觸發(fā)驗(yàn)證的相關(guān)資料,其實(shí)就是利用了vue的v-for循環(huán)渲染,通過添加數(shù)組實(shí)現(xiàn)動態(tài)添加表單項(xiàng),需要的朋友可以參考下
    2023-12-12
  • vue監(jiān)聽滾動事件實(shí)現(xiàn)滾動監(jiān)聽

    vue監(jiān)聽滾動事件實(shí)現(xiàn)滾動監(jiān)聽

    本文主要介紹了vue監(jiān)聽滾動事件實(shí)現(xiàn)滾動監(jiān)聽的相關(guān)資料。具有很好的參考價值。下面跟著小編一起來看下吧
    2017-04-04
  • VUE入門學(xué)習(xí)之事件處理

    VUE入門學(xué)習(xí)之事件處理

    這篇文章主要介紹了vue事件處理原理及過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2021-10-10
  • 基于element-UI input等組件寬度修改方式

    基于element-UI input等組件寬度修改方式

    這篇文章主要介紹了基于element-UI input等組件寬度修改方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03

最新評論