CSSセレクタのhasが便利すぎる件

hasというものを使うことによりこれまでjavascriptを使用しなければできなかったことがcssのみで実現できるようになったということで少し前に話題になっていた(といってももう2,3年くらい前)ので紹介します。

広告

要約

・hasは親要素に影響を与えられるなやつ

・jsでロジックを組んでいたことがCSSのみで実現!

hasってどんなやつ?

一言でいうと、親要素に影響を与えられるやつです。

親要素が子要素の状態を判定することにより、適用するスタイルを場合分けできます。

具体例

例えば、「子要素に <img> がある場合、親の <div> の背景を変更 」する場合を見てみましょう。

従来:

document.querySelectorAll("div").forEach(
  div => { 
    if (div.querySelector("img")) {
      div.style.backgroundColor = "yellow"; 
    } 
  }
);

以下のようなことをやってます

  • document.querySelectorAll(“div") で すべての <div> を取得
  • .forEach() を使って各 <div> に対して処理を実行。
  • div.querySelector(“img") を使って 子要素に <img> があるか確認
  • <img> があれば、その <div> の backgroundColor を yellow に変更。

hasの場合:

div:has(img) {
  background-color: yellow;
}

hasを使うと簡単ですねw

hasのブラウザの対応状態は?

Chrome・Edge・Safariでは2022年の段階で対応しており、2023年12月19日にFirefoxでもサポートされるようになったみたいです。つまりすべての主要ブラウザで使用できます。

参考

https://postd.cc/replacing-react-with-css

https://developer.mozilla.org/ja/docs/Web/CSS/:has

終わりに

これまで、やりたいことの割には複雑な実装が必要だったことが、hasで大幅に減ったのではないでしょうか?これからは安易にjsでロジックを組むのではなく、hasを意識的に使うようにしていきたいですね。

広告

プログラミング

Posted by ロク