Vue3.0 手書きカルーセル効果

Vue3.0 手書きカルーセル効果

この記事では、Vue3.0の手書きカルーセル効果の具体的なコードを参考までに共有します。具体的な内容は次のとおりです。

始めましょう

HTML構造

<テンプレート>
  <div class="xtx-carousel" @mouseleave="enterFn" @mouseenter="leaveFn">
    <ul class="carousel-body">
      <li class="carousel-item" :class="{ fade: indexid === index }" v-for="(item, index) in list" :key="item.id">
        <ルーターリンク先="/">
          <img :src="item.imgUrl" alt="" />
        </ルーターリンク>
      </li>
    </ul>
    <a href="javascript:;" class="carousel-btn prev" @click="lastPage"><i class="iconfont icon-angle-left"></i></a>
    <a href="javascript:;" class="carousel-btn next" @click="nextPage"><i class="iconfont icon-angle-right"></i></a>
    <div class="carousel-indicator">
      <span @click="indexid = i - 1" v-for="i in list.length" :key="i" :class="{ active: indexid === i - 1 }"></span>
    </div>
  </div>
</テンプレート>

js構文

<スクリプト>
'vue' から { ref, watch, onUnmounted } をインポートします。
エクスポートデフォルト{
  名前:「カルーセル」
  小道具: {
    // 画像データリスト: {
      タイプ: オブジェクト、
      デフォルト: () => {}
    },
    // カルーセルの各切り替えイベントの継続時間: {
      タイプ: 数値、
      デフォルト: 2
    },
    // カルーセルの自動再生を有効にするかどうか: {
      タイプ: ブール値、
      デフォルト: true
    },
    // クリックすると複数のページをめくる: {
      タイプ: 数値、
      デフォルト: 1
    }
  },
  セットアップ(プロパティ) {
    // インデックス const indexid = ref(0)
    // カルーセル const timer = ref(null)
    定数TimeFn = () => {
      クリアインターバル(タイマー)
      // 各実行の前に前のタイマーをクリアします timer.value = setInterval(() => {
        インデックスID.値++
        // 制限を超えた場合は補充します if (indexid.value > props.list.length - 1) {
          インデックスID値 = 0
        }
      }, props.duration * 1000)
    }
    // クリック + 次の停止画像 const nextPage = () => {
      インデックスID.値 += props.ページ
      if (indexid.value > props.list.length - 1) {
        インデックスID値 = 0
      }
    }
    // クリック + 前の画像 const lastPage = () => {
      indexid.value -= props.page
      インデックスID値<0の場合{
        インデックスID値 = propsリストの長さ - 1
      }
    }
    // タイマーをクリアする const leaveFn = () => {
      // console.log('タイマーをクリア')
      clearInterval(タイマー値)
      // コンソール.log(タイマー)
    }
    // コンポーネント消費、クリーンアップタイマー onUnmounted(() => {
      clearInterval(タイマー値)
    })
    // タイマーを開始する const enterFn = () => {
      props.list.length > 1 の場合、props.autoplay は次のように動作します。
        // console.log('タイマーを開始')
        時間関数()
      }
    }
    時計(
      () => props.list、
      () => {
        props.list.length > 1 の場合、props.autoplay は次のように動作します。
          時間関数()
        }
      }
    )
    {indexid、leaveFn、enterFn、nextPage、lastPage} を返します。
  }
}
</スクリプト>

CSS スタイル

<style スコープ lang="less">
.xtx-カルーセル{
  幅: 100%;
  高さ: 100%;
  最小幅: 300px;
  最小高さ: 150px;
  位置: 相対的;
  .カルーセル{
    &-体 {
      幅: 100%;
      高さ: 100%;
    }
    &-アイテム {
      幅: 100%;
      高さ: 100%;
      位置: 絶対;
      左: 0;
      上: 0;
      不透明度: 0;
      遷移: 不透明度 0.5 秒線形;
      &.フェード{
        不透明度: 1;
        zインデックス: 1;
      }
      画像 {
        幅: 100%;
        高さ: 100%;
      }
    }
    &-インジケータ {
      位置: 絶対;
      左: 0;
      下: 20px;
      zインデックス: 2;
      幅: 100%;
      テキスト配置: 中央;
      スパン {
        表示: インラインブロック;
        幅: 12px;
        高さ: 12px;
        背景: rgba(0, 0, 0, 0.2);
        境界線の半径: 50%;
        カーソル: ポインタ;
        ~ スパン {
          左マージン: 12px;
        }
        &。アクティブ {
          背景: #fff;
        }
      }
    }
    &-btn {
      幅: 44px;
      高さ: 44px;
      背景: rgba(0, 0, 0, 0.2);
      色: #fff;
      境界線の半径: 50%;
      位置: 絶対;
      上: 228px;
      zインデックス: 2;
      テキスト配置: 中央;
      行の高さ: 44px;
      不透明度: 0;
      遷移: すべて 0.5 秒;
      &.前へ {
        左: 20px;
      }
      &。次 {
        右: 20px;
      }
    }
  }
  &:ホバー{
    .carousel-btn {
      不透明度: 1;
    }
  }
}
</スタイル>

グローバルプラグインとして登録する

'../carousel.vue' から Carousel をインポートします。
// Vue2.0 プラグインの記述要素: オブジェクトをエクスポートし、インストール関数を持ち、デフォルトで Vue コンストラクターを渡し、エクスポート デフォルト { に基づいて Vue を拡張します。 // Vue3.0 プラグインの記述要素: オブジェクトをエクスポートし、インストール関数を持ち、デフォルトでアプリ アプリケーション インスタンスを渡し、エクスポート デフォルト { に基づいてアプリを拡張します。
  インストール(アプリ) {
    // アプリを拡張します。アプリはコンポーネント ディレクティブ関数を提供します // プロトタイプをマウントする場合は、app.config.globalProperties メソッド app.component(Carousel.name, xtxCarousel)
  }
}

main.jsエントリファイルにマウントする

'vue' から {createApp} をインポートします。
'./App.vue' からアプリをインポートします。
'./router' からルーターをインポートします
'./store' からストアをインポートします
import libraryUI from '@/components/library/index' //独自のプラグイン createApp(App)
  .use(ストア)
  .use(ルーター)
  .use(libraryUI) // プラグインをマウントします。mount('#app')

プラグインの使い方は?

<カルーセル:list="リスト" 期間="1" />

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Vue3でカルーセルコンポーネントをカプセル化する方法
  • vue+rem カスタムカルーセル効果
  • uniapp vue および nvue カルーセル コンポーネントのサンプル コード

<<:  Dockerスペースがいっぱいでコンテナに入れない場合の解決策

>>:  ウェブサイトにファビコンを追加するためのヒント: URLの前の小さなアイコン

推薦する

Navicat は CSV データを MySQL にインポートします

この記事では、Navicatを使用してcsvデータをmysqlにインポートする方法を参考までに紹介し...

Docker 上で Redis クラスターを構築する

目次1. イメージをプルする2. Redisコンテナを作成する3. コンテナを起動するためにクラスタ...

Linux ベースの MySQL マスター スレーブ構成の全プロセスを記録する

mysql マスタースレーブ構成1. 準備ホスト: 192.168.244.128スレーブ: 192...

Angularルーティングアニメーションと高度なアニメーション機能の詳細な説明

目次1. ルーティングアニメーション2. グループクエリとスタガー1. ルーティングアニメーションル...

純粋なCSSを使用してスクロールシャドウ効果を実現します

端的に言うと、スクロール可能な要素には非常によくある状況があります。通常、スクロールすると、要素が現...

MYSQL メタデータ ロック (MDL ロック) MDL ロックの問題分析

1. はじめにMYSQL の MDL ロックは常に頭痛の種でした。ロックについて話すとき、通常は I...

JavaScriptのアロー関数の特徴と通常の関数との違い

目次1. 矢印関数の使用1. 通常関数から矢印関数へ2. 中括弧を省略してリターンする3. 括弧を省...

JSは画像の滝の流れの効果を実現します

この記事では、画像ウォーターフォールフローを実現するためのJSの具体的なコードを参考までに共有します...

Reactの原理の説明

目次1. setState() の説明1.1 データの更新1.2 推奨構文1.3 2番目のパラメータ...

ローカルストレージにブール型の値を保存する際の落とし穴を解決する

LocalStorageはブール値を保存します今日、ブール値データを保存するために localsto...

MySQL MHA 操作ステータス監視の概要

目次1. プロジェクトの説明1.1 背景1.2 実装設計1.2.1 従来の方法1.2.2 最適化され...

簡単な約束を段階的に実行する方法を教えます

目次ステップ1: フレームワークを構築するステップ2 構築されたPromiseフレームワークに入力す...

Vueプロジェクトはログインと登録の効果を実現します

この記事の例では、ログインと登録の効果を実現するためのvueプロジェクトの具体的なコードを共有してい...

MySQL の例 DTID マスタースレーブ原理の分析

目次1. GTIDの基本概念2. GTIDの利点3. GTIDの仕組み4. 従来のレプリケーションに...

WeChatミニプログラムをTencent Mapsに接続する2つの方法

最近、WeChat アプレットを作成しているのですが、いくつか問題が発生しました。インターネットでい...