Vueは製品の拡大鏡効果を実現します

Vueは製品の拡大鏡効果を実現します

この記事の例では、製品の拡大鏡効果を実現するためのVueの具体的なコードを共有しています。具体的な内容は次のとおりです。

1. はじめに

ライブストリーミングやセルフサービスショッピングが盛んなこの電子商取引の時代に、私たちは商品に対する理解を深め、さらに詳細を確認しました。そして、商品を拡大できることを発見しました。そこで、フロントエンド技術のVueフレームワークを使用して、虫眼鏡に似た機能を作成しました。

2. 実装のアイデア

元画像(左)の表示スペースについては、画像行を保護するために、img を canvas に置き換えることができます。
マウスを動かすと拡大表示エリアが表示され(マウスレイヤーマスク上部)、表示レイヤーマスクエリアで拡大表示スペースが選択されます(右)

3. エフェクト表示

4. 具体的な実装ロジックコード

テンプレート(画像パスを変更することを忘れないでください)

<テンプレート>
  <div>
    <div class="left">
      <img class="leftImg" src="../../src/assets/curry.jpg" alt="" />
      <!-- マウスレイヤーカバー-->
      <div v-show="topShow" class="top" :style="topStyle"></div>
      <!-- 最上位レイヤーは透明なレイヤーで元の画像スペース全体を覆います -->
      <div
        クラス="maskTop"
        @mouseenter="enterHandler"
        @mousemove="moveHandler"
        @mouseout="outHandler"
      </div>
    </div>
    <div v-show="rShow" class="right">
      <画像
        :style="r_img"
        クラス="rightImg"
        src="../../src/assets/curry.jpg"
        代替案=""
      />
    </div>
  </div>
</テンプレート>

スタイル CSS

<スタイルスコープ>
/* 画像を拡大し、左上隅を (0,0) に配置します */
.rightImg{
  表示: インラインブロック;
  幅: 800ピクセル;
  高さ: 800ピクセル;
  位置: 絶対;
  上: 0;
  左: 0;
} /* 右側の画像ズームスペース */
。右 {
  左マージン: 412px;
  幅: 400ピクセル;
  高さ: 400px;
  境界線: 1px 実線の赤;
  位置: 相対的;
  オーバーフロー: 非表示;
} /* トップレベルのマスク */
.マスクトップ{
  幅: 400ピクセル;
  高さ: 400px;
  位置: 絶対;
  zインデックス: 1;
  上: 0;
  左: 0;
} /* レイヤーマスク、左上隅を (0,0) に配置します */
.トップ{
  幅: 200ピクセル;
  高さ: 200px;
  背景色: ライトコーラル;
  不透明度: 0.4;
  位置: 絶対;
  上: 0;
  左: 0;
} /* 元の画像の表示 */
.leftImg{
  幅: 400ピクセル;
  高さ: 400px;
  表示: インラインブロック;
} /* 元の画像のコンテナ */
。左 {
  幅: 400ピクセル;
  高さ: 400px;
  境界線: 1px 青緑色
  フロート: 左;
  位置: 相対的;
}
</スタイル>

スクリプトコアjs

<スクリプト>
エクスポートデフォルト{
  データ() {
    戻る {
      トップスタイル: { 変換: "" },
      画像: {},
      トップ表示: false,
      r表示: false、
    };
  },
  メソッド: {
    // マウスが元の画像空間に入る function enterHandler() {
      // レイヤーマスクと拡大されたスペースの表示 this.topShow = true;
      this.rShow = true;
    },
    // マウス移動関数moveHandler(event) {
      // マウスの座標位置 let x = event.offsetX;
      y = event.offsetY とします。
      // レイヤーマスクの左上隅の座標位置と制限: 元の画像領域の左上隅を超えることはできません。let topX = x - 100 < 0 ? 0 : x - 100;
      topY = y - 100 < 0 ? 0 : y - 100 とします。
      // レイヤーマスクの位置を再度制限して、レイヤーマスクが元の画像領域内にのみ収まるようにします if (topX > 200) {
        上X = 200;
      }
      (topY > 200) の場合 {
        上Y = 200;
      }
      // 変換を通じて制御を移動します this.topStyle.transform = `translate(${topX}px,${topY}px)`;
      this.r_img.transform = `translate(-${2 * topX}px、-${2 * topY}px)`;
    },
    // マウスアウト関数 outHandler() {
      //レイヤーカバーと拡大スペースの非表示を制御します this.topShow = false;
      this.rShow = false;
    },
  },
};
</スクリプト>

V. まとめと考察

当初は元の画像コンテナの左側に 3 つのマウス イベントを追加しましたが、問題は発生し続けました。

1. 虫眼鏡を完全に実現するために、マウス領域を覆う透明なマスクトップを追加しました。このマスクトップレイヤーを追加しないと、マウスが元の画像領域に入ると、マウスマスクはマウスと一緒に移動せず、マウスが移動すると高周波で振動します。右側の拡大領域はスムーズに動きません。

2. マスクトップレイヤーが追加されていない場合、マウスを元の画像領域に移動すると、マウスレイヤーマスクがマウスをブロックするため、マウス移動イベントは1回しか実行されません。

3. 以前、マウスマスクの初期位置を動的に決定し、mouseenter イベントに組み込むことを試みました。その結果、mouseenter イベントが mousemove イベントになったかのように異常に何度も実行されました。

他の虫眼鏡のケースも見たことがありますが、トップレベルのオーバーレイ マスクを追加する必要はありません。通りすがりの誰かがこの問題の解決を手伝ってくれることを願っています。

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

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

<<:  Nginx設定の原理と実装プロセスの詳細な説明https

>>:  MySQLクエリ時にフィールドにデフォルト値を割り当てる方法

推薦する

シンプルな HTML ビデオ プレーヤーを実装する方法

この記事では、シンプルな HTML ビデオ プレーヤーを実装する方法を紹介し、皆さんと共有します。詳...

IDEA2021 tomcat10 サーブレットの新しいバージョンの落とし穴

私が学習していたときに使用していたバージョンは比較的新しいものであり、インターネット上のチュートリア...

Vue ルーティング遅延読み込みの詳細

目次1. ルートの遅延読み込みとは何ですか? 2. ルートの遅延読み込みの使用1. ルートの遅延読み...

CentOS の Nginx 公式 Yum ソースの設定を詳しく解説

私はプロジェクトの展開にAlibaba Cloudから購入したCentOSを使用しています。最近、プ...

Virtualbox に Centos7 仮想マシンをインストールする詳細なグラフィック チュートリアル

1. Centos7をダウンロードするダウンロードアドレス: https://mirrors.tun...

Mysqlクエリ条件で文字列の末尾にスペースがあっても一致しない問題の詳細な説明

1. テーブル構造テーブル人id名前1あなた2あなた(スペース) 3あなた(スペース2つ) 2. ク...

Linux で PCIe のバージョンと速度を確認する方法

PCIE には 4 つの異なる仕様があります。下の図でそのうちの 2 つを見てみましょう。マザーボー...

情報製品の読書リストのインタラクティブなデザインに関する考えと経験の共有

リストは、テーブルをコンテナーとして使用するテキストまたはグラフの形式として定義されます。商品の種類...

njs モジュールを使用して nginx 構成に js スクリプトを導入する

目次序文1. NJSモジュールをインストールする方法1: NJSモジュールを動的にロードする方法2:...

htmlハイパーリンクaのクリックイベントの後、hrefで指定されたアドレスにジャンプします。

場合によっては、ジャンプを完了するために href の代わりにハイパーリンク <a> を...

CSS ファイルをインポートする 4 つの方法 (インライン、インライン、外部、インポート) の詳細な説明

CSS インポート方法 - インラインスタイルタグ属性を通じて、CSSのキーと値のペアがタグに直接書...

Lvs+Nginx クラスターを使用して高並列アーキテクチャを構築する例

目次1. Lvsの紹介2. Lvs負荷分散モード2.1 NAT 2.2 ターン2.3 DRモード3....

ファイルのアップロードの進行状況を示す React の例

目次React アップロードファイル表示の進行状況デモフロントエンドにReactアプリケーションを素...

Vue でのルータービューコンポーネントの使用に関する詳細な説明

Vue プロジェクトを開発する場合、さまざまなコンポーネント ページを表示するために切り替えることが...

Q&A: XML と HTML の違い

Q: xml と html の違いがわかりません。違いは何ですか? A: XMLと HTML の違い...