最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2024年01月09日 11:19:50   作者:YIGE_MO  
為了實現(xiàn)全屏滾動效果,我們首先需要使用Vue.js框架搭建項目,這篇文章主要給大家介紹了關(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),本次主要實現(xiàn)的是上下滑動,所以當(dāng)前坐標(biāo)不做強(qiáng)制要求
      startY: undefined, // 記錄觸摸開始的Y坐標(biāo)
    };
  },

實際的滾動方法

	// 滾動事件
    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; // 計算滾動的告訴,是往上滾還往下滾
      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)的滾輪控制實現(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();
      }
    },

三、移動端觸摸實現(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é)

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

<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),本次主要實現(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; // 計算滾動的告訴,是往上滾還往下滾
      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)文章

  • vue引入jquery時報錯 $ is not defined的問題及解決

    vue引入jquery時報錯 $ is not defined的問題及解決

    這篇文章主要介紹了vue引入jquery時報錯 $ is not defined的問題及解決,具有很好的參考價值,希望對大家有所幫助。
    2022-09-09
  • Vue重定向redirect的三種寫法總結(jié)

    Vue重定向redirect的三種寫法總結(jié)

    這篇文章主要介紹了Vue重定向redirect的三種寫法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-06-06
  • vue如何導(dǎo)出json數(shù)據(jù)為excel表格并保存到本地

    vue如何導(dǎo)出json數(shù)據(jù)為excel表格并保存到本地

    這篇文章主要介紹了vue如何導(dǎo)出json數(shù)據(jù)為excel表格并保存到本地問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • vue 限制input只能輸入正數(shù)的操作

    vue 限制input只能輸入正數(shù)的操作

    這篇文章主要介紹了vue 限制input只能輸入正數(shù)的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • vue全局?jǐn)?shù)據(jù)管理示例詳解

    vue全局?jǐn)?shù)據(jù)管理示例詳解

    這篇文章主要為大家介紹了vue全局?jǐn)?shù)據(jù)管理示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • vuex中能直接修改state嗎

    vuex中能直接修改state嗎

    當(dāng)我們使用vuex的時候,時不時能看到“更改Vuex中的store中的狀態(tài)唯一辦法就是提交mutations”,但是有沒有試想過,我們不提交mutations其實也能修改state的值?答案是可以的,下面通過本文介紹下vuex修改state值的方法,感興趣的朋友一起看看吧
    2022-11-11
  • vue 倒計時結(jié)束跳轉(zhuǎn)頁面實現(xiàn)代碼

    vue 倒計時結(jié)束跳轉(zhuǎn)頁面實現(xiàn)代碼

    在商場大家經(jīng)??吹酵\囀召M倒計時支付頁面,今天小編通過本文給大家分享vue 倒計時結(jié)束跳轉(zhuǎn)頁面功能,感興趣的朋友一起看看吧
    2023-10-10
  • Vue路由傳參props解耦的三種方式小結(jié)

    Vue路由傳參props解耦的三種方式小結(jié)

    這篇文章主要介紹了Vue路由傳參props解耦的三種方式小結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • elementUI 動態(tài)生成幾行幾列的方法示例

    elementUI 動態(tài)生成幾行幾列的方法示例

    這篇文章主要介紹了elementUI 動態(tài)生成幾行幾列的方法示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • Vue使用el-upload批量上傳圖片時報錯問題處理方法

    Vue使用el-upload批量上傳圖片時報錯問題處理方法

    相信大家都知道在element-ui中,el-upload可以進(jìn)行文件多選操作,下面這篇文章主要給大家介紹了關(guān)于Vue使用el-upload批量上傳圖片時報錯問題的處理方法,文中通過圖文以及實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06

最新評論

石阡县| 敖汉旗| 公安县| 广灵县| 茂名市| 淳化县| 喀喇沁旗| 汨罗市| 遵义市| 中超| 中山市| 宽甸| 阳信县| 盘锦市| 郑州市| 南京市| 方城县| 柳江县| 镇康县| 沂源县| 娱乐| 日土县| 达日县| 朔州市| 六盘水市| 屏东县| 阳原县| 怀安县| 兴国县| 泾阳县| 东至县| 博乐市| 库尔勒市| 千阳县| 巴彦县| 英山县| 昭苏县| 太仆寺旗| 玉屏| 布尔津县| 黑山县|