Windows10のマウスを模倣して境界線を光らせる効果を実現するCSSの詳細解説

Windows10のマウスを模倣して境界線を光らせる効果を実現するCSSの詳細解説

最新の Windows 10 アップデートをインストールした後、システム UI の詳細な効果が顕著に現れていることに気付きました。スタート メニューのタイルや UWP スタイルの設定インターフェイスでは、要素の強調表示された境界線がマウスに対応しており、境界線の強調表示された部分がマウスの動きに合わせて動きます。突然、あるアイデアが浮かびました。この効果は CSS を使用して実現できるだろうか?

分析する

デスクトップカレンダーでの効果を例に挙げると、マウスを動かすと、近くの境界線も徐々に見えるようになります。この効果はサーチライト効果ではないでしょうか?これは、放射状グラデーションの CSS マスクを使用して実現できます。

しかし問題は、マスクが要素全体に適用されることです。コンテンツに影響を与えずに境界にのみ適用する方法はありません。このためには、境界線と実際のコンテンツを分離し、異なるレイヤーで表現することしかできません。まあ、マウスが動いたときにマスクの位置を更新することは問題にならないはずです。

成し遂げる

準備

まず、カレンダー グリッドの 2 つのレイヤーを展開します。1 つのレイヤーには日付情報を表示し、もう 1 つのレイヤーにはサーチライト効果の境界線を表示します。フレックス レイアウト、グリッド、またはインライン ブロックを使用しても問題はありません。 重要ではありません。重要なのは、上部のグリッドと下部のグリッドが揃っている必要があることです。 次に、相対コンテナーを使用して 2 つの絶対レイヤーを囲み、固定します。

<div class="カレンダー">
    <div class="カレンダーヘッダー">
        <div class="week-day">1</div>
        <div class="week-day">2</div>
        <div class="week-day">3</div>
        <div class="week-day">4</div>
        <div class="week-day">金曜日</div>
        <div class="week-day">6</div>
        <div class="week-day">日</div>
    </div>
    <div class="カレンダー本体">
        <div class="グリッドコンテナ ボーダーレイヤー">
            <div class="grid-item"></div>
            ...
            <div class="grid-item"></div>
        </div>
            <div class="grid-container number-layer">
            <div class="grid-item"><span>28</span><span>14</span></div>
            <div class="grid-item"><span>29</span><span>15</span></div>
            ...
            <div class="grid-item"><span>2</span><span>19</span></div>
        </div>
    </div>
  </div>

レイヤー図:

効果は次のようになります:

マウスが置かれていないときは、まず境界レイヤーを非表示にします。

.border-layer {
 ...
  可視性: 非表示;
}

.calendar:hover .border-layer {
  可視性: 可視;
}

CSS マスク

CSS マスクは、Photoshop のレイヤー マスクに似ています。画像をターゲット要素のマスクとして使用できます。画像のアルファ チャネル (つまり、透明度情報) によって、ターゲット要素のどの部分が表示されるかが決まります (明るさ情報を使用するように選択することもできます)。

たとえば、マスク画像が半透明の画像である場合、実際の要素に対する効果は、不透明度を 0.5 に設定した場合と同じです。マスク画像が中が空洞の 5 角形の星である場合、要素が 5 角形の星形に切り取られる効果になります。

マスクの構文は、背景の構文とほぼ同じです。ここでは、放射状グラデーションを使用して、中心が白から端が透明になるまで半径 80 ピクセルのグラデーション円を作成し、mask-repeat と mask-size を使用して繰り返しと変形を防止します。

-webkit-mask-image: 放射状グラデーション(中央の円、白 0%、透明 80px);
  -webkit-mask-repeat: 繰り返しなし;
  -webkit-mask-size: 160px 160px; /* 半径 80px なのでサイズは 160px にする必要があります */

次に、mask-position を更新します。ここで注意すべき点が 2 つあります。1 つはマウスからターゲット要素までの相対座標を取得すること、もう 1 つは位置オフセットです。

MouseEvent には X/Y がたくさんあります。ドキュメントを基準とした pageX/pageY 座標を使用し、ドキュメントを基準としたターゲット要素の座標を減算すると、必要な座標を取得できます。 ベクトルの式: AB = AC - BC :

ただし、ここでのマスク位置の座標はまだ処理する必要があります。定義したマスクは 160 x 160 の円形グラデーションで、mask-position は background-position と同じで、マスクの左上隅 (0, 0) の位置を実際にコンテナーのどの座標に合わせる必要があるかを定義します。したがって、グラデーションの中心をマウスの座標と一致させるには、計算された座標から (80, 80) を減算する必要があります。

var borderLayer = document.querySelector(".border-layer");

document.querySelector(".calendar").addEventListener("mousemove", function(ev){
  var x = ev.pageX;
  var y = ev.pageY;
  var バウンディング = borderLayer.getBoundingClientRect();
  
  borderLayer.style.webkitMaskPosition = `${x - bounding.x - 80}px ${y -bounding.y - 80}px`;
});

最終結果: https://codepen.io/liuxiaole-the-sasster/full/OGZgpv

追記

境界線を重ねてマスクを適用するという解決策は特定の状況でのみ有効であり、別のレイヤーを分離するとメンテナンス コストが大幅に増加します。 MDN の情報を調べていたところ、偶然にもmask-borderというものがあることを発見しました。これは境界線用のマスクのようですが、まだどのブラウザも実装していないようです。

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

<<:  ネイティブ JavaScript を使用した Web 計算機の実装

>>:  MySQL 8.0 のメモリ消費の詳細な分析

推薦する

Vue バックグラウンドでステータス ラベルをエレガントに記述する例

目次序文最適化変数の抽出二次包装 el-tag コンポーネント使用要約する序文バックエンドシステムの...

MySQL 最適化: キャッシュ最適化 (続き)

MySQL 内部には至るところにキャッシュがあります。MySQL のソースコードを読むと、キャッシ...

HTMLは実際にはいくつかの重要なタグを学ぶアプリケーションです

「これは革命になるだろう」という記事が出たあと。業界の皆様に認知され、もちろん内外からの評価もいただ...

Docker データ ストレージ tmpfs マウントの詳細な説明

この記事を読む前に、ボリュームとバインドマウントの基本を理解しておいてください。詳細については、次の...

jsはFileReaderを使用してローカルファイルまたはBLOBを読み取ります

目次FileReaderはローカルファイルまたはBLOBを読み取ります1. FileReaderの使...

DevUI で独自の Angular コンポーネント ライブラリを構築する方法

目次序文コンポーネントライブラリの作成主要な構成の変更ディレクトリレイアウトの調整ライブラリ構築のた...

Docker を使用してコンテナ内のルート パスワードを変更する方法

1. dockerfileを作成するときにsshパスワードを設定するには、次のコマンドを使用します。...

Linuxの運用・保守の基礎知識から上級者向け知識までをまとめました

運用保守エンジニアは、初期段階では非常に大変な仕事です。この期間中、コンピューターの修理、ネットワー...

Windows サービス 2016 Datacenter\Stand\Embedded アクティベーション方法 (2021)

管理者権限でcmdを実行する slmgr /ipk CB7KF-BWN84-R7R2Y-793K2-...

Dockerイメージの作成、アップロード、プル、デプロイを理解するための記事

目次1. 画像1. 鏡とは何ですか? 2. 画像の構成と目的(1) Dockerファイル(2)スクラ...

Node.js における非同期プログラミングの知識ポイントの詳細な説明

導入JavaScript はデフォルトでシングルスレッドであるため、コードは並列実行するための新しい...

ディスクを破壊せずに Linux で dd コマンドを使用する方法

故障したストレージ ドライブからデータを救出する場合でも、アーカイブをリモート ストレージにバックア...

Alibaba CloudがCloud Shieldから無料のSSL証明書(https)を申請

プロジェクトでは https サービスを使用する必要があるため、Alibaba Cloud では無料...

複数レベルの複雑な動的ヘッダーの avue-crud 実装例

目次序文バックグラウンドデータの結合フロントエンドデータ表示ページ効果表示Avue.js は、既存の...

負荷分散の基礎知識とnginxを使用した負荷分散の簡単な例

Nginx は、一般的に 7 層の負荷分散に使用できます。この記事では、負荷分散に関する基本的な知識...