COOSY BLOG
  • HOMEホーム

  • SERVICEサービス

    • サービスTOP
    • Web制作
    • ブランディング
    • デジタルマーケティング
    • 戦略企画
    • DX推進・システム開発
    • グローバル展開
  • WORK制作実績

    • 制作実績TOP
    • コーポレートサイト
    • 採用サイト
    • ECサイト
    • プロモーション
    • サービスサイト・SaaS
    • システム開発
  • ABOUTクーシーについて

    • クーシーについて
    • 会社情報
    • 私たちが大切にしていくこと
    • お知らせ
    • クーシーラボ岩手
    • ロンドン支社
    • ミャンマー支店
  • BLOGブログ

  • RECRUITリクルート

  • Contactお問い合わせ

BLOG MENU

  • BLOGトップ
  • 目的別

    • 目的別TOP
    • コーポレートサイト
    • ECサイト
    • オウンドメディア
    • 採用サイト
    • プロモーション
    • Webサービス
    • LP
    • ブランディング・CI
  • Web制作ハウツー

    • Web制作ハウツーTOP
    • UIUX・サイト設計
    • WebデザインTips
    • PM/ディレクション
    • フロントエンド(HTML/CSS)
    • 撮影・動画編集
    • ライティング
    • CMS
    • Web制作ツール
    • イラスト
  • システム開発

    • システム開発TOP
    • プログラミング
    • EC構築
    • CMS開発・構築
    • サーバ構築
    • データベース構築
    • セキュリティー
  • Webサイト運用のコツ

    • Webサイト運用のコツTOP
    • サイト運用・管理・保守
    • コンテンツ運用
    • CRM(顧客管理)
  • Webマーケティング

    • WebマーケティングTOP
    • SEO対策・トレンド
    • コンテンツ制作・SEOライティング
    • アクセス解析
    • Web広告
    • Web集客ハウツー
  • 特集

    • 特集TOP
    • Web最新トレンド
    • カルチャー
    • ガジェット

Share on

  • Xでシェアする
  • Facebookでシェアする
  • このエントリーをはてなブックマークに追加

CSS擬似クラス :has() でHTML/CSSスニペットを作る

  • Web制作ハウツー
  • フロントエンド(HTML/CSS)
CSS擬似クラス :has() でHTML/CSSスニペットを作る

今まで子要素の変化に対して親要素または祖先要素のスタイルを設定するためには、JavaScriptの設定が不可欠でした。しかし擬似クラス :has() の登場によりそれらは必要なくなりました。

:has()は、既存の擬似クラスやセレクタとも併用して使用できるため理解もしやすく、すぐに実装ができます。

今回は、擬似クラス :has() の使い方を、実用的な例をお見せしながら解説します。
実務で通じるHTML/CSSスニペットを作成していきましょう。

CSS擬似クラス :has() の便利なところ

:has() 特定の要素や条件を指定して親要素を取得し、スタイルを指定できます。

まずJavaScriptと比較して記述を見ていきましょう。
下記の方法で、id=”child”(子要素)からid=”parent”(親要素)を取得することができます。

【JavaScript】

  const child = document.getElementById("child");
  console.log(child.parentNode);

【CSS】

  #parent:has(#child) {}

子要素の変化に対して親要素のスタイルを変更する場合には、JavaScriptの記載に加えてCSSの記述も必要です。

classを取得するだけであれば単純な記載ですが、機能が複雑化していくと条件式が追加される場合もあります。 そのたびにJavaScriptとCSSを渡り歩くのは面倒ですし、メンテナンス性にかけます。
そのためスタイルの変化に対してCSSだけで完結できるのは、楽ですね。

さまざまな要素の取得

親要素の取得だけでなく、セレクタを使用して複雑な位置にある兄弟要素や隣接要素も取得できます。
さらにフォーム要素で多用する擬似クラス「:checked」の有無や、リストの個数の計算も可能です。
今までCSSで取得可能だった要素をそのまま条件として使用することができます。

:has() による実用的なHTML/CSSスニペット例

ここでは実用的なHTML/CSSスニペットをいくつかご紹介します。
取り上げるのはこちらです。

  • カードコンポーネント
  • フォームの変更
  • サイトカラーの変更
  • リンクの下線の有無を子要素で判断する

カードコンポーネント

カードのデザインは多岐にわたりますが、実装・運用面でつまづくのは以下のようなケースです。

  • 画像が設定されていない場合
  • リンク先がない場合
  • 異なるバリエーションのパーツが入る場合
  • カードの個数が増加した場合

これらを擬似クラス:hasで解決していきます。

カードコンポーネント

画像が設定されていない場合

  .card:not(:has(img)) {
      justify-content: flex-end; /* テキスト群を末尾に寄せる */
   }

補足:画像がない状態のカードを非表示にすることも出来ます。


リンク先がない場合

  .card:has(>a[href=""]) {
      pointer-events: none; /* クリック出来ないようにする */
  }

補足:aタグの有無によって矢印アイコン等のリンクのデザインの出し分けも可能です。


異なるバリエーションのパーツが入る場合

  .card:has(.card__button) {
      display: block;
      text-align: center;
  }

カードの個数が増加した場合

  .card__wrapper:has(.card:nth-child(2n)) .card{
    width: 50%;
  }
  .card__wrapper:has(.card:nth-child(4n)) .card{
    width: 25%;
  }

補足:グリッドレイアウトを使用すると親要素の指定だけで列の制御が可能です。

フォームの変更

項目がチェックされた時に表示させたいボタンや、変更したいデザインがある場合、これまではその都度、JavaScriptで親要素にclassを追加し変更を行ってきました。
同じことを擬似クラス :has() で実行することができます。


選択の有無によってリセットボタンを表示する

項目がcheckedされたときにリセットボタンを表示します。

選択の有無によってリセットボタンを表示する
  .btnReset{
    display: none;
  }
  .checkbox:has(input:checked) .btnReset{
    display: block;
  }

選択によって要素を表示または非表示にする

「other(その他)」を選んだら、解答欄を追加で出現させます。

選択によって要素を表示または非表示にする
  .form:has(option[value="renewal"]:checked) .renewalField {
    display: block;
  }
  .form .renewalField {
    display: none;
  }

サイトカラーの変更

サイトのテーマによって全体のカラーを変更できるようにしたいとき、CSS変数を使用して解決します。
テーマによってclass名のルールを予め決めておくと使い回しができるので便利です。

サイトカラーの変更
  :root{
    --color-1: black;
  }
  html:has(.typeRed){
    --color-1: red;
  }
  html:has(.typeBlue){
    --color-1: blue;
  }
  html:has(.typeRed) :is(header,footer){
    background-color: var(--color-1);
  }
  html:has(.typeBlue) :is(header,footer){
    background-color: var(--color-1);
  }

リンクの下線の有無を子要素で判断する

aタグ内にテキスト以外のHTML要素があるとき下線を表示しないようにしたい場合は、以下のように :has() を使用します。

リンクの下線の有無を子要素で判断する
  a { text-decoration: underline; }
  :is(a, button):has(*) {
    text-decoration: none;
  }

擬似クラス :has() を使用する時の注意点

:has() はFirefoxでは正式に対応していませんが、設定で有効にすることはできるため表示の確認ができます。
これは開発者用の操作となり標準装備されている機能ではありません。したがってモダンブラウザの対応が求められる案件には不向きな実装となります。(Firefox ver.115 時点)

おわりに

スタイルを変更する際、これまでは他の技術を経由してからの実装が常でした。idやclassの追加による表示の変更、styleをHTMLへの直接の記載など、見た目は正常でも管理が煩雑化していたのです。

しかし現在ではCSSのみで変更したい対象を捉えるだけでなく、HTMLの動作に合わせた実装を施すことが可能となりつつあります。変更するファイルが1つのため運用の面でも、とくに優れた技術になると思います。

WEB上での表現の幅が広がるだけでなく、もっと多くのデザインと実装方法が生まれてくるでしょう。
その時々の環境に合わせた最適な実装方法を常に考慮して対応を心がけていきたいです。

クーシーブログ編集部

この記事を書いた人

クーシーブログ編集部

1999年に設立したweb制作会社。「ラクスル」「SUUMO」「スタディサプリ」など様々なサービスの立ち上げを支援。10,000ページ以上の大規模サイトの制作・運用や、年間約600件以上のプロジェクトに従事。クーシーブログ編集部では、数々のプロジェクトを成功に導いたメンバーが、Web制作・Webサービスに関するノウハウやハウツーを発信中。

お問い合わせはこちらから

Web制作デザイン、丸ごとお任せ

お問い合わせする

2023/08/29

テキスト:佐々木香苗 デザイン: 津畑クミ

Share on

  • Xでシェアする
  • Facebookでシェアする
  • このエントリーをはてなブックマークに追加
お問い合わせはこちら

フロントエンド(HTML/CSS)の関連記事はこちら

  • ScrollTriggerで途中から横スクロールさせる方法【GSAP入門】

    この記事では、スクロールすると画面が横に推移していくページをサンプルに「GSAP(ジーサップ)」と、その拡張機能である「ScrollTrigger」の基本や導入についてご紹介していきます。

    • フロントエンド(HTML/CSS)
  • 【初心者向け】CSSとは?基本をわかりやすく3分で解説

    「CSS」とは、HTMLを装飾する言語のことです。「CSS」の基本から書き方まで初心者でもわかる簡単な言葉で解説します。

    • フロントエンド(HTML/CSS)
  • Three.jsの使い方!3DモデルをWeb上で表示させる8ステップ

    Three.jsを使って3DモデルをWeb上に表示させるまでの具体的な流れや、活用事例などをまとめました。

    • フロントエンド(HTML/CSS)
    • Web最新トレンド
  • 【初心者向け】HTMLとは?基本をわかりやすく3分で解説

    「HTML」とは、ウェブページの構造を作る言語のことです。「HTML」の基本から書き方まで初心者でもわかる簡単な言葉で解説します。

    • フロントエンド(HTML/CSS)
  • 【Figma】現役コーダーが開発モード(Dev mode)を実務視点で使ってみた

    今回は、Figmaの「開発モード(Div mode)」に注目し、実務で活用できそうなのか、試してみます。

    • WebデザインTips
    • フロントエンド(HTML/CSS)
  • CSSスクロールアニメーションを使った魅力的なデザインの実装方法

    スクロールアニメーションとはスクロール量に合わせてアニメーションをつけることです。この記事ではCSSで実装できる方法についてご紹介しています。

    • WebデザインTips
    • フロントエンド(HTML/CSS)
  • CSS設計はどれがいい?4種の設計手法をわかりやすく解説

    CSS設計とは、CSSのメンテナンス性や作業効率化のためのコードの管理方法と、クラス名の命名規則の考え方のことをいいます。

    • フロントエンド(HTML/CSS)
  • 【2023年版】最新トレンドCSS7つをコード付きで解説します!

    JSがなくてもできる!進化した最新のトレンドCSSをいくつかご紹介します。

    • フロントエンド(HTML/CSS)
    • Web最新トレンド

COOSYの
制作実績

UIUXと美しさを両立させた、クーシーが誇る成功事例一覧。
課題解決のアイデア満載です。

制作実績を見る

Web制作の課題はクーシーが解決します

  • Web制作

    コーポレートサイト、採用サイト、ECサイトまで。最新AI技術を掛け合わせ、各サイトの特性に合わせたUIUX設計を実現します。

  • Webデザイン

    UIUXと美しさを両立し、ブランドを「カタチ」に。SEO・AIOも考慮した戦略的ビジュアルで目標達成を支援します。

  • UIUX設計

    人間中心設計で価値ある体験を創造。SEO・AIOにも貢献し、LTV向上につながる直感的な画面デザインを実現します。

CATEGORY LIST

  • すべての記事一覧

  • 目的別

    • 目的別TOP
    • コーポレートサイト
    • ECサイト
    • オウンドメディア
    • 採用サイト
    • プロモーション
    • Webサービス
    • LP
    • ブランディング・CI
  • Web制作ハウツー

    • Web制作ハウツーTOP
    • UIUX・サイト設計
    • WebデザインTips
    • PM/ディレクション
    • フロントエンド(HTML/CSS)
    • 撮影・動画編集
    • ライティング
    • CMS
    • Web制作ツール
    • イラスト
  • システム開発

    • システム開発TOP
    • プログラミング
    • EC構築
    • CMS開発・構築
    • サーバ構築
    • データベース構築
    • セキュリティー
  • Webサイト運用のコツ

    • Webサイト運用のコツTOP
    • サイト運用・管理・保守
    • コンテンツ運用
    • CRM(顧客管理)
  • Webマーケティング

    • WebマーケティングTOP
    • SEO対策・トレンド
    • コンテンツ制作・SEOライティング
    • アクセス解析
    • Web広告
    • Web集客ハウツー
  • 特集

    • 特集TOP
    • Web最新トレンド
    • カルチャー
    • ガジェット
  • WORKS

    Webサイト・アプリなどの
    様々な実例・制作実績のご紹介

    WORKS
  • CONTACT CONTACT

    Webサイトのご相談、お見積もりはこちらから

    Webサイトのご相談、お見積もりなど
    お気軽にお問い合わせください

ホーム

  • TOP
  • COOSY BLOG
  • CSS擬似クラス :has() でHTML/CSSスニペットを作る
ページトップへ
  • TOP
  • SERVICE

    • ブランディング
    • デジタルマーケティング
    • 戦略企画
    • DX推進・システム開発
    • グローバル展開
    • Web制作
  • WORKS

    • コーポレートサイト
    • 採用サイト
    • ECサイト
    • プロモーションサイト
    • サービスサイト
    • システム開発
  • ABOUT

    • 会社情報
    • 私たちが大切にしていくこと
    • お知らせ
    • クーシーラボ 岩手
    • ロンドン支社
    • ミャンマー支店
  • RECRUIT

    • ディレクション部
    • デザイン部
    • システム開発部
    • アカウント・プランニング部
    • Webマーケティング事業部
    • 人事・総務部
    • オフショア
    • グローバル事業部
  • BLOG

    • 目的別
    • Web制作ハウツー
    • システム開発
    • Webサイト運用のコツ
    • Webマーケティング
    • 特集

COOSY SNS

  • facebook
  • X
  • お問い合わせ
  • Privacy policy
  • Site Policy
  • Security Policy
© COOSY All Rights Reserved.