

has疑似クラスとは?
hasは、CSSセレクターで使用できる疑似クラスです。親要素が特定の子要素や条件を含んでいるかを判定し、そのスタイルを変更することができます。これにより、特定の条件に基づいたデザインの変更を CSSだけで実現可能になります。従来、こうした処理は JavaScriptを使用する必要がありましたが、has を使うことでコードを簡潔にし、効率的にスタイルを管理できるようになります。
基本的な使い方
hasは、特定の親子関係に基づいた条件指定を行うために使用される疑似クラスです。例えば、div要素の中にp要素が含まれている場合、その親であるdiv要素にスタイルを適用することが可能です。
div:has(p) {
/* スタイルを記述 */
}
実装例
カードデザインを作成する際、画像が用意できる場合とできない場合があります。このような状況で、has疑似クラスを活用することで、それぞれのケースに応じたスタイルを効率的に適用できます。
以下が具体例です。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>has疑似クラスの実装例</title>
<style>
/* has疑似クラスに関係がないスタイルは省略しています。*/
/* 画像がある場合のスタイル */
.card:has(img) {
display: flex;
align-items: center;
gap: 1rem;
}
/* 画像がない場合のスタイル */
.card:not(:has(img)) {
display: block;
}
</style>
</head>
<body>
<div class="card-wrap">
<div class="card">
<img src="https://picsum.photos/300/300" alt="Image 1" />
<div>
<h2>カードタイトル 1</h2>
<p>このカードには画像があります。</p>
</div>
</div>
<div class="card">
<div>
<h2>カードタイトル 2</h2>
<p>このカードには画像がありません。</p>
</div>
</div>
<div class="card">
<img src="https://picsum.photos/300/300" alt="Image 2" />
<div>
<h2>カードタイトル 3</h2>
<p>このカードには画像があります。</p>
</div>
</div>
<div class="card">
<div>
<h2>カードタイトル 4</h2>
<p>このカードには画像がありません。</p>
</div>
</div>
</div>
</body>
</html>
メリットと注意点
メリット
CSSだけで親子関係の条件指定が可能
has疑似クラスを利用すれば、JavaScriptを使わずに、親要素が特定の子要素を含む条件を簡単にスタイリングできます。これにより、CSSのみで柔軟なデザインの制御が可能です。
コードの簡素化
従来、JavaScriptを用いて行っていた複雑な条件ロジックを、スタイルシートに直接記述できます。これにより、HTMLやJavaScriptの記述量が減り、コードがシンプルになります。
保守性の向上
スタイルをCSSで分離することで、デザインの変更や管理が容易になります。特に、大規模なプロジェクトではメンテナンス性が向上し、作業効率がアップします。
注意点
ブラウザのサポート状況
主要な最新ブラウザで広くサポートされていますが、一部の古いブラウザでは正しく動作しない場合があります。can i useで対応状況を確認して使用を検討してください。
まとめ
has疑似クラスは、CSSだけで柔軟な条件スタイリングを可能にする強力なツールです。親要素が特定の子要素や条件を満たす場合にスタイルを適用でき、従来 JavaScript が必要だった複雑な処理を簡略化できます。このクラスを活用することでコードの簡素化や保守性が向上できますので是非使用してみてください。