コンポーネントインフラストラクチャ最後に完全なコードがあり、コピーして直接使用できます。 目的: マウスホバー切り替え効果を実現するために画像プレビューコンポーネントをカプセル化する 着陸コード: <テンプレート> <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 コマンドを使用してファイルの特定の行を効率的に削除する方法
目次なぜマテリアルライブラリが必要なのでしょうか?材質は何ですか?素材の種類fuep、vue3 ベー...
まず、MySQL とは何かを簡単に紹介します。簡単に言えば、データベースはデータを格納するための倉庫...
Dockerの場合すべてのコンテナコマンドを開始する docker を起動します $(docker ...
コラムを更新してからどれくらい経ったでしょうか?半年ですか?今年の後半は、まさに離陸、つまり文字通り...
この記事では、Linux コマンドを使用して .sql ファイルをエクスポートおよびインポートする方...
接続クエリ:これは、2 つのクエリ (またはテーブル) の各行をペアで接続した結果です。つまり、1 ...
url-loader をダウンロード 糸を追加 -D URLローダー モジュール: { ルール: {...
nginxのインストール仮想マシンがインターネットにアクセスできることを確認します。 1. ルートユ...
目次ケース1:ケース2:ケース3:簡単にまとめると:過去 2 日間で、完全なテーブル スキャンを引き...
構造関連タグ--------------------------------------------...
目次1. Docker Compose とは何ですか? 2. Docker Composeのインスト...
開発環境ウィンドウ開発ツール Visual Studio Codeノードのインストールとnpm Wi...
最近、個人の Web サイトに非常にシンプルなカラー スキーム (テーマ) スイッチャーを追加しまし...
<br />jb51.net では、常に記事のセマンティクスを重視してきましたが、HTM...
Linux の scp コマンド (Windows では scp は使用できません) と、mysql...