CSS 経由で JS にパラメータを渡す方法

CSS 経由で JS にパラメータを渡す方法

1. CSSを通す必要がある背景

CSS におけるメディアクエリの用途は、デバイスサイズの判別、マウスの動作がサポートされているかどうか、ダークモードかどうか、省電力モードかどうかなど、多岐にわたります。

例えば、最近よく話題になるダークモードやダークテーマなど。

@media (優先カラースキーム: 暗い) {
    /* ダークモード、ダークテーマ*/
}
@media (優先カラースキーム: 明るい) {
    /* ライトテーマ */
}

CSS は自動的に検出できますが、場合によっては、JS で異なるインタラクション ロジックを実装したり、さまざまなシステム テーマに応じて異なるコンテンツをレンダリングしたりする必要もあります。

何をするか?今のところシステムモードを検出するための既製の JS API は存在しないようなので、CSS でパラメータを渡すことに頼るしかありません。これは典型的なシナリオであり、同様のシナリオが多数あります。

例えば:

1. CSSとJSの境界線の幅の一貫性

レスポンシブレイアウトを行う際には、多くの場合、クリティカルな幅の値を設定する必要があります。たとえば、デバイスの幅が 640 ピクセル未満の場合はモバイル端末に入ったと見なします。また、幅が 480 ピクセル未満の場合は、モバイル端末レイアウトを使用します。

このとき、JavaScript コードも、この臨界幅に基づいて異なるインタラクション効果を実装する必要があります。特定の値より大きい場合は、PC レイアウトでのインタラクションであり、特定の値より小さい場合は、モバイル レイアウトでのインタラクションです。

実際の開発では、多くの人が CSS コードと JS コードに関する規則を作成します。たとえば、次のようになります。

@media スクリーンと (最大幅: 480px) {
    /* 小さな画面幅に対応したレスポンシブレイアウト */
}
画面の幅が480以下の場合
    /* 画面幅が狭い場合のインタラクション動作 */
}

この規則に問題がある場合、プロジェクトの一定期間後に、この重要な幅に問題があることがわかります。たとえば、携帯電話が横長モードの場合、幅は 480 px を超えますが、これはモバイル端末のレイアウト方法でもなければならないため、開発者はそれを 640 px に変更しました。

@media スクリーンと (最大幅: 640px) {
    /* 小さな画面幅に対応したレスポンシブレイアウト */
}

結果的に、JS コードにもこの判定があることを忘れるとバグが発生します。

JavaScript コードでの画面判定が、当初の実装時に CSS パラメータに基づいていた場合、このようなメンテナンスの問題は発生しなかったでしょう。

2. ブラウザは :hover 疑似クラスのインタラクションをサポートしていますか?

デスクトップ、モバイル、IoT デバイスで共通となることを期待して、いくつかの UI コンポーネントを開発します。

デスクトップ上の一部のコンポーネントは、mouseenter イベントまたは mouseover イベントを使用してエクスペリエンスを実現すると非常に優れており便利です。しかし、これらをモバイル デバイスやその他のタッチ スクリーン デバイスで使用すると、ホバーというものが存在しないため、世界的に問題が生じます。

幸いなことに、CSS コードには、ブラウザーが :hover 疑似クラスのインタラクションをサポートしているかどうかを判断するためのメディア クエリがあります (このクエリについては特別な記事の紹介があります。ここをクリックしてください)。

@media (任意のホバー: なし) {
    /* デバイスはホバーイベントをサポートしていません*/
}

残念ながら、直接判断するためのそのような API は JS にはありません。おそらく多くの人は、ブラウザが touchstart などのイベントをサポートしているかどうかを判断することでこの判断を下すでしょう。残念ながら、この判断方法は不正確です。多くのタッチ デバイスはマウス デバイスにも接続できるため、ホバー イベントも適切にサポートされるはずです。

そこで、最終的な方法としては、CSS メディアクエリを使用して判定を行い、判定結果を js にパラメータとして渡すという方法があります。

さて、ここでの疑問は、これら 3 つのケースを踏まえて、CSS を介して JS コードにパラメーターを渡すにはどうすればよいかということです。

2. CSSパラメータをJSに渡す方法

通常、CSS から JS にパラメータを渡すには、次の 2 つの方法を使用します。

1. コンテンツ疑似要素コンテンツパラメータの受け渡し

例えば:

@media (任意のホバー: なし) {
    本文::前{
        コンテンツ: 'hoverNone';
        表示: なし;
    }
}

この時点で、JS コードを使用して body 疑似要素によって渡される情報を取得できます。

var strContent = getComputedStyle(document.body, '::before').content;
// strContent の結果が 'none' の場合、ホバーがサポートされていることを意味します
// strContent の結果は '"hoverNone"' です。これはホバーがサポートされていないことを意味し、クリック イベントに置き換える必要があります。

この記事では、上記の CSS コードを事前に埋め込みます。そのため、Chrome ブラウザでコンソールを開き、モバイル プレビュー モードに入り、JS テストを入力すると、CSS によって渡された文字列情報が JS によって取得されていることがわかります。

この時点で、content 属性と組み合わせた ::before および ::after 疑似要素に基づいて、CSS で渡される情報を取得できます。

このパラメータ渡し方法の利点は、比較的互換性が良いことですが、欠点も明らかです。つまり、渡すパラメータ値の数が限られていることです。一度に複数の値を渡したい場合は、少し難しくなります。このとき、CSSカスタム属性の助けを借りて、次の方法を試すことができます。

2. CSSカスタムプロパティ(CSS変数)パラメータの受け渡し

早速コードを見てみましょう。CSS カスタム プロパティ (CSS 変数) を使用すると、ダーク モードとライト モードの開発とメンテナンスが比較的簡単になります。さらに、この CSS カスタム プロパティを使用して、JS のパターン認識を行うこともできます。

:根 {
    --モード: '不明';
}
@media (優先カラースキーム: 暗い) {
    /* ダークモード */
    :根 {
         --モード: '暗い';
         --colorLink: #bfdbff;
         --カラーマーク: #cc0000;
         --colorテキスト: #ffffff;
         --colorLight: #777777;
    }
}
@media (優先カラースキーム: 明るい) {
    /* ライトテーマ */
    :根 {
         --モード: 'ライト';
         --カラーリンク: #34538b;
         --カラーマーク: #cc0000;
         --colorテキスト: #000000;
         --colorLight: #cccccc;
    }
}

JS検出コード:

var mode = getComputedStyle(document.documentElement).getPropertyValue('--mode').trim();
// モード結果が「"dark"」の場合、夜間テーマ、ダークモード、ダークスタイル、目の保護モードを意味します。
// モードの結果がデフォルトモード以外です

たとえば、私のコンピューターで実行した結果は次のようになります。

その他の値は、Mac OS X またはモバイル デバイスで表示されるはずです。お気軽にテストしてスクリーンショットを送ってください。記事で更新します。

従来の CSS カスタム プロパティを使用する利点は、非常に柔軟性が高く、多数の変数を定義できることです。実際のところ、互換性の問題について心配する必要はありません。なぜ?夜間モードをサポートするデバイス ブラウザーは、CSS カスタム プロパティをサポートする必要があるためです。

したがって、全体として、CSS カスタム プロパティを使用してパラメータを渡すことが、ダーク モードのシナリオにおける最適な実装です。ただし、シナリオがデバイス幅のレスポンシブ レイアウトに基づいている場合は、CSS コンテンツ属性を使用してパラメータを渡す方が適切です。

要約する

以上が、CSS を通じて JS にパラメータを渡す方法の紹介でした。参考になれば幸いです。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

<<:  Vueはキャンバスの手書き入力を使用して中国語を認識します

>>:  親ページの更新を制御するために HTML で iframe を実装するためのアイデアとコード

推薦する

Ubuntu の起動後にアプリケーションを実行するためのターミナルの設定方法

1.メニューバーにスタートと入力し、スタートアップアプリケーションをクリックして入力します。 2. ...

実行中の時計を実装するための純粋な CSS3 コード

操作効果コードの実装html <div id="ウォッチ"> <...

Vue-CLI マルチページディレクトリパッケージ化手順の記録

ページディレクトリ構造 デフォルトの HTML テンプレート ファイル public/index.h...

jQueryはシャトルボックス効果を実現します

この記事では、シャトルボックス効果を実現するためのjQueryの具体的なコードを参考までに紹介します...

複雑なSQLクエリを含むMySQLの一般的なSQL文の概要

1. 複雑なSQLクエリ1.1. 単一テーブルクエリ(1)指定の列を選択する[例] 全生徒の生徒ID...

Centos7でmysql5.7.19のデータ保存場所を移動する方法

シナリオ: データ量が増加すると、MySQL が配置されているディスクがいっぱいになり、より大きなス...

JavaScript でプロトタイプ パターンを実装する方法

概要プロトタイプ パターンは、プロトタイプ インスタンスによって作成されるオブジェクトの型を指し、こ...

クリーンで美しいウェブデザインのための4つの原則

この記事では、 Webデザインに関連するこれら4 つの原則について説明します。これら4 つの原則を念...

mysql 計算関数の詳細

目次2. フィールドの連結2. MySQL関数の例をいくつか挙げてください。 2.1 シンボル処理2...

Reactプロジェクトで画像を導入するいくつかの方法

imgタグは画像を導入しますreactは実際にはjsリーダー関数を介してページをレンダリングするため...

カルーセル効果を実現するjQueryプラグイン

毎日jQueryプラグイン - カルーセルチャートを実装するためのjQueryプラグイン。参考までに...

MySQL データベース インデックスが B+ ツリーの使用を選択するのはなぜですか?

MySQL データベース インデックスが B+ ツリーを使用する理由をさらに分析する前に、データ構...

MySQL サブクエリ (ネストされたクエリ)、結合テーブル、複合クエリの詳細な説明

1. サブクエリMySQL 4.1以降はサブクエリをサポートしていますサブクエリ:別のクエリ内にネス...

MySQLのexplain型の詳細な説明

導入:多くの場合、さまざまな選択ステートメントを使用して必要なデータを照会した後、多くの人は作業が正...

Nginx10m+の高並列カーネル最適化に関する簡単な説明

高い同時実行性とは何ですか?デフォルトの Linux カーネル パラメータは、最も一般的なシナリオ向...