CSS最新情報をキャッチアップ！「State of CSS 2022」で気になったもの

State of CSS 2022が公開されていましたので、自分なりに読み解いた中で気になったもののみ抜粋させていただきます。
英語に不慣れなため解釈が間違っている部分もあるかもしれないことをご容赦ください。
（2022 and beyond のものはこの後頑張ります）

https://web.dev/state-of-css-2022/

## ＠layer

CSSの優先位順位はclass、id、要素などセレクタの得点方式や記載が後のもの優先されるといったルールがあります。`@layer`は優先順位を先に定義することができます。
下記のコードでは詳細度を上げていても`utilities`に記載されている内容が反映されます。

```css
/* 後ろに記載したものが優先される */
@layer theme, layout, utilities;

@layer utilities { 
  .padding-sm {
    padding: 0;
  }

  .padding-lg {
    padding: 0;
  }
}


@layer layout {
  body #box .padding-sm {
    padding: 2rem;
  }

  body #box .padding-lg {
    padding: 5rem;
  }
}
```
ブラウザの検証ツールで確認したところ下記のような表示になりました。

![スクリーンショット 2022-05-12 11.49.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2656335/454ed099-f874-833c-7988-b86e9b80fcbc.png)

すでにChromeなどのモダンブラウザにも対応しているようです。

![スクリーンショット 2022-05-12 11.53.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2656335/5a56d741-a93b-7d5c-a9e6-9333dad7fd13.png)

## Container queries 
レスポンシブの実装でメディアクエリを使うとき、判定できるのはブラウザの画面幅だけでした。`container queries`はHTMLの要素単位での判定ができるようになります。
下記のコードでは偶数番目の`boxItem`が200px以下になると背景色が変更される想定です。（ブラウザ未対応のようで確認できませんでした）

```html
<div class="boxWrap">
  <div class="boxItem"></div>
  <div class="boxItem"></div>
  <div class="boxItem"></div>
  <div class="boxItem"></div>
</div>
```

```css
.boxWrap {
  display: flex;
  margin: 0 auto;
  max-width: 500px;
  flex-wrap: wrap;
  gap: 20px 4%;
}

.boxItem {
  width: 48%;
  height: 200px;
  container-type: inline-size;
  container-name: box;
  &:nth-of-type(even) {
    background: #ccc;
  }
  &:nth-of-type(odd) {
    background: #888;
  }
}

@container box (max-width: 200px) {
  .container-item {
    &:nth-of-type(even) {
      background: #222;
    }
  }
}
```

## accent-color
`accent-color`を設定するとフォームに設置する下記の要素に対して、もとのUAの表示を維持したまま色を揃えることができます。

- radio
- checkbox
- progress
- range

また、この設定はシステムのカラーにも適応するとのことなのでダークモードなどでの表示でもブランドカラーを維持して表示してくれるとのこと。

下記のキャプチャはMac Chromeでの表示です。

![スクリーンショット 2022-05-12 13.10.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2656335/939ee94a-9f0a-a4c2-d6ef-80faec94eca1.png)

iPhoneのChromeではこのようになりました。

![iphone.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2656335/e4f9fa56-ea10-c14e-3523-9062b78bfd93.png)

## hwb()

HWBカラー・モデルの色相（Hue）、白色度（Whiteness）、黒色度（Blackness）で入力できるプロパティです。

```css
/* hwb(色相 白色度 黒色度 / アルファ値); */
.box {
  height: 100px;
  width: 100px;
  hwb(200 75% 0%);
}

.box_sub {
  height: 50px;
  width: 50px;
  hwb(200 50% 0% / 0.8);
}
```
![スクリーンショット 2022-05-12 13.49.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2656335/25371d28-d8fa-6cb2-13a0-9a84733cd82e.png)

## Viewport units 
スマートフォンの画面いっぱいに高さを取ろうとしたときに`100vh`指定した場合に、アドレスバーなどの表示があると高さの指定がうまく行かなくなるので、JavaScriptを記述して対応していました。

https://coliss.com/articles/build-websites/operation/css/viewport-units-on-mobile.html

新たに追加される`dvh` `lvh` `svh` はこの問題をCSSのみで解決できるようです。

## :has()
親要素のセレクタから子要素に特定の要素があるかを判別できる擬似クラスです。少し前にも話題に上がっていたそうですが、まだブラウザ対応はsafariのみとなっているようです。

```css
/* .childを子要素に持つ.parentを選択 */
.parent:has(.child) {...}

/* aの直下にimgがある要素を選択 */
a:has(> img)　{...}
```

## 終わりに
私としては `Container queries` と `:has()` が待ち遠しいですね。
この後 2022 and beyond の内容も見ていこうと思います。