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

推薦する

Dockerはnextcloudを使用してプライベートBaiduクラウドディスクを構築します

突然、ドキュメントの保存と共同作業のためのプライベート サービスを構築する必要がありました。多くの場...

Mysql5.7.14 インストールと設定方法操作グラフィックチュートリアル(パスワード問題解決)

この記事は主に、以前のインストール方法を使用して MySQL 5.7.14 をインストールするときに...

MySQLの使用中に発生した問題

ここでは、MySQL の使用中に発生するいくつかの問題とその解決策を示します。 sql_mode=o...

Zookeeper&Kafka クラスターを構築するための Docker の実装

最近Kafka勉強しています。クラスタの状態をテストする準備をしていたときに、仮想マシンを 3 つ開...

Vue で wangeditor リッチテキスト編集を使用する際の問題

wangEditor は、JavaScript と CSS に基づいて開発された Web リッチ テ...

親ページの更新を制御するために HTML で iframe を実装するためのアイデアとコード

1. 応用シナリオ親ページ a.jspサブページ b.jsp (ページ a に埋め込まれた ifra...

Windows 版 MySQL のインストール、起動、基本設定に関する詳細なグラフィック チュートリアル

ダウンロード:ステップ 1: ウェブサイトを開きます (ダウンロードするには公式ウェブサイトにアクセ...

Docker で Docker0 ブリッジのデフォルトのネットワーク セグメントを変更する方法

1. 背景Docker サービスが開始されると、デフォルトで docker0 ブリッジが作成され (...

Vueダイナミックフォームの詳細な応用

概要バックグラウンド管理システムには多くのフォーム要件があります。データをjson 形式で書き込み、...

EclipseのプロジェクトをTomcatに追加できない問題を解決する方法

1. プロジェクトを右クリックしてプロパティを選択します2. プロジェクトファセットをクリック3. ...

高品質なウェブページのデザイン方法 高品質なウェブページ(画像とテキスト)のデザイン経験

オープンプラットフォームの増加に伴い、そこから派生するさまざまなアプリケーションサービスも増加傾向に...

W3C チュートリアル (9): W3C XPath アクティビティ

XPath は、XML ドキュメントの一部を選択するための言語です。 XPath は、XSLT、XQ...

HTML の iframe と frame の違いを例を使って説明します

プロジェクトで frameset 属性を使用したことがあるかどうかはわかりません。昨年、オンライン ...

Docker管理に関する断片的な知識のまとめ

目次1. 概要2. 応用例2.1、Docker コンテナ分離名前空間2.2. Docker のフリー...

JavaScript の基本オブジェクト

目次1. オブジェクト1.1 オブジェクトとは何ですか? 1.2 なぜオブジェクトが必要なのか? 2...