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 の連結で複数の一重引用符と三重引用符を使用する際の問題

文字列を動的に連結する場合、文字連結を使用することが多いです。次のような連結の引用符の意味がわかりま...

XHTML 入門チュートリアル: テキストの書式設定と特殊文字

<br />このセクションでは、XHTML でテキストの書式設定と特殊文字を実装する方法...

MySQL における int の最大値の詳細な説明

導入2日前に見た問題について詳細に書きます。バイトコンピューターがバイナリに基づいていることは誰もが...

JavaScript における var、let、const の違いの詳細な説明

目次グローバル変数として可変ホイスト一時的なデッドゾーンブロックスコープ重複したステートメント宣言さ...

bash を使って日付をカウントダウンする方法

重要なイベントまであと何日あるか知りたいですか? Linux bash と date コマンドが役に...

Nginxはドメイン名のアクセス方法を定義しています

最近Nginxを構築しているのですが、ドメイン名でアクセスできません。 nginx 構成ファイル n...

MySQLのslave_exec_modeパラメータの詳細な説明

今日、slave_exec_modeというパラメータを偶然見ました。マニュアルの説明から、このパラメ...

下線を実現するための CSS3 トランジションの例コード

この記事では、下線を実現するための CSS3 トランジションのサンプル コードを紹介します。このコー...

MySQL 5.7 でブロックポジショニング DDL の問題を解決する

前回の記事「MySQL テーブル構造の変更、メタデータ ロックを知っておく必要があります」では、MD...

検索エンジンのウェブサイトの入り口の無料コレクション

1: Baiduウェブサイトログイン入口ウェブサイト: http://www.baidu.com/s...

両端揃えレイアウトを実現する CSS 列のサンプルコード

1. 堂々巡りいろいろ試行錯誤した結果、均等割り付けレイアウトを実現する最も簡単な方法は CSS ...

NavicatでMySqlスケジュールタスクを作成する方法の詳細な説明

Navicat で MySql スケジュールタスクを作成する詳細な説明イベントは、MySQL が特定...

Centos7 システムでの .NET Core 2.0 + Nginx + Supervisor 環境の構築

1. Linux .NET Core の紹介Microsoft は常に自社のプラットフォームに対して...

Vue フィルターの実装と適用シナリオの詳細な説明

1. 簡単な紹介Vue.js を使用すると、一般的なテキストの書式設定に使用できる独自のフィルターを...

Linux sftp コマンドの使用法

SFTPの概念sftp は、安全なファイル転送プロトコルである Secure File Transf...