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の前の小さなアイコン

推薦する

Vueリクエストインターセプターの設定方法の詳しい説明

以下の手順に従ってください1. request.jsコンテンツ: http リクエスト インターセプ...

node.jsのコアモジュールとは

目次グローバルオブジェクトグローバルオブジェクトとグローバル変数プロセスコンソール一般的なツールユー...

MySQLストアドプロシージャの原理と使用法の詳細な説明

この記事では、例を使用して、MySQL ストアド プロシージャの原理と使用方法を説明します。ご参考ま...

CSS設定div背景画像実装コード

コンポーネントに背景画像コントロールを追加するには、次の 2 つの手順だけが必要です。 <表示...

CSS は Google マテリアル デザインのテキスト入力ボックス スタイルを実装します (推奨)

みなさんこんにちは。今日は、純粋な CSS を使用して Google マテリアル デザインのテキスト...

JavaScriptプロトタイプチェーン図のまとめと実践

目次プロトタイプチェーンプロトタイプチェーンに基づいてシンプルなJQueryライブラリを実装すること...

遭遇したいくつかのブラウザ互換性の問題について簡単に説明します

背景ブラウザの互換性の問題を解決するのは非常に面倒なことです。高度な技術はそれほど必要ありませんが、...

vite を使用して vue3 アプリケーションを構築する方法

1. インストールヒント: 現在、VUE3.0 の公式翻訳ドキュメントはありません。しかし、すでに誰...

開発者がデータベースロックを詳細に理解する必要がある理由

1.ロックしますか? 1.1 ロックとは何ですか?ロックの本当の意味は、鍵またはコードで開くことがで...

MySQL の日付型の単一行関数コードの詳細な説明

MySQL の日付型単一行関数: CURDATE()またはCURRENT_DATE()は現在の日付を...

JavaScript で charAt() を使用して、最も頻繁に出現する文字とその出現回数をカウントする方法を教えます。

前回は、JavaScript の charAt() メソッドの使い方を紹介しました。今日は、最も多く...

MySQL の自動増分 ID に関するいくつかの小さな問題の要約

以下の質問はすべて InnoDB ストレージ エンジンに基づいています。 1. 最も大きな ID を...

Win10でIIS10を構成し、ASPプログラムのデバッグをサポートする手順

マイクロソフトIIS (Internet Information Server) は、Microso...

HTMLはフォームタグを使用して登録ページのサンプルコードを実装します。

ケースの説明: - ページ効果を実現するためにテーブルを使用する- ハイパーリンクを機能させたくない...

Win10 の組み込み Linux システムを使用して Spring Boot プロジェクトを開始する方法

1. Windows10の組み込みLinuxサブシステムをインストールする1.1. Linuxサブシ...