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 を実装するためのアイデアとコード

推薦する

MySQL 5.7.33 インストール プロセスの詳細な図解

目次インストールパッケージのダウンロードインストール環境変数の設定インストールが成功したか確認する記...

IdeaでMySQLデータベースに接続すると中国語の文字化けが発生する問題

問題: JDBCを使用してMySQLデータベースに接続すると、中国語の文字を挿入すると文字化けした文...

CSS スタイルの読み込みの優先順位に関する経験の共有

昨日のプロジェクト開発中に、スタイルの読み込み優先順位に関する問題が発生しました。クラスは定義され、...

MySQL で制限を使用するとパフォーマンスに影響するのはなぜですか?

まず、MySQL のバージョンについて説明します。 mysql> バージョンを選択します();...

インデックスを設計する際の原則は何ですか? インデックスの障害を回避するにはどうすればよいでしょうか?

目次主キーインデックス頻繁にクエリされるフィールドのインデックスを作成する大きなフィールドのインデッ...

記事では、js を使用して弾幕効果を実現する方法を説明します

目次新しい HTML ファイルを作成します。初期テンプレートを作成するHTML の追加CSS パディ...

ServerSocketのデフォルトIPバインディングの実装プロセスの詳細な説明

開発中にサーバーを起動する必要がある場合、ローカルテストではポートを直接書き込み、実際の環境ではバイ...

Linuxにソフトウェアをインストールするいくつかの方法の詳細な説明

1. RPM パッケージのインストール手順: 1. soft.version.rpm などの対応する...

js はマウスによる画像の切り替えを実装します (タイマーなし)

この記事の例では、マウス切り替え画像を実現するためのjsの具体的なコードを参考までに共有しています。...

Win10環境にMysql5.7.23をインストールする際の問題点と落とし穴

たくさんのチュートリアルを読みましたが、うまくインストールできませんでした。しばらく試行錯誤した後、...

ElementUI の el-dropdown に複数のパラメータを実装する方法

最近、業務上のボタンの増加により、ページレイアウトにボタンが多すぎて、ページが美しくなく、ユーザーエ...

get メソッドによる HTML フォームの値転送の例

google.htmlインターフェースは図の通りですコードは図のとおりです: (比較的シンプルで、入...

MySQL マルチテーブルクエリの詳細な説明

よく食べて十分に休息を取るというのは簡単なことのように思えますが、実際に実行するのはそれほど簡単では...