約 1 年前、私は「虫眼鏡効果を模倣するいくつかの方法の原理の分析」という記事を書きました。当時、自分のスキルは十分に高く、誇りに思っていたので、このような自慢げなタイトルを付けました。実際には、CSS の 2 つのアニメーション メソッド、つまり変換とアニメーションを紹介しただけでした。もちろん、達成された効果も非常に単純なものでした...恥ずかしいです。 技術の進歩により、純粋な JS を使用してキャンバス拡大鏡と別の「Taobao スタイル」モデルを徐々に実現しましたが、実装が複雑すぎて、ほとんどの JS ロジックに依存していたため、まだ不十分でした。動きと表示効果はすべて JS に依存し、オフセットは JS によって計算され、スタイルがレンダリングされていました。 しかし、CSS3 カスタム変数の出現により、希望が生まれました。 まず効果を見てみましょう: コア実装:
実際、私たちが具体的に実現したいのは、マウスが移動すると、小さな円が(マウスに追従して)表示され、この小さな円が移動する場所の画像領域が対応する倍数に拡大され、円内に表示されることです。 なぜオフセット API を使用するのですか?
しかし、比較すると、要件を満たすのは「親要素に対する相対的な」オフセットだけです。 <div class="ブルース"> <div class="拡大鏡"></div> </div> 拡大鏡を document.querySelector(".magnifier"); とします。 magnifier.addEventListener("mousemove",e=>{ //「ミラー」の小さな円の動きを制御します}); 虫眼鏡は、元の画像を N 倍に拡大し、一定の領域を比例的に遮断して、上記のオフセットを通じてコンテンツを表示することでコンテンツを表示します。 まず、関連する CSS 変数を定義します。倍率を 2.5 倍に設定しているので、拡大された画像の幅と高さも元の幅と高さの 2.5 倍になります。 :根{ --比率: 2.5; --box-w: 600px; --box-h: 400px; --outbox-w: calc(var(--box-w) * var(--ratio)); --outbox-h: calc(var(--box-h) * var(--ratio)); } .ブルース{ 上マージン: 50px; } .拡大鏡{ --x:0; --y:0; オーバーフロー: 非表示; 位置: 相対的; 幅: var(--box-w); 高さ: var(--box-h); 背景: url("img/nan.png") 繰り返しなし center/100% 100%; カーソル: 取得; } 画像は背景画像として表示されるため、サイズを簡単に制御できます。 明らかに、このシナリオでは、虫眼鏡のコンテナーとして子ノードを挿入する必要はありません。 虫眼鏡は、使用時には幅と高さが 100 ピクセルになり、使用していない時には幅と高さが 0 ピクセルになります。マウスの移動に伴う虫眼鏡の位置は、絶対位置指定、つまり left と top を宣言し、次に .magnifier::before{ --サイズ: 0; 位置: 絶対; 左: var(--x); 上: var(--y); 境界線の半径: 100%; 幅: var(--size); 高さ: var(--size); ボックスの影: 1px 1px 3px rgba(0,0,0,.5); コンテンツ: ""; 変更されます:左、上; 変換: translate(-50%,-50%); } .magnifier:hover::before{ --サイズ: 100px; } 次に、背景を使用して虫眼鏡コンテンツを実装(表示)します。 2.5倍の拡大率に合わせて、 size: --scale-x: calc(var(--size) / var(--ratio) - var(--ratio) * var(--x)); --scale-y: calc(var(--size) / var(--ratio) - var(--ratio) * var(--y)); 上記の mousemove 関数内のミラーの「位置座標」は、次のように記述できます。 e.target.style.setProperty("--x",`${e.offsetX}px`); e.target.style.setProperty("--y",`${e.offsetY}px`); とても簡単〜 最終的な CSS コンテンツは次のようになります。 :根{ --比率: 2.5; --box-w: 600px; --box-h: 400px; --outbox-w: calc(var(--box-w) * var(--ratio)); --outbox-h: calc(var(--box-h) * var(--ratio)); } .ブルース{ 上マージン: 50px; } .拡大鏡{ --x:0; --y:0; オーバーフロー: 非表示; 位置: 相対的; 幅: var(--box-w); 高さ: var(--box-h); 背景: url("img/nan.png") 繰り返しなし center/100% 100%; カーソル: 取得; } .magnifier::before{ --サイズ: 0; --scale-x: calc(var(--size) / var(--ratio) - var(--ratio) * var(--x)); --scale-y: calc(var(--size) / var(--ratio) - var(--ratio) * var(--y)); 位置: 絶対; 左: var(--x); 上: var(--y); 境界線の半径: 100%; 幅: var(--size); 高さ: var(--size); 背景: #333 url("img/nan.png") 繰り返しなし var(--scale-x) var(--scale-y)/var(--outbox-w) var(--outbox-h); ボックスの影: 1px 1px 3px rgba(0,0,0,.5); コンテンツ: ""; 変更されます:左、上; 変換: translate(-50%,-50%); } .magnifier:hover::before{ --サイズ: 100px; } 虫眼鏡の内容に注目してください。これは単なる画像の拡大ではなく、 CSS3+JS で虫眼鏡モードを完璧に実装する方法についての記事はこれで終わりです。CSS3+JS 虫眼鏡に関するより関連性の高いコンテンツについては、123WORDPRESS.COM で過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後も 123WORDPRESS.COM を応援していただければ幸いです。 |
<<: FirefoxのWeb開発者を使用してWebページのスタイルを無効にする方法
1. Nginx ロードバランシングの実装原理1. Nginxはリバースプロキシを通じて負荷分散を実...
1. 新しいユーザーwwweee000を作成します [root@localhost ~]# user...
この記事では、テキストクロックを実装するためのキャンバスの具体的なコードを例として紹介します。具体的...
目次1. 公式の足場を使って構築する2. プロジェクトディレクトリ分析3. TypeScript の...
この記事では、CSS フロートの特徴を紹介します。皆さんと共有し、自分用のメモとして残したいと思いま...
アイデアそれは実はとても簡単ですシェル スクリプトを記述して、mysql の mysqldump を...
MySQL DECIMALデータ型は、データベースに正確な数値を保存するために使用されます。会計シス...
1. システム内で開いているファイルの最大数を確認する #現在のリソース制限設定を表示する ulim...
HTML のヘッド部分には、ブラウザによる Web ページのレンダリングや SEO などに関連するタ...
取引特性1. アトミック性: トランザクションの開始後、すべての操作が完了するか、まったく実行されな...
1. 冒頭の2つの単語みなさんこんにちは。私の名前はLin Zonglinです。私はテストエンジニア...
現在、CentOS の最新バージョンは CentOS 8 です。次に、CentOS Linux 8....
世界最高のビジュアル デザイン スキルを持っていたとしても、訪問者がページ間やアイテム間を快適に移...
(?i) は大文字と小文字を区別しないことを意味します。大文字と小文字をすべて置き換えます。 htm...
この記事の例では、フォーム検証機能を実装するためのjsの具体的なコードを参考までに共有しています。具...