Vue3 を使用して虫眼鏡効果を実現する方法の例

Vue3 を使用して虫眼鏡効果を実現する方法の例

序文

ショッピングサイトを閲覧しているとき、商品の上にマウスを置くと拡大表示されるのを誰もが見たことがあると思います。今日は、虫眼鏡効果を持つグローバルコンポーネントを自分でカプセル化してみます。見てみましょう〜

1. カプセル化の重要性

  • 技術的な観点から
    • vueプラグイン方式でグローバルコンポーネントとしてカプセル化されており、プロジェクト全体の他の場所でも使用でき、使いやすい
    • モジュール開発コンセプト、1つのモジュールで1つの機能を実現
  • ユーザーの視点
    • より良いブラウジング体験をもたらす
    • 商品の詳細を見ることができます

2. どのようにカプセル化しますか?

1. 準備

@vueuse/coreのuseMouseInElementメソッドを使用する必要があるので、まずプロジェクトのルートディレクトリでターミナルを開き、次のコマンドを実行します。

ここに指定されたバージョンがインストールされています。必要に応じて選択してください

vueuse/core 5.3.0 をインストールします

2. 梱包を開始する

前回の記事と同様に、vueプラグインを使用してグローバルコンポーネントを登録します

カプセル化されたグローバル コンポーネントを src/components に保存し、このディレクトリに新しい expand-images.vue ファイルを作成します。

コードは次のとおりです(例):

<テンプレート>
  <div class="goods-image">
    <!-- 大きな画像をプレビュー -->
    <div class="large" :style='[{backgroundImage: `url(${images[currIndex]})`}, bgPosition]' v-show='isShow'></div>
    <div class="middle" ref='target'>
      <!-- 左側に大きな画像 -->
      <img :src="画像[currIndex]" alt="">
      <!-- マスクレイヤー-->
      <div class="layer" :style='[position]' v-show='isShow'></div>
    </div>
    <ul class="small">
      <!-- 右側のサムネイル -->
       <li v-for="(img,i) 画像内" :key="img" :class="{active:i===currIndex}">
        <img @mouseenter="currIndex=i" :src="img" alt="">
      </li>
    </ul>
  </div>
</テンプレート>
<スクリプト>
'vue' から { ref, watch, reactive } をインポートします。
'@vueuse/core' から { useMouseInElement } をインポートします。

エクスポートデフォルト{
  名前: 'EnlargeImages',
  小道具: {
    画像:
      タイプ: 配列、
      デフォルト: () => []
    }
  },
  セットアップ(小道具){
    定数 currIndex = ref(0)
    定数ターゲット = ref(null)
    定数isShow = ref(false)
    //マスクレイヤーの座標 const position = reactive({
      左: 0,
      トップ: 0
    })
    // 背景画像の位置を制御する const bgPosition = reactive({
      背景位置X: 0,
      背景位置Y: 0
    })
    const { elementX, elementY, isOutside } = useMouseInElement(target)
    // マウスの動きの情報を監視する watch([elementX, elementY, isOutside], () => {
      // 値が変わるたびに新しいデータを読み取ります isShow.value = !isOutside.value
      // マウスが画像領域外にあるため、座標を計算する必要はありません if (isOutside.value) return
      // 水平方向if (elementX.value < 100) {
        // 左境界の位置.left = 0
      } そうでなければ (要素Xの値 > 300) {
        // 右境界の位置.left = 200
      } それ以外 {
        // 中間の状態 position.left = elementX.value - 100
      }
      // 垂直方向if (elementY.value < 100) {
        // 上端の位置.top = 0
      } そうでなければ (要素Yの値 > 300) {
        // 下境界線の位置.top = 200
      } それ以外 {
        // 中間の状態 position.top = elementY.value - 100
      }
      // console.log(要素Xの値、要素Yの値、isOutsideの値)
      // プレビュー背景の位置を計算します bgPosition.backgroundPositionX = -position.left * 2 + 'px'
      bgPosition.backgroundPositionY = -position.top * 2 + 'px'
      // 左マスクレイヤーの位置を計算する position.left += 'px'
      位置.top += 'px'
    })
    戻り値: { currIndex, target, isShow, position, bgPosition }
  }
}
</スクリプト>
<style スコープ lang="less">
.商品画像{
  ボックスのサイズ: 境界線ボックス;
  幅: 480ピクセル;
  高さ: 400px;
  位置: 相対的;
  ディスプレイ: フレックス;
  zインデックス: 500;
   画像 {
        幅: 100%;
        高さ: 100%;
    }
  。大きい {
    位置: 絶対;
    上: 0;
    左: 410px;
    幅: 400ピクセル;
    高さ: 400px;
    ボックスの影: 0 0 10px rgba(0, 0, 0, 0.1);
    背景繰り返し: 繰り返しなし;
    背景サイズ: 800px 800px;
    背景色: #f8f8f8;
  }
  。真ん中 {
    幅: 400ピクセル;
    高さ: 400px;
    背景: #f5f5f5;
    位置: 相対的;
    カーソル: 移動;
    .レイヤー{
      幅: 200ピクセル;
      高さ: 200px;
      背景: rgba(0, 0, 0, 0.2);
      左: 0;
      上: 0;
      位置: 絶対;
    }
  }
  。小さい {
    マージン: 0;
    パディング: 0;
    幅: 80ピクセル;
    li {
      幅: 68px;
      高さ: 68px;
      マージン: 10px;
      リストスタイル: なし;
      カーソル: ポインタ;
      &:ホバー、
      &。アクティブ {
        境界線: 2px実線 #27ba9b;
      }
    }
  }
}
</スタイル>

src/componentsの下に新しいindex.jsを作成します。

'./enlarge-images.vue' から EnlargeImages をインポートします。

エクスポートデフォルト{
  インストール(アプリ){
    app.component(EnlargeImages.name、EnlargeImages) のコンポーネント。
  }
}

main.jsにプラグインとして登録する

'vue' から {createApp} をインポートします。
'./App.vue' からアプリをインポートします。
'./router' からルーターをインポートします
'./store' からストアをインポートします
// 独自のカプセル化 import myUI from './components'

createApp(App).use(store).use(router).use(myUI).mount('#app')

3. 使用

ここではテストに固定データを使用します

コードは次のとおりです(例):

<テンプレート>
  <div class="home-banner">
    <!-- 虫眼鏡効果-->
    <拡大画像:images="画像"/>
  </div>
</テンプレート>

<スクリプト>

エクスポートデフォルト{
  名前: 'アプリ'、
  設定() {
    定数イメージ = [
      'https://code-1307161657.cos.ap-beijing.myqcloud.com/images%2Fcloud.jpeg',
      'https://code-1307161657.cos.ap-beijing.myqcloud.com/images%2Fground.jpeg',
      'https://code-1307161657.cos.ap-beijing.myqcloud.com/images%2Fnight.jpeg',
      'https://code-1307161657.cos.ap-beijing.myqcloud.com/images%2Fstreet.jpeg',
      'https://code-1307161657.cos.ap-beijing.myqcloud.com/images%2Fsun.jpeg'
    ]

    {画像}を返す
  }
}
</スクリプト>

<スタイル lang="less">
.ホームバナー{
  幅: 1000ピクセル;
  マージン: 50px 自動;
}
</スタイル>

3. 効果の実証

マウスを右側の小さな画像に移動すると、現在表示されている画像が切り替わります

左側の画像プレビュー領域にマウスを置き、プレビュー領域内でマウスを動かすと、右側に拡大された指定領域が表示されます。

(追記:gif画像が大きすぎるので、効果画像を見てくださいね~)

要約する

グローバルコンポーネントとして一括登録する方法については、Vue 共通ツール関数の記事を参照してください。

これで、vue3 を使用して虫眼鏡効果を実現する方法についての記事は終了です。vue3 を使用して虫眼鏡効果を実現する方法に関するより関連性の高いコンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Vue3 カプセル化された虫眼鏡コンポーネントのサンプルコード
  • Vue3は画像拡大鏡効果を実現します
  • Vueは商品詳細ページの虫眼鏡機能を実装します
  • Vueはタブ切り替えの虫眼鏡効果を実装します
  • Vueはシンプルな虫眼鏡効果を実装します
  • Vue画像拡大鏡コンポーネントのカプセル化と使用方法の詳細な説明
  • Vueは虫眼鏡付きの検索ボックスを実装します
  • Vue3.0 は虫眼鏡効果のケーススタディを実装します
  • Vue3.0 手書き拡大鏡効果
  • Vue が虫眼鏡効果を実装
  • Vueベースの製品メイン画像拡大鏡ソリューションの詳細な説明
  • 手書きのVue拡大鏡効果
  • vue2.x ベースの電子商取引画像拡大プラグインの使用
  • Vueは製品の拡大鏡効果を実現します

<<:  MySQL テーブル構造を Excel にエクスポートする方法

>>:  Zabbix でフィルターを使用して監視を実装する方法

推薦する

SQLデータベースの14の事例の紹介

データシート /* Navicat SQLite データ転送 ソースサーバー: school ソース...

MySQLシリーズ15 MySQL共通設定とパフォーマンスストレステスト

1. 一般的なMySQLの設定以下のすべての構成パラメータは、32G のメモリを搭載したサーバーに基...

HTML で dl(dt,dd)、ul(li)、ol(li) を使用する方法

HTML <dl> タグ#定義と使用法<dl> タグは定義リストを定義します...

zk+kafka+storm クラスターの docker-compose デプロイメントの実装

クラスターの展開の概要172.22.12.20 172.22.12.21 172.22.12.22 ...

OracleデータをMySQLデータベースに抽出する実装プロセス

Oracle データベースから MySQL データベースへの移行では、Oracle データベース モ...

MySQL 8.0 再帰クエリの簡単な使用例

序文この記事では、MySQL 8.0 の新機能を使用して再帰クエリを実装します。詳細なサンプル コー...

Vue コンポーネント化の一般的な方法: コンポーネント値の転送と通信

関連する知識ポイント親コンポーネントから子コンポーネントに値を渡す子コンポーネントから親コンポーネン...

Vueコンポーネントの7つの通信方法についての深い理解

目次1. props/$emit導入コードサンプル2.Vスロット導入コードサンプル3.$refs/ ...

HTML初心者や初級者向けの提案。専門家は無視してかまいません。

感想:私はバックエンド開発者です。静的 (HTML) ページを取得すると、ページ構造と命名規則が極端...

ウェブサイトを構築するときは、UTF-8 または GB2312 エンコードを使用する必要がありますか?

外国のウェブサイトを開くと文字化けした文字が表示されることが多く、また、英語以外の外国のウェブサイト...

Nginx レベルで基本的なユーザー認証を構成する手順を完了します。

序文アプリケーション シナリオ: おそらく、内部 Web サイトは外部ユーザーにアクセス可能である必...

Mysqlのprepare前処理の具体的な使用法

目次1. 前処理2. 前処理塗布方法A. 例: B. 実行計画の変更を追跡するための前処理C. スト...

HTML と JavaScript を使用してローカル メディア (ビデオとオーディオ) ファイルを再生する方法

まず、セキュリティ上の理由から、JavaScript はローカル リソース ファイルに直接アクセスで...

MySQLクラスタのDockerデプロイメントの実装

シングルノードデータベースの欠点大規模なインターネットプログラムはユーザーベースが大きいため、アーキ...

HTML ページ出力で従うべきいくつかの原則の要約

1. DOCTYPE は必須です。ブラウザは宣言した DOCTYPE に基づいてページのレンダリング...