コンポーネントインフラストラクチャ最後に完全なコードがあり、コピーして直接使用できます。 目的: マウスホバー切り替え効果を実現するために画像プレビューコンポーネントをカプセル化する 着陸コード: <テンプレート> <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; } } } } </スタイル> 画像拡大鏡 目的: 画像拡大鏡機能を実現するステップ:
着陸コード: <テンプレート> <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]
指定された範囲を入力するための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 をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: MySQL マスタースレーブレプリケーション構成プロセス
>>: sed コマンドを使用してファイルの特定の行を効率的に削除する方法
1.インストールしたい場所に解凍し、my.iniファイルを作成します。 my.iniの内容は次のと...
目次概要関数シグネチャオプションパラメータ非厳密モード例外処理実用要約する概要ご存知のとおり、ES6...
Java 言語には多くのバージョンがあります。一般的に使用されている Java 8 に加えて、一部の...
目次if判定の最適化1. 最も簡単な方法:判断2. より良い方法: スイッチ3. より良いアプローチ...
SSHPASSをインストールする最新のオペレーティング システムでは、sshpass パッケージはデ...
概要インデックス作成は、MySQL で習得しなければならないスキルであり、MySQL クエリの効率を...
1: 速度と読み込み方法の違いdivとtableの違いは速度ではなく、読み込み方法です。速度はネット...
この章では、dockerの下にあるSpring BootプロジェクトでRedisを操作し始めます。準...
インストールユーザーにインストール権限があることを確認してくださいルートスイッチなしsuルート(su...
この記事の例では、双方向データバインディングを実現するためのjsの具体的なコードを参考までに共有して...
背景:場合によっては、json データをページに直接表示する必要があります (たとえば、インターフェ...
JavaとMysql 8.0.18バージョンの接続方法については、参考までに具体的な内容は以下のとお...
1. はじめにMySQL が起動すると、BufferPool が初期化されます。クエリ操作を実行する...
袋を用意するインストールApacheがすでにインストールされているかどうかを確認するrpm -qa ...
目次Dockerコンテナのデータ量データボリュームの使用方法1: コマンド-vを使用して直接マウント...