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 コマンドを使用してファイルの特定の行を効率的に削除する方法

推薦する

外部ファイル(js/vbs/css)をインポートするときに文字化けを回避する方法

ページ内にはjs、cssなどの外部ファイルが導入されており、外部ファイルのエンコードが現在のページフ...

面接官はReactのライフサイクルについてよく質問します

ReactライフサイクルReactのライフサイクルを理解するのに役立つ2つの図React ライフサイ...

VMware Tools を最初からインストールするための詳細な手順 (グラフィック チュートリアル)

VMware Tools は VMware 仮想マシンに付属するツールで、VirtualBox (...

Vue プロジェクトにインターフェース リスニング マスクを追加する方法

1. 事業背景マスク レイヤーを使用してユーザーの異常な操作を遮断する方法は、フロントエンドでよく使...

MySQLの基礎知識学習ノート

データベースを表示show databases;データベースを作成するDATABASE データベース...

vue.js パッケージ化プロジェクトの後の空白ページの解決策

Vueに触れたばかりのパートナーの多くは、開発環境ではVueプロジェクトは正常であるが、パッケージ化...

CSS で美しい時計アニメーション効果を実装するためのサンプルコード

仕事を探しています!!!事前準備:まず、このアニメーションは、以前のローディングアニメーションとクー...

VMware12 に CentOS8 をインストールする方法 (VM 仮想マシンに CentOS8 をインストールするチュートリアル)

数日前に CentOS8 がリリースされました。8 の最初のバージョンですが、今日は VM12 に ...

JavaScript オブジェクト (詳細)

目次JavaScript オブジェクト1. 定義2. オブジェクトの分類3. オブジェクトを定義する...

JavaScript 構造化代入の詳細な説明

目次コンセプト配列の分割値を個別に宣言して割り当てるデフォルト値の構造化解除変数値の交換関数によって...

SQL ストアド プロシージャの取得、データ取得、プロセス分析

この記事は主に、SQL のストアド プロシージャから返されたデータを取得するプロセスの分析を紹介しま...

英語: リンクタグはIEでhrefを自動的に補完します

英語: IE では、リンク タグによって href が自動的に補完されます。 Ajax Link T...

HTML テーブル マークアップ チュートリアル (30): セルの暗い境界線の色属性 BORDERCOLORDARK

セルでは、暗い境界線の色を個別に定義できます。基本的な構文<TD ボーダーコロダーク=colo...

HTTP および HTTP コラボレーション Web サーバー アクセス フロー図

Web サーバーは、独立したドメイン名を持つ複数の Web サイトを構築できるほか、通信経路上のトラ...

JavaScript はクラス宝くじアプレットを実装します

この記事では、クラス抽選アプレットを実装するためのJavaScriptの具体的なコードを参考までに紹...