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

Vue3實(shí)現(xiàn)一個(gè)可左右滑動(dòng)操作組件的示例代碼

 更新時(shí)間:2022年11月19日 10:20:40   作者:簡(jiǎn)單卟容易  
這篇文章主要為大家詳細(xì)介紹了如何利用Vue3實(shí)現(xiàn)一個(gè)可左右滑動(dòng)操作組件,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Vue有一定幫助,感興趣的可以學(xué)一下

為了實(shí)現(xiàn)左右滑動(dòng)能夠切換頁(yè)面,便有了做成組件的想法。

代碼實(shí)現(xiàn)

監(jiān)聽touchstart,記錄開始位置。

監(jiān)聽touchmove,記錄移動(dòng)的位置,計(jì)算移動(dòng)的方向,再把值設(shè)置給translateX(計(jì)算結(jié)果的值要能夠跟隨手指移動(dòng)),加入鎖定方向,是為禁止斜方向滑動(dòng)。

監(jiān)聽touchend,在這里判斷是否觸發(fā)change事件。

<script setup>
import { ref } from "vue";

const props = defineProps({
  leftDisabled: {
    type: Boolean,
    default: false
  },
  rightDisabled: {
    type: Boolean,
    default: false
  }
});

const emit = defineEmits(["change"]);

// 縱向滑動(dòng)時(shí)禁止水平滑動(dòng),水平滑動(dòng)時(shí)禁止縱向滑動(dòng);
// 水平滑動(dòng)結(jié)束超過屏幕二分之一時(shí)則toggle;
// 最大可滑動(dòng)不超過屏幕的三分之二;
const startX = ref(0);
const startY = ref(0);
const endX = ref(0);
const endY = ref(0);
const dValueX = ref(0);
const dValueY = ref(0);
const translateX = ref(0);
const horizontalMoved = ref(false);
const verticalMoved = ref(false);

const onTouchStart = (e) => {
  startX.value = e.targetTouches[0].pageX;
  startY.value = e.targetTouches[0].pageY;
};

const onTouchMove = (e) => {
  endX.value = e.targetTouches[0].pageX;
  endY.value = e.targetTouches[0].pageY;
  dValueX.value = Math.abs(startX.value - endX.value);
  dValueY.value = Math.abs(startY.value - endY.value);
  const stopRange = window.screen.width - window.screen.width / 3;
  // 水平滑動(dòng)長(zhǎng)度大于縱向滑動(dòng)長(zhǎng)度,選擇水平滑動(dòng)
  if (dValueX.value > dValueY.value) {
    if (verticalMoved.value) {
      e.preventDefault();
      return;
    } else horizontalMoved.value = true;

    if (dValueX.value < stopRange) {
      if (startX.value > endX.value) {
        if (!props.leftDisabled) translateX.value = dValueX.value * -1; // 向左劃
      } else {
        if (!props.rightDisabled) translateX.value = dValueX.value;
      }
    }

    e.preventDefault();
  } else {
    if (horizontalMoved.value) e.preventDefault();
    else verticalMoved.value = true;
  }
};

const onTouchEnd = (e) => {
  const range = window.screen.width / 2;
  if (horizontalMoved.value) {
    if (dValueX.value > range) {
      if (startX.value > endX.value) {
        // console.log("向左劃");
        if (!props.leftDisabled) handleChange("left");
      } else if (startX.value < endX.value) {
        // console.log("向右劃");
        if (!props.rightDisabled) handleChange("right");
      }
    }
  }
  horizontalMoved.value = false;
  verticalMoved.value = false;
  translateX.value = 0;
  startX.value = endX.value = 0;
  startY.value = endY.value = 0;
};

const handleChange = (value) => emit("change", value);
</script>

<template>
  <div
    :style="`transition-duration: 200ms; transform: translateX(${translateX}px)`"
  >
    <slot
      :touchstart="onTouchStart"
      :touchmove="onTouchMove"
      :touchend="onTouchEnd"
    ></slot>
  </div>
</template>

如何使用

<swipe-container @change="onToggleChange">
  <template #default="{ touchstart, touchmove, touchend }">
    <div
      class="list"
      @touchstart="touchstart"
      @touchmove="touchmove"
      @touchend="touchend"
    >
      <div
        v-for="item in list"
        class="card"
      ></div>
    </div>
  </template>
</swipe-container>

到此這篇關(guān)于Vue3實(shí)現(xiàn)一個(gè)可左右滑動(dòng)操作組件的示例代碼的文章就介紹到這了,更多相關(guān)Vue左右滑動(dòng)操作內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 一篇文章帶你吃透Vue生命周期(結(jié)合案例通俗易懂)

    一篇文章帶你吃透Vue生命周期(結(jié)合案例通俗易懂)

    這篇文章主要給大家介紹了關(guān)于如何通過一篇文章帶你吃透Vue生命周期,文章通過結(jié)合案例更加的通俗易懂,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-02-02
  • mpvue中配置vuex并持久化到本地Storage圖文教程解析

    mpvue中配置vuex并持久化到本地Storage圖文教程解析

    這篇文章主要介紹了mpvue中配置vuex并持久化到本地Storage的教程詳解,# 配置vuex和在vue中相同,只是mpvue有一個(gè)坑,就是不能直接在new Vue的時(shí)候傳入store。本文分步驟給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2018-03-03
  • vue中pc移動(dòng)滾動(dòng)穿透問題及解決

    vue中pc移動(dòng)滾動(dòng)穿透問題及解決

    這篇文章主要介紹了vue中pc移動(dòng)滾動(dòng)穿透問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • vue3實(shí)現(xiàn)旋轉(zhuǎn)圖片驗(yàn)證

    vue3實(shí)現(xiàn)旋轉(zhuǎn)圖片驗(yàn)證

    這篇文章主要為大家詳細(xì)介紹了vue3實(shí)現(xiàn)旋轉(zhuǎn)圖片驗(yàn)證,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Vue實(shí)現(xiàn)無縫輪播效果

    Vue實(shí)現(xiàn)無縫輪播效果

    這篇文章主要為大家詳細(xì)介紹了Vue實(shí)現(xiàn)無縫輪播效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • Vue實(shí)現(xiàn)數(shù)據(jù)篩選與搜索功能的示例代碼

    Vue實(shí)現(xiàn)數(shù)據(jù)篩選與搜索功能的示例代碼

    在許多Web應(yīng)用程序中,數(shù)據(jù)篩選和搜索是關(guān)鍵的用戶體驗(yàn)功能,本文將深入探討在Vue中如何進(jìn)行數(shù)據(jù)篩選與搜索的實(shí)現(xiàn),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-10-10
  • vue-router的兩種模式的區(qū)別

    vue-router的兩種模式的區(qū)別

    這篇文章主要介紹了vue-router的兩種模式的區(qū)別,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-05-05
  • vue?中簡(jiǎn)單使用mock的示例代碼詳解

    vue?中簡(jiǎn)單使用mock的示例代碼詳解

    這篇文章主要介紹了vue?中簡(jiǎn)單使用mock的方法,本文通過圖文實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-02-02
  • Laravel 如何在blade文件中使用Vue組件的示例代碼

    Laravel 如何在blade文件中使用Vue組件的示例代碼

    這篇文章主要介紹了Laravel 如何在blade文件中使用Vue組件,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Vue腳手架編寫試卷頁(yè)面功能

    Vue腳手架編寫試卷頁(yè)面功能

    腳手架是一種用于快速開發(fā)Vue項(xiàng)目的系統(tǒng)架構(gòu),這篇文章主要介紹了Vue腳手架實(shí)現(xiàn)試卷頁(yè)面功能,通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03

最新評(píng)論

兴国县| 大姚县| 新津县| 文昌市| 中方县| 古交市| 米易县| 潜山县| 山西省| 虹口区| 南岸区| 彭山县| 津南区| 彭阳县| 天气| 天门市| 清新县| 湛江市| 应城市| 湖南省| 松桃| 丹凤县| 炉霍县| 林芝县| 南江县| 隆林| 内乡县| 万荣县| 田东县| 元氏县| 铜川市| 咸阳市| 商洛市| 南宫市| 武汉市| 大方县| 巧家县| 朝阳区| 铁力市| 桂平市| 泾阳县|