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 コマンドを使用してファイルの特定の行を効率的に削除する方法

推薦する

MySql 5.7.21 無料インストール バージョンの構成方法 (Win10 の場合)

1.インストールしたい場所に解凍し、my.iniファイルを作成します。 my.iniの内容は次のと...

ES5とES6の違いを分析する

目次概要関数シグネチャオプションパラメータ非厳密モード例外処理実用要約する概要ご存知のとおり、ES6...

Dockerを使用してシンプルなJava開発およびコンパイル環境を構築する方法の詳細な説明

Java 言語には多くのバージョンがあります。一般的に使用されている Java 8 に加えて、一部の...

Javascript フロントエンド最適化コード

目次if判定の最適化1. 最も簡単な方法:判断2. より良い方法: スイッチ3. より良いアプローチ...

bash スクリプトで ssh/scp コマンドにパスワードを渡す方法の詳細な説明

SSHPASSをインストールする最新のオペレーティング システムでは、sshpass パッケージはデ...

MySQL 実験: explain を使用してインデックスの傾向を分析する

概要インデックス作成は、MySQL で習得しなければならないスキルであり、MySQL クエリの効率を...

HTML における Div と table の違い (あらゆる側面から詳細に説明)

1: 速度と読み込み方法の違いdivとtableの違いは速度ではなく、読み込み方法です。速度はネット...

Docker での Redis の永続ストレージの詳細な説明

この章では、dockerの下にあるSpring BootプロジェクトでRedisを操作し始めます。準...

CentOS での mysql5.7 の詳細なインストールと設定のチュートリアル

インストールユーザーにインストール権限があることを確認してくださいルートスイッチなしsuルート(su...

jsは双方向データバインディング(アクセサ監視)を実現します

この記事の例では、双方向データバインディングを実現するためのjsの具体的なコードを参考までに共有して...

JSONデータをHTMLで表示する方法

背景:場合によっては、json データをページに直接表示する必要があります (たとえば、インターフェ...

Java を Mysql バージョン 8.0.18 に接続する方法の詳細な説明

JavaとMysql 8.0.18バージョンの接続方法については、参考までに具体的な内容は以下のとお...

MySQLのFreeListメカニズムの詳細な説明

1. はじめにMySQL が起動すると、BufferPool が初期化されます。クエリ操作を実行する...

Linux インストール Apache サーバー構成プロセス

袋を用意するインストールApacheがすでにインストールされているかどうかを確認するrpm -qa ...

Docker のコンテナ データ ボリュームの概要

目次Dockerコンテナのデータ量データボリュームの使用方法1: コマンド-vを使用して直接マウント...