Vue3はJingdong製品詳細ページの虫眼鏡効果コンポーネントをカプセル化します

Vue3はJingdong製品詳細ページの虫眼鏡効果コンポーネントをカプセル化します

この記事では、Jingdong製品詳細ページの虫眼鏡効果コンポーネントに似たvue3カプセル化の具体的なコードを共有します。具体的な内容は次のとおりです。

まず、基本的なレイアウトを完成させます


画像切り替え効果を完成させ、mouseenterイベントを通じて画像を切り替える


着陸コード

<テンプレート>
  <div class="goods-image">
    <!-- 大きな画像をプレビュー -->
    <div class="large" v-show="show" :style="[{ backgroundImage: `url(${images[currIndex]})` }, bgPosition]"></div>
    <!-- 製品画像-->
    <div class="middle">
      <!-- 製品画像-->
      <img ref="target" :src="画像[currIndex]" alt="" />
      <!-- マウスが画像のマスクに入ります -->
      <div class="layer" v-show="show" :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' から { reactive, ref, watch } をインポートします。
'@vueuse/core' から { useMouseInElement } をインポートします。
エクスポートデフォルト{
  名前: 'GoodsImage',
  小道具: {
    画像:
      タイプ: 配列、
      デフォルト: () => []
    }
  },
  セットアップ(プロパティ) {
    // プレビュー画像とマスクレイヤーの表示と非表示を制御します。const show = ref(false)
    // 商品画像に表示される画像を制御する const currIndex = ref(0)
    // ref は DOM 要素を取得します const target = ref(null)
    // 製品画像内のマスクされた半透明画像の座標位置を記録する const position = reactive({
      上: 0,
      残り: 0
    })
    // プレビュー画像内のマスクレイヤーで覆われた領域の座標位置を記録する const bgPosition = reactive({
      背景位置X: 0,
      背景位置Y: 0
    })
    // サードパーティの vueuse が提供するメソッド useMouseInElement は、特定の領域内のマウスの座標を取得します。const { elementX, elementY, isOutside } = useMouseInElement(target)
    // リスナーは、マウスが製品画像に入ったときの座標を監視して、マスクレイヤーとプレビュー画像の効果を操作します。watch([elementX, elementY, isOutside], () => {
      // isisOutside.value が true の場合、マウスがターゲット要素に入っていないことを意味します。false の場合、マウスがターゲット要素に入っていることを意味します。// true の場合、パフォーマンスの低下を避けるために座標は記録されません if (isOutside.value) {
        // マウスがターゲット要素に入らない場合、マスクレイヤーとプレビュー画像は表示されません。show.value = false
        戻る
      }
      // マウスがターゲット要素に入ると、マスクレイヤーとプレビュー画像が表示されます。show.value = true
      // マスクレイヤーのサイズと商品画像のサイズに基づいて境界値を決定します // 左の境界値(左、右)
      要素Xの値<100の場合{
        位置.左 = 0
      } そうでなければ (要素Xの値 > 300) {
        位置.左 = 200
      } それ以外 {
        位置.左 = 要素X.値 - 100
      }
      // 上部の境界値(上限と下限)
      要素Yの値<100の場合{
        位置.上 = 0
      } そうでなければ (要素Yの値 > 300) {
        位置.上 = 200
      } それ以外 {
        位置.top = 要素Y.値 - 100
      }
      // プレビュー画像内のマスクレイヤーで覆われた商品画像の部分の座標と単位 bgPosition.backgroundPositionY = -position.top * 2 + 'px'
      bgPosition.backgroundPositionX = -position.left * 2 + 'px'
      // マスク レイヤーは、商品画像の左上隅の座標に単位 position.top += 'px' を加えた座標を基準とします。
      位置.left += 'px'
    })
    // return { currIndex, show, target, 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;
    位置: 相対的;
    カーソル: 移動;
    .レイヤー{
      幅: 200ピクセル;
      高さ: 200px;
      背景: rgba(0, 0, 0, 0.2);
      左: 0;
      上: 0;
      位置: 絶対;
    }
  }
  。小さい {
    幅: 80ピクセル;
    li {
      幅: 68px;
      高さ: 68px;
      左マージン: 12px;
      下部マージン: 15px;
      カーソル: ポインタ;
      &:ホバー、
      &。アクティブ {
        境界線: 2px 実線 @xtxColor;
      }
    }
  }
}
</スタイル>

最終結果

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

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

<<:  Nginx+SpringBoot による負荷分散の実装例

>>:  MySQL のデータ削除とデータ テーブル メソッドの例

推薦する

ネイティブ js が携帯電話のプルダウン更新を模倣

この記事では、携帯電話のプルダウンリフレッシュを模倣したjsの具体的なコードを参考までに共有します。...

XHTML 2.0 新機能プレビュー

<br />ブラウザが次世代のXHTMLを処理できるようになる前に、このよりリッチなコン...

Dockerでプロジェクトを実行する方法

1. プロジェクトwarが保存されているディレクトリを入力しますDockerfileを編集する vi...

Bootstrap 3.0 学習ノート CSS関連補足

この記事の主な内容は次のとおりです。 1. ブラウザのサポート2. 画像3. レスポンシブツール4....

::before/:before と ::after/:after の使用に関する深い理解

パート1: 基礎1. :active や :hover などの疑似クラスとは異なり、これらはすべて疑...

Tcl言語に基づくシンプルなネットワーク環境を構成するプロセスの分析

1. Tclスクリプトファイルcircle.tclコードコメント #シミュレーションに必要なプロパテ...

虫眼鏡ケースのJavaScriptオブジェクト指向実装

この記事では、参考までに、虫眼鏡のJavaScriptオブジェクト指向実装の具体的なコードを紹介しま...

Linux で CPU 使用率が高くなる原因をトラブルシューティングするプロセスの詳細な説明

目次序文始めるステップトラブルシューティング序文CPU 使用率が高くなるのは、オンラインでよくある問...

JSはキャンバス技術を使用してeChartsの棒グラフを模倣します

Canvas は HTML5 の新しいタグです。js を使用して Canvas 描画 API を操作...

Linux で静的ルーティングを追加するための 2 つの実装方法の分析

ルートを追加するコマンド: 1.ルート追加route add -net 192.56.76.0 ne...

React Hooksの使用例

目次簡単なコンポーネントの例より複雑な親子コンポーネントのケースオンセレクトの書き方反応する子供Re...

IDEAでVUEプロジェクトをデバッグするための詳細な手順

js コードをデバッグするには、コード内にデバッガーを記述するか、Chrome で毎回ブレークポイン...

WeChat アプレットのカスタム スクロール ビューのサンプル コード

ミニプログラムカスタムスクロールビュースクロールバーさっそくレンダリングを見てみましょうレンダリング...

JSインターセプト文字列の3つの方法の詳細な説明

JS には、文字列をインターセプトするための 3 つのメソッド、 slice() 、 substri...

nginxのシンプル転送リクエストのサーバーとロケーション設定の詳しい説明

nginx のサーバーと場所の構成を簡単に整理してみましょう。たとえば、URL: www.mask_...