Vue3 カプセル化された虫眼鏡コンポーネントのサンプルコード

Vue3 カプセル化された虫眼鏡コンポーネントのサンプルコード

コンポーネントインフラストラクチャ

最後に完全なコードがあり、コピーして直接使用できます。

目的: マウスホバー切り替え効果を実現するために画像プレビューコンポーネントをカプセル化する

着陸コード:

<テンプレート>
  <div class="goods-image">
    <div class="middle">
      <img :src="画像[currIndex]" alt="">
    </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 } をインポートします
エクスポートデフォルト{
  名前: 'GoodsImage',
  小道具: {
    画像:
      タイプ: 配列、
      デフォルト: () => []
    }
  },
  セットアップ(小道具){
    定数 currIndex = ref(0)
    { currIndex } を返す
  }
}
</スクリプト>
<style スコープ lang="less">
.商品画像{
  幅: 480ピクセル;
  高さ: 400px;
  位置: 相対的;
  ディスプレイ: フレックス;
  。真ん中 {
    幅: 400ピクセル;
    高さ: 400px;
    背景: #f5f5f5;
  }
  。小さい {
    幅: 80ピクセル;
    li {
      幅: 68px;
      高さ: 68px;
      左マージン: 12px;
      下部マージン: 15px;
      カーソル: ポインタ;
      &:hover,&.active {
        境界線: 2px 実線 @xtxColor;
      }
    }
  }
}
</スタイル>

画像拡大鏡

目的: 画像拡大鏡機能を実現する

ステップ:

  • まず大きな画像コンテナとマスクコンテナを準備します
  • 次に、@vueuse/coreのuseMouseInElementメソッドを使用して要素ベースのオフセットを取得します。
  • マスクコンテナの位置と大きなコンテナの背景の位置を計算し、そのデータをテンプレートに公開して使用します。

着陸コード:

<テンプレート>
  <div class="goods-image">
+ // 右側の大きな画像レイアウト効果を実現します(背景画像を4倍に拡大します)
+ <div class="large" :style="[{backgroundImage:`url(${images[currIndex]})`}]"></div>
    <div class="middle">
      <img :src="画像[currIndex]" alt="">
+ // 移動するマスク コンテナーを準備します + <div class="layer"></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 } をインポートします
エクスポートデフォルト{
  名前: 'GoodsImage',
  小道具: {
    画像:
      タイプ: 配列、
      デフォルト: () => []
    }
  },
  セットアップ(小道具){
    定数 currIndex = ref(0)
    { currIndex } を返す
  }
}
</スクリプト>
<style スコープ lang="less">
.商品画像{
  幅: 480ピクセル;
  高さ: 400px;
  位置: 相対的;
  ディスプレイ: フレックス;
+ zインデックス: 500;
+ // 右大画像スタイル+ .large {
+ 位置: 絶対;
+ 上: 0;
+ 左: 412px;
+ 幅: 400px;
+ 高さ: 400px;
+ ボックスシャドウ: 0 0 10px rgba(0,0,0,0.1);
+ 背景繰り返し: 繰り返しなし;
+ 背景サイズ: 800px 800px;
+ 背景色: #f8f8f8;
+ }
  。真ん中 {
    幅: 400ピクセル;
    高さ: 400px;
    背景: #f5f5f5;
+ 位置: 相対的;
+ カーソル: 移動;
+ // マスクスタイル+ .layer {
+ 幅: 200px;
+ 高さ: 200px;
+ 背景: rgba(0,0,0,.2);
+ 左: 0;
+ 上: 0;
+ 位置: 絶対;
+ }
  }
  。小さい {
    幅: 80ピクセル;
    li {
      幅: 68px;
      高さ: 68px;
      左マージン: 12px;
      下部マージン: 15px;
      カーソル: ポインタ;
      &:hover,&.active {
        境界線: 2px 実線 @xtxColor;
      }
    }
  }
}
</スタイル>

vueuseをインストールする

npm と @vueuse/[email protected]

現在バージョン5.3.0は比較的安定しています

指定された範囲を入力するためのvueuseが提供するリスニングメソッドの基本的な使用方法

'@vueuse/core' から { useMouseInElement } をインポートします。
const { elementX, elementY, isOutside } = useMouseInElement(target)

メソッドパラメータtargetは監視対象のDOMオブジェクトを表します。戻り値elementXとelementYは監視対象のDOMの左上隅の位置情報、leftとtopを表します。isOutsideはDOMの範囲内にあるかどうかを表し、trueは範囲外であることを意味します。 false は範囲内であることを意味します。

機能性

<div v-if="isShow" class="large" :style="[{ backgroundImage: `url(${images[currIndex]})` }, bgPosition]"></div>
<div class="middle" ref="target">
   <img :src="画像[currIndex]" alt="" />
   <div class="layer" v-if="isShow" :style="[位置]"></div>
</div>

設定 () {
// 監視対象領域 const target = ref(null)
// マスクレイヤーとプレビュー画像の表示と非表示を制御します const isShow = ref(false)
// マスクの座標を定義する const position = reactive({
      左: 0,
      トップ: 0
})
// 右側のプレビュー画像の座標 const bgPosition = reactive({
      背景位置X: 0,
      背景位置Y: 0
})

戻り値: { position, bgPosition, target, isShow }
}
const { elementX, elementY, isOutside } = useMouseInElement(target)
  // リスナーに基づいて値の変更をリッスンします watch([elementX, elementY, isOutside], () => {
    // フラグで表示と非表示を制御する isShow.value = !isOutside.value
    if (isOutside.value) を返す
    // X軸座標範囲制御 if (elementX.value < 100) {
      // 左側の position.left = 0
    } そうでなければ (要素Xの値 > 300) {
      // 右側の position.left = 200
    } それ以外 {
      // 中央の位置.left = elementX.value - 100
    }
    // Y方向の座標範囲制御 if (elementY.value < 100) {
      位置.上 = 0
    } そうでなければ (要素Yの値 > 300) {
      位置.上 = 200
    } それ以外 {
      位置.top = 要素Y.値 - 100
    }
    // プレビュー画像の移動距離を計算します bgPosition.backgroundPositionX = -position.left * 2 + 'px'
    bgPosition.backgroundPositionY = -position.top * 2 + 'px'
    // マスクレイヤーの位置を計算する position.left = position.left + 'px'
    position.top = position.top + 'px'
  })

完全なコード

<テンプレート>
  <div class="goods-image">
    <div v-if="isShow" class="large" :style="[{ backgroundImage: `url(${images[currIndex]})` }, bgPosition]"></div>
    <div class="middle" ref="target">
      <img :src="画像[currIndex]" alt="" />
      <div class="layer" v-if="isShow" :style="[位置]"></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 } をインポートします。
エクスポートデフォルト{
  名前: 'GoodsImage',
  小道具: {
    画像:
      タイプ: 配列、
      デフォルト: () => []
    }
  },
  セットアップ(小道具){
    定数 currIndex = ref(0)
    定数ターゲット = ref(null)
    定数isShow = ref(false)
    const 位置 = リアクティブ({
      左: 0,
      トップ: 0
    })
    const bgPosition = リアクティブ({
      背景位置X: 0,
      背景位置Y: 0
    })
    const { elementX, elementY, isOutside } = useMouseInElement(target)
    watch([要素X, 要素Y, isOutside], () => {
      isShow.value = !isOutside.value
      if (isOutside.value) を返す
      要素Xの値<= 100の場合{
        位置.左 = 0
      } そうでない場合 (要素Xの値 >= 300) {
        位置.左 = 200
      } それ以外 {
        位置.左 = 要素X.値 - 100
      }
      要素Yの値<= 100の場合{
        位置.上 = 0
      } そうでない場合 (要素Yの値 >= 300) {
        位置.上 = 200
      } それ以外 {
        位置.top = 要素Y.値 - 100
      }
      bgPosition.backgroundPositionX = -position.left * 2 + 'px'
      bgPosition.backgroundPositionY = -position.top * 2 + 'px'
      位置.left += 'px'
      位置.top += 'px'
    })
    戻り値: { currIndex, target, isShow, position, bgPosition }
  }
}
</スクリプト>
<style スコープ lang="less">
.商品画像{
  幅: 480ピクセル;
  高さ: 400px;
  位置: 相対的;
  ディスプレイ: フレックス;
  zインデックス: 500;
  。大きい {
    位置: 絶対;
    上: 0;
    左: 412px;
    幅: 400ピクセル;
    高さ: 400px;
    ボックスの影: 0 0 10px rgba(0, 0, 0, 0.1);
    背景繰り返し: 繰り返しなし;
    背景サイズ: 800px 800px;
    背景色: #f8f8f8;
  }
  。真ん中 {
    幅: 400ピクセル;
    高さ: 400px;
    背景: #f5f5f5;
     位置: 相対的;
    カーソル: 移動;
    .レイヤー{
      幅: 200ピクセル;
      高さ: 200px;
      背景: rgba(0,0,0,.2);
      左: 0;
      上: 0;
      位置: 絶対;
    }
  }
  。小さい {
    幅: 80ピクセル;
    li {
      幅: 68px;
      高さ: 68px;
      左マージン: 12px;
      下部マージン: 15px;
      カーソル: ポインタ;
      &:ホバー、
      &。アクティブ {
        境界線: 2px 実線 @xtxColor;
      }
    }
  }
}
</スタイル>

要約する

これで、vue3 カプセル化虫眼鏡コンポーネントに関するこの記事は終了です。vue3 カプセル化虫眼鏡コンポーネントの関連コンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vueは製品の拡大鏡効果を実現します
  • Vue3は画像拡大鏡効果を実現します
  • Vueは商品詳細ページの虫眼鏡機能を実装します
  • Vueはタブ切り替えの虫眼鏡効果を実装します
  • Vueはシンプルな虫眼鏡効果を実装します
  • Vueは虫眼鏡付きの検索ボックスを実装します
  • Vue3.0 手書き拡大鏡効果
  • Vue が虫眼鏡効果を実装
  • 手書きのVue拡大鏡効果
  • Vue3はJingdong製品詳細ページの虫眼鏡効果コンポーネントをカプセル化します

<<:  MySQL マスタースレーブレプリケーション構成プロセス

>>:  sed コマンドを使用してファイルの特定の行を効率的に削除する方法

推薦する

vue3 を使用してマテリアル ライブラリを構築する方法

目次なぜマテリアルライブラリが必要なのでしょうか?材質は何ですか?素材の種類fuep、vue3 ベー...

Centos7 に MySQL 8.0.23 をインストールする手順 (初心者レベル)

まず、MySQL とは何かを簡単に紹介します。簡単に言えば、データベースはデータを格納するための倉庫...

Docker はすべてのコンテナをバッチ起動して閉じます

Dockerの場合すべてのコンテナコマンドを開始する docker を起動します $(docker ...

CSSアニメーション属性キーフレームの詳細な説明

コラムを更新してからどれくらい経ったでしょうか?半年ですか?今年の後半は、まさに離陸、つまり文字通り...

Linux コマンドで .sql ファイルをエクスポートおよびインポートする方法

この記事では、Linux コマンドを使用して .sql ファイルをエクスポートおよびインポートする方...

MySQL 結合クエリ構文と例

接続クエリ:これは、2 つのクエリ (またはテーブル) の各行をペアで接続した結果です。つまり、1 ...

webpack イメージを base64 に変換する例

url-loader をダウンロード 糸を追加 -D URLローダー モジュール: { ルール: {...

Linux での Nginx 監視の問題

nginxのインストール仮想マシンがインターネットにアクセスできることを確認します。 1. ルートユ...

MySQLがフルテーブルスキャンを実行するいくつかの状況

目次ケース1:ケース2:ケース3:簡単にまとめると:過去 2 日間で、完全なテーブル スキャンを引き...

WMLタグの概要

構造関連タグ--------------------------------------------...

Docker Compose のインストールと使用手順

目次1. Docker Compose とは何ですか? 2. Docker Composeのインスト...

Visual Studio Code + Reactをベースに開発環境を構築するプロセス

開発環境ウィンドウ開発ツール Visual Studio Codeノードのインストールとnpm Wi...

CSSテーマを簡単に切り替える方法の詳細な説明

最近、個人の Web サイトに非常にシンプルなカラー スキーム (テーマ) スイッチャーを追加しまし...

使用場所によって混乱しやすいXHTMLタグ

<br />jb51.net では、常に記事のセマンティクスを重視してきましたが、HTM...

ローカルのMySQLをサーバーデータベースに移行する方法

Linux の scp コマンド (Windows では scp は使用できません) と、mysql...