シンプルな虫眼鏡効果を実現するJavaScript

シンプルな虫眼鏡効果を実現するJavaScript

大きな箱の中に写真があります。マウスをその上に置くと、半透明のマスク レイヤーが表示されます。マウスを動かすと、マスク レイヤーも一緒に移動します。箱の横には拡大写真もあります。拡大写真の位置は、マスク レイヤーの位置によって変わります。マウスを大きな箱から離すと、マスク レイヤーと拡大写真が消えます。

実装のアイデア

1. HTMLとCSSでボックス、マスクレイヤー、拡大画像ページを編集し、マスクレイヤーと拡大画像をデフォルトで非表示に設定します。
2. 要素オブジェクトを取得し、マウスイベント mouseover を大きなボックスにバインドし、マウスが通過したときにマスクレイヤーと拡大画像を表示するように設定します。表示を「ブロック」に設定します。
マウスアウト - - -mouseout、マウスが通過したときにマスクレイヤーと拡大画像の表示を設定します。表示は「なし」に設定されています
3. 大きなボックス内のマウスの位置を計算する
4. マウスをマスク レイヤーの中央に置きます。マウスの位置を基準にマスク レイヤーを上方向と左方向に半分の距離だけ移動します。マスク レイヤーの位置 - ボックスを基準に上方向と左方向のオフセットを割り当てて絶対位置を指定します。
5. 大きなボックスでマスクレイヤーの動きを制限する - - - オフセットの値を決定します。<= 0の場合、オフセットは0です。
6. マスクレイヤーが移動すると、拡大画像の位置が変わります。マスクレイヤー移動値 / マスクレイヤー最大移動距離 = 拡大画像移動距離 / 拡大画像最大移動距離。この関係に従って、拡大画像の移動距離が求められます。移動距離は、拡大画像のオフセット上と左に割り当てられます。

注意:拡大画像のオフセットには、マスク レイヤーの移動方向と反対の負の値が与えられます。

コードサンプル

<!DOCTYPE html>
<html lang="ja">

<ヘッド>
    <メタ文字セット="UTF-8">
    <meta http-equiv="X-UA-compatible" content="IE=edge">
    <meta name="viewport" content="width=デバイス幅、初期スケール=1.0">
    <title>携帯電話の詳細ページ</title>
    <!-- <link rel="スタイルシート" href="css/detail.css" >
    <script src="js/detail.js"></script> -->
    <スタイル>
        * {
            マージン: 0;
            パディング: 0;
        }
        
        .詳細コンテンツ{
            幅: 1200ピクセル;
            マージン: 0 自動;
        }
        
        画像 {
            境界線: 0;
            垂直位置合わせ: 中央;
        }
        
        .preview_img {
            位置: 相対的;
            幅: 400ピクセル;
            高さ: 400px;
            上マージン: 30px;
            境界線: 1px 実線 #ccc;
        }
        
        .preview_img 画像 {
            幅: 100%;
            高さ: 100%;
        }
        
        。マスク {
            表示: なし;
            位置: 絶対;
            上: 0;
            左: 0;
            幅: 300ピクセル;
            高さ: 300px;
            背景色: ピンク;
            不透明度: .5;
            カーソル: 移動;
        }
        
        。大きい {
            表示: なし;
            位置: 絶対;
            上: 0;
            左: 410px;
            幅: 500ピクセル;
            高さ: 500px;
            境界線: 1px 実線 #ccc;
            背景色: ピンク;
            zインデックス: 999;
            オーバーフロー: 非表示;
        }
        
        .bigimg{
            位置: 絶対;
            上: 0;
            左: 0;
            幅: 800ピクセル;
            高さ: 800ピクセル;
        }
    </スタイル>
</head>

<本文>
    <div class="detail-content">
        <div class="preview_img">
            <img src="upload/s3.png" alt="">
            <div class="mask"></div>
            <div class="big">
                <img src="upload/big.jpg" alt="" class="bigImg">
            </div>
        </div>
    </div>

    <スクリプト>
        var previewImg = document.querySelector('.preview_img');
        var マスク = document.querySelector('.mask');
        var big = document.querySelector('.big');
        var bigImg = document.querySelector('.bigImg');

        // マウスオーバーボックスイベント previewImg.addEventListener('mouseover', function() {
            // オクルージョン レイヤーと拡大画像の表示を設定します。mask.style.display = 'block';
            big.style.display = 'ブロック';
        })

        // マウスがボックスを離れるイベント previewImg.addEventListener('mouseout', function() {
            // オクルージョンレイヤーと拡大画像を非表示に設定します。mask.style.display = 'none';
            big.style.display = 'なし';
        })

        // マウスがボックス内を移動する previewImg.addEventListener('mousemove', function(e) {
            // ボックス内のマウスの位置を取得します。var x = e.pageX - this.offsetLeft;
            var y = e.pageY - this.offsetTop;

            // オクルージョン レイヤーの移動値を計算し、マウスをオクルージョン レイヤーの中央に配置します。var maskX = x - mask.offsetWidth / 2;
            var maskY = y - mask.offsetHeight / 2;

            // ボックスは正方形なので、水平方向の X 軸の最大移動値のみが計算されます。Y 軸の最大移動値は X 軸と一致します。var maskMax = previewImg.offsetWidth - mask.offsetWidth;

            // オクルージョンレイヤーがボックス内で移動できるように制限する if (maskX <= 0) {
                マスクX = 0;
            } そうでなければ (maskX >= maskMax) {
                マスクX = マスクMax;
            }

            マスクY <= 0の場合{
                マスクY = 0;
            } そうでなければ (maskY >= maskMax) {
                マスクY = マスクMax;
            }

            mask.style.left = maskX + 'px';
            mask.style.top = maskY + 'px';

            // 拡大画像の最大移動値を計算します。大きな画像の水平移動値 = オクルージョン レイヤーの移動値 * 大きな画像の最大移動距離 / オクルージョン レイヤーの最大移動距離 var bigMax = bigImg.offsetWidth - big.offsetWidth;

            var bigX = maskX * bigMax / maskMax;
            var bigY = maskY * bigMax / maskMax;

            bigImg.style.left = -bigX + 'px';
            bigImg.style.top = -bigY + 'px';

        })
    </スクリプト>
</本文>

</html>

ページ効果:

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

以下もご興味があるかもしれません:
  • 画像拡大鏡効果のJSバージョン
  • jsを使用してシンプルな虫眼鏡効果を実現します
  • jsはショッピングサイトの虫眼鏡機能を実現します
  • js を使ってシンプルな虫眼鏡効果を実現
  • js 虫眼鏡拡大画像効果
  • 虫眼鏡の効果を実現するために js を使用する簡単な例
  • JavaScript 画像拡大鏡効果コード [コードは比較的シンプルです]
  • 魔法のJavascript画像拡大鏡
  • JavaScript 画像拡大鏡(ドラッグ アンド ドロップ、ズーム効果)
  • ネイティブ js で記述された虫眼鏡効果

<<:  MySql インデックス使用戦略の分析

>>:  Dockerコンテナオーケストレーション実装プロセス分析

推薦する

Divの境界と透明度に関する設定

フレーム:スタイル=”border-style:solid;border-width:5px;bor...

ミニプログラムカスタムタブバーコンポーネントのカプセル化

この記事の例では、ミニプログラムのカスタムタブバーコンポーネントをカプセル化するための具体的なコード...

三角形を描画するための CSS 実装コード (border メソッド)

1. 単純な三角形を実装するCSS ボックス モデルの境界線を使用すると、次のような三角形を実現で...

Mysql を 5.7 にアップグレードした後のグループ クエリの問題を解決する

問題を見つける最近MySQLをMySQL 5.7にアップグレードした後、次のようなクエリでグループ化...

Mysqlデータテーブルでワームレプリケーションを使用する方法

簡単に言えば、MySQL ワーム レプリケーションは、クエリされたデータを指定されたデータ テーブル...

jQueryはフェードインとフェードアウト効果を実現します

jQuery を使用してフェードインとフェードアウト効果を完成させる前に、まずいくつかのコードを理解...

React HTML で react を使用する 2 つの方法

基本的な使い方 <!DOCTYPE html> <html lang="...

フォント宝庫 50 種類の素晴らしい無料英語フォントリソース パート 2

デザイナーは独自のフォント ライブラリを持っているため、プロジェクトの設計時にすぐに使用できます。今...

HTML タグの表示モード (ブロックレベル タグ、インライン タグ、インライン ブロック タグ) に関する簡単な説明

今日の講義では、HTML におけるタグの表示モードについてお話ししましたが、これはブロックレベルタグ...

Linuxシステムでノードプロセスを実行しているが、プロセスを強制終了できない問題を解決します

まず、Linux システムで実行されているノード プロセスはプロセスを強制終了できないことを紹介しま...

Vueカスタム命令とその使用方法の詳細な説明

目次1. 指令とは何ですか? Vue でよく使われる組み込みの v ディレクティブv-if と v-...

Centos7 での mysql 8.0.15 のインストールと設定

この記事では、参考までにMySQL 8.0.15のインストールと設定のグラフィックチュートリアルを紹...

Vue ブラウザログアウトの実装例

目次1. beforeunload イベント2. アンロードイベント3. ソースコードプロジェクトの...

MySQLクエリの文字セットの不一致の問題を解決する方法

問題を見つける最近、仕事で問題が発生しました。MySQL データベースにテーブルを作成するときに、ラ...

MySQL 演算子の具体的な使用法 (and、or、in、not)

目次1. はじめに2. 本文2.1 および演算子2.2 または演算子2.3 オペレーター2.4 no...