CSSに基づいてマウス入力の方向を決定する

CSSに基づいてマウス入力の方向を決定する

以前、フロントエンド技術グループに所属していたとき、グループのメンバーが面接中に問題に遭遇したと言っていました。面接官は、マウスの位置に基づいてオブジェクトの移動方向を決定するデモを純粋な CSS を使用して実装するように依頼しました。

与えられた初期構造は次のとおりです。

<スタイル>
体 {
    パディング: 2em;
    テキスト配置: 中央;
}
。ブロック {
    位置: 相対的;
    表示: インラインブロック;
    幅: 10em;
    高さ: 10em;
    垂直位置合わせ: 中央;
}

.block_content {
    位置: 絶対;
    上: 0;
    左: 0;
    幅: 100%;
    高さ: 100%;
    テキスト配置: 中央;
    行の高さ: 10em;
    背景: #333;
    色: #FFF;
}
</スタイル>
<p class="text">次のコンテンツ上でマウス ポインターをさまざまな方向から移動します</p>
<p>↓</p>
<span>→ </span>
<div class="block">
    <div class="block_content">
        ホバリングして!
    </div>
</div>
<span>←</span>
<p>↑</p>

効果図は以下のとおりです。

成し遂げる

業務とは全く関係のない、実用的でない質問ばかりでイライラします。中国のフロントエンドはいつになったら立ち上がるのでしょうか? 良い質問をありがとうございます。実装できるよう最善を尽くします。

では、この機能は本当に純粋な CSS で実現できるのでしょうか?

答えは「はい」です。まず、そのアイデアを分解してみましょう。

CSS マウスイベント

まず、質問によると、この質問ではマウス操作を使用する必要があることがわかります。JS にはさまざまなmouseイベントがありますが、同様に、CSS にも:hoverあります。

この質問で使用するセレクターは、hoverです:hover

方向を決める

方向を判断する機能がこの質問の核心です。

タイトル画像から判断すると、実際には方向指示が与えられており、マウスを 4 つの矢印の方向に入力する必要があることがわかります。

次に、純粋な CSS で実装する場合、マウスがキー ノードに触れる必要があり、このノードの特定のパフォーマンスによってこの位置を表現できる必要があります。

これらは質問に示されている 2 つの隠れた条件です。

それでは実装してみましょう。

まず、 :hoverを通じてこのキーノードをタッチする必要があります。タッチは矢印の方向にトリガーされる必要があります。次に、矢印の方向にタッチできるオブジェクトを追加できます。例:

<スタイル>
.block_hoverer {
    位置: 絶対;
    幅: 100%;
    高さ: 100%;
    zインデックス: 1;
}
.block_hoverer:n番目の子(1) {
    背景: 赤;
}

.block_hoverer:n番目の子(2) {
    背景:ライム;
}

.block_hoverer:n番目の子(3) {
    背景: オレンジ;
}

.block_hoverer:n番目の子(4) {
    背景: 青;
}
</スタイル>
<div class="block">
    <div class="block_hoverer">トップ</div>
    <div class="block_hoverer">次へ</div>
    <div class="block_hoverer">左</div>
    <div class="block_hoverer">右</div>
    <div class="block_content">
        ホバリングして!
    </div>
</div>

効果は以下のとおりです。

右のブロックを除いて、他のすべてが覆われていることがわかります。これは正常です。

次に、これらのブロックを端に戻す必要があります。

コードは次のとおりです。

.block_hoverer {
  位置: 絶対;
  zインデックス: 1;
  幅: 100%;
  高さ: 100%;
  遷移: すべて 0.3 秒の緩和;
}
.block_hoverer:n番目の子(1) {
  背景: 赤;
  上限: -90%;
}

.block_hoverer:n番目の子(2) {
  背景:ライム;
  上位: 90%
}

.block_hoverer:n番目の子(3) {
  背景: オレンジ;
  左: -90%;
}

.block_hoverer:n番目の子(4) {
  背景: 青;
  左: 90%;
}

効果は以下のとおりです。

次に、トランジションを追加します。

.block_hoverer {
  遷移: すべて 0.3 秒の緩和;
}
.block_hoverer:ホバー{
  不透明度: 1;
  上: 0;
  左: 0;
}

効果は以下のとおりです。

1 つのステップは非表示にすることです:

。ブロック {
  位置: 相対的;
  表示: インラインブロック;
  オーバーフロー: 非表示;
  幅: 10em;
  高さ: 10em;
  垂直位置合わせ: 中央;
}
.block_hoverer {
  不透明度: 0;
}
.block_hoverer:ホバー{
  不透明度: 1;
}

効果は以下のとおりです。

完全なコードは次のようになります。

<スタイル>
    体 {
        パディング: 2em;
        テキスト配置: 中央;
    }
    。ブロック {
        位置: 相対的;
        表示: インラインブロック;
        オーバーフロー:非表示;
        幅: 10em;
        高さ: 10em;
        垂直位置合わせ: 中央;
        変換: translateZ(0);
    }
    .block_hoverer {
        位置: 絶対;
        zインデックス: 1;
        幅: 100%;
        高さ: 100%;
        不透明度: 0;
        遷移: すべて .3 秒の緩和;
    }

    .block_hoverer:n番目の子(1) {
        背景: 赤;
        上限: -90%;
    }

    .block_hoverer:n番目の子(2) {
        背景:ライム;
        上位: 90%
    }

    .block_hoverer:n番目の子(3) {
        背景: オレンジ;
        左: -90%;
    }

    .block_hoverer:n番目の子(4) {
        背景: 青;
        左: 90%;
    }
    .block_hoverer:ホバー{
        不透明度: 1;
        上: 0;
        左: 0;
    }

    .block_content {
        位置: 絶対;
        上: 0;
        左: 0;
        幅: 100%;
        高さ: 100%;
        テキスト配置: 中央;
        行の高さ: 10em;
        背景: #333;
        色: #FFF;
    }
</スタイル>
<本文>
    <p class="text">次のコンテンツ上でマウス ポインターをさまざまな方向から移動します</p>
    <p>↓</p>
    <span>→ </span>
    <div class="block">
        <div class="block_hoverer">1</div>
        <div class="block_hoverer">2</div>
        <div class="block_hoverer">3</div>
        <div class="block_hoverer">4</div>
        <div class="block_content">
            ホバリングして!
        </div>
    </div>
    <span>←</span>
    <p>↑</p>
</本文>

完全な効果については、Yutouのコードペンをご覧ください。

CSS によるマウス入力方向の決定に関する記事はこれで終わりです。CSS マウス入力方向に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き閲覧してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

<<:  CSSスタイルで実現されるHTML背景色のグラデーション効果

>>:  よくある CSS エラーと解決策

推薦する

iframe src 割り当ての問題 (サーバー側)

今日この問題に遭遇しました。サーバー側でiframeのsrc値を再割り当てし、iframeにIDを追...

Vueコンポーネントの7つの通信方法についての深い理解

目次1. props/$emit導入コードサンプル2.Vスロット導入コードサンプル3.$refs/ ...

Pure CSS3はdivの出入りを順番に実現します

この記事は主に、純粋な CSS3 を使用して div が順番に出入りする効果を紹介します。一定の参考...

Bootstrap5 ブレークポイントとコンテナの具体的な使用法

目次1. Bootstrap5 ブレークポイント1.1 モバイルファースト1.2 ブートストラップブ...

MySQLの制限を使用して大規模なページングの問題を解決する方法

序文日常の開発では、MySQL を使用してページングを実装する場合、常に MySQL 制限構文を使用...

7つの便利なTypeScriptの新機能

目次1. オプションの連鎖2. NULL値の結合3. 再帰型エイリアス4. アサーション署名5. P...

MySQL の CPU 負荷が高い問題のトラブルシューティング

MySQL による CPU 負荷の上昇今日の午後、MySQL によってサーバーの負荷が高くなる問題を...

時点別のMySQLデータベース復旧実績

はじめに: 時間ポイントによる MySQL データベースの復旧どの企業にとっても、データは最も価値の...

HTML スペースコードの簡単な分析

HTML についてどれくらい知っていますか? 現在、基本的な HTML コードを学習している場合は、...

IE6のmin-widthとmin-heightと互換性を持たせる簡単な方法

ウェブサイトがワイドスクリーンの場合、ブラウザ ウィンドウを左右にドラッグすると、ウェブサイトの幅が...

Nginx で CDN サーバーを構築する方法の詳細な説明 (画像とテキスト)

Nginxのproxy_cacheを使用してキャッシュサーバーを構築する1: ngx_cache_...

jsは前のページに戻り、コードを更新します

1. Javascript は前のページ history.go(-1) に戻り、2 つのページを返し...

Linux のインスタンスにパブリック IP アドレスを割り当てる方法

説明するこのインターフェースを呼び出すときは、次の点に注意する必要があります。パブリック IP アド...

MySQL/MariaDB で完全な Unicode をサポートする方法

目次utf8mb4 の紹介UTF8 バイト数超過エラーutf8mb4 サポートデフォルトの文字エンコ...