ホームページ ウェブフロントエンド CSSチュートリアル :has() 擬似クラスにより CSS での JavaScript ハックの必要性がなくなる方法

:has() 擬似クラスにより CSS での JavaScript ハックの必要性がなくなる方法

Nov 30, 2024 am 03:50 AM

How :has() Pseudo-Class Eliminates the Need for JavaScript Hacks in CSS

子に基づいて親要素のスタイルを設定する必要があり、単純なクラスを追加するためだけに大量の JavaScript を作成することになったときのことを覚えていますか?さて、そんな時代もついに終わりました! CSS :has() 擬似クラスは窮地を救うためにここにあり、あらゆる場所のフロントエンド開発者の状況を変えます。

:has() についての大騒ぎは何ですか?

:has() を CSS の水晶玉と考えてください。これを使用すると、要素の内部を見て、そこに何が含まれているかを確認できます。画像が含まれている div のスタイルを変更したいですか? div:has(> img) と書くのと同じくらい簡単です。 JavaScript は必要ありません!

/* This targets any div that contains an image */
div:has(img) {
  padding: 1rem;
  background: #f5f5f5;
}

/* This one's more specific - only direct children */
div:has(> img) {
  border: 2px solid #ddd;
}
ログイン後にコピー
ログイン後にコピー

最新のブラウザのほとんどは :has() をサポートしていますが、Internet Explorer ユーザー (まだサポートする必要がある場合) はフォールバックが必要です。しかし、それで立ち止まらないでください。ここではプログレッシブエンハンスメントがあなたの友達です!

古いやり方 vs. 新しい魅力

かつて私たちを夢中にさせた、いくつかの一般的なシナリオについて話しましょう。これらを覚えていますか?

フォームフィールド検証ダンス

古い方法:

const formGroup = document.querySelector('.form-group');
const input = formGroup.querySelector('input');

input.addEventListener('invalid', () => {
  formGroup.classList.add('has-error');
});
ログイン後にコピー
ログイン後にコピー

新しい方法:

.form-group:has(input:invalid) {
  border-color: red;
  background: #fff8f8;
}
ログイン後にコピー

イベント リスナーやクラスの切り替えは不要です。純粋な宣言型 CSS だけが必要です。素敵ですね?

ドロップダウン メニューの変身

誰もが、メニューが開いているときにドロップダウン コンテナーのスタイルを設定しようとしたことがあります。以前は、DOM ツリー内でクラスを上下に切り替えるには JavaScript が必要でした。

古い JavaScript アプローチ:

const dropdown = document.querySelector('.dropdown');
const menu = dropdown.querySelector('.menu');

menu.addEventListener('click', () => {
  dropdown.classList.toggle('is-open');
});
ログイン後にコピー

新しい CSS アプローチ:

.dropdown:has(.menu:focus-within) {
  background: #f0f0f0;
  box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}
ログイン後にコピー

:has() を使用した現実世界の手品

:has() が本当に優れている実用的な例をいくつか見てみましょう:

1. スマート画像ギャラリー

ギャラリーに含まれるコンテンツの種類に基づいてレイアウトを調整したいですか?簡単簡単!

.gallery:has(img) {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
}

.gallery:has(video) {
  display: flex;
  flex-direction: column;
}
ログイン後にコピー

Medium 記事へのリンクを、参照、引用、またはインスピレーション源として使用することで、新しい記事に組み込むことができます。これを効果的に組み込む方法は次のとおりです:

インタラクティブなフォーム、ドロップダウン メニュー、兄弟状態の管理は、現在 CSS が主導権を握っている例のほんの一例にすぎません。この洞察力に富んだ Medium の記事で述べたように、:has() のような最新の手法を使用すると、JavaScript に依存せずに CSS でこれらのタスクを直接管理できます。

2. フォームフィールドの依存関係

チェックボックスがオンになっているときにセクション全体を強調表示する必要がありますか?問題ありません!

.section:has(input[type="checkbox"]:checked) {
  background: #e8f4ff;
  padding: 1rem;
  border-radius: 4px;
}
ログイン後にコピー

3. 空状態の処理

コンテナが空のときにメッセージを表示したいですか? :has() があなたの味方です:

/* This targets any div that contains an image */
div:has(img) {
  padding: 1rem;
  background: #f5f5f5;
}

/* This one's more specific - only direct children */
div:has(> img) {
  border: 2px solid #ddd;
}
ログイン後にコピー
ログイン後にコピー

パフォーマンスの勝利

JavaScript の代わりに :has() を使用することについては次のとおりです。これは単にコードの記述量が減るだけではありません。実際にページのパフォーマンスが向上する理由は次のとおりです。

  1. ブラウザのスタイル エンジンはすべての作業をネイティブに処理します
  2. JavaScript 実行のオーバーヘッドなし
  3. 一定のクラスの追加/削除によるレイアウトのスラッシングはありません
  4. ページを詰まらせるイベント リスナーが減少します

ベストプラクティスと注意点

:has() は素晴らしいものですが、留意すべき点がいくつかあります:

  1. シンプルにしてください
    複雑なセレクターを使いすぎないでください。 div:has(>span:has(>img)):has( p) と書けたからといって、そうすべきというわけではありません!

  2. プログレッシブエンハンスメント
    :has():
    をサポートしていないブラウザに対しては、常に賢明なフォールバックを用意してください。

const formGroup = document.querySelector('.form-group');
const input = formGroup.querySelector('input');

input.addEventListener('invalid', () => {
  formGroup.classList.add('has-error');
});
ログイン後にコピー
ログイン後にコピー
  1. パフォーマンスに関する考慮事項 :has() は一般にパフォーマンスが高いですが、非常に複雑なセレクターは依然としてレンダリングに影響を与える可能性があります。 DevTools を頻繁に使用している場合は、パフォーマンス パネルに注目してください。

まとめ

:has() 疑似クラスは単なる新しい CSS 機能ではなく、スタイルシートでの親子関係の処理方法におけるパラダイム シフトです。これは、より保守しやすいコードを作成し、パフォーマンスを向上させるのに役立ちます。そして最も重要なことに、CSS が最も得意とすること、つまりスタイルを宣言的に処理できるようになります。

次に JavaScript で親要素のクラスを切り替えるときは、:has() を使用すると、よりシンプルで洗練された解決策がある可能性があることを思い出してください。試してみてください – あなたのコード (そしてあなたのユーザー) はあなたに感謝するでしょう!

ブラウザのサポートは良好であり、さらに改善されていますが、最新の互換性情報については常に caniuse.com をチェックしてください。実験することを恐れないでください。そうすることで、私たち全員が開発者として学び、成長することができます!

以上が:has() 擬似クラスにより CSS での JavaScript ハックの必要性がなくなる方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

静的フォームプロバイダーの比較 静的フォームプロバイダーの比較 Apr 16, 2025 am 11:20 AM

ここでは、「静的フォームプロバイダー」という用語を埋めてみましょう。あなたはあなたのHTMLを持ってきます

SASSをより速くするための概念の証明 SASSをより速くするための概念の証明 Apr 16, 2025 am 10:38 AM

新しいプロジェクトの開始時に、SASSコンピレーションは瞬く間に起こります。これは、特にbrowsersyncとペアになっている場合は素晴らしい気分です。

毎週のプラットフォームニュース:HTMLロード属性、主なARIA仕様、およびIFRAMEからShadowDOMへの移動 毎週のプラットフォームニュース:HTMLロード属性、主なARIA仕様、およびIFRAMEからShadowDOMへの移動 Apr 17, 2025 am 10:55 AM

今週のプラットフォームニュースのラウンドアップで、Chromeは、Web開発者のロード、アクセシビリティ仕様、およびBBCの動きのための新しい属性を導入します

HTMLダイアログ要素を使用したいくつかの実践 HTMLダイアログ要素を使用したいくつかの実践 Apr 16, 2025 am 11:33 AM

これは私が初めてHTML要素を見ていることです。私はしばらくの間それを知っていましたが、まだスピンしていませんでした。かなりクールです

ペーパーフォーム ペーパーフォーム Apr 16, 2025 am 11:24 AM

購入またはビルドは、テクノロジーの古典的な議論です。自分で物を構築することは、あなたのクレジットカードの請求書にはラインアイテムがないため、安価に感じるかもしれませんが

毎週のプラットフォームニュース:テキスト間隔のブックマークレット、トップレベルの待望、新しいアンプロードインジケーター 毎週のプラットフォームニュース:テキスト間隔のブックマークレット、トップレベルの待望、新しいアンプロードインジケーター Apr 17, 2025 am 11:26 AM

今週のラウンドアップ、タイポグラフィを検査するための便利なブックマークレットである。

「ポッドキャストにサブスクライブ」リンクはどこにすべきですか? 「ポッドキャストにサブスクライブ」リンクはどこにすべきですか? Apr 16, 2025 pm 12:04 PM

しばらくの間、iTunesはポッドキャストの大きな犬だったので、「ポッドキャストにサブスクライブ」をリンクした場合:

独自の非JavaScriptベースの分析をホストするためのオプション 独自の非JavaScriptベースの分析をホストするためのオプション Apr 15, 2025 am 11:09 AM

サイトの訪問者と使用データを追跡するのに役立つ分析プラットフォームがたくさんあります。おそらく、特にGoogleアナリティクスが広く使用されています

See all articles