最近のCSSは進化が早い! モダンCSSの新機能、ブラウザのサポートが充実した機能のまとめ
Post on:2024年1月24日
最近のCSSは進化が早く、またブラウザはエバーグリーン(自動で最新版にアップデートするブラウザ)になり月一ペースでアップデートされ、モダンCSSの機能もたくさんサポートされました。
CSSの新機能をはじめ、ブラウザのサポートが充実した機能を紹介します。2024年はこれらのモダンCSSを使用する機会が増えますね。

- :has()疑似クラスがすべてのブラウザにサポートされました
- CSSのコンテナクエリ
- CSSのスタイルクエリ
- CSSのネスト
- CSSの@scopeはセレクタの適用範囲を設定できる
- CSSで三角関数が使用できるようになった
- スクロールをトリガーにしたアニメーションの実装が大きく変わる
- 今までは面倒だったことが簡単に実装できるようになった新機能
- 知っておくと便利なCSSの知識とテクニック
- HTML関連も少しだけ
:has()疑似クラスがすべてのブラウザにサポートされました
まずは、:has()
疑似クラスがすべてのブラウザにサポートされました。今まではFirefoxを除くすべてのブラウザにサポートされていましたが、2023年12月19日にリリースされたFirefox 121(リリース情報)で、:has()
疑似クラスがサポートされました。
今年は、:has()
疑似クラスを使用する機会も増えそうです。

:has()
疑似クラスを使用するとさまざまなセレクタを条件式のように記述できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
/* figcaptionがあるfigure要素を選択 */ figure:has(> figcaption) { ... } /* svgの直接の子孫がないa要素を選択 */ a:not(:has(> svg)) { ... } /* inputの直接の兄弟があるlabel要素を選択 */ label:has(+ input) { … } /* 子孫のimgにaltがないarticle要素を選択 */ article:has(img:not([alt])) { … } /* DOM内で何らかの状態が存在するdocumentElementを選択 */ :root:has(.menu-toggle[aria-pressed=”true”]) { … } /* 子の数が奇数の.containerを選択 */ .container:has(> .container__item:last-of-type:nth-of-type(odd)) { ... } /* ホバーされていないグリッド内のすべてのアイテムを選択 */ .grid:has(.grid__item:hover) .grid__item:not(:hover) { ... } /* カスタム要素<todo-list>を含むコンテナを選択 */ main:has(todo-list) { ... } /* 直接のhrの兄弟があるp要素内のすべてのa要素を選択 */ p:has(+ hr) a:only-child { … } /* 複数の条件を満たすarticle要素を選択 */ article:has(>h1):has(>h2) { … } /* h1の後にh2が続くarticle要素を選択 */ article:has(> h1 + h2) { … } /* インタラクティブな状態が発生したときに:rootを選択 */ :root:has(a:hover) { … } /* figcaptionがないfigureに続くp要素を選択 */ figure:not(:has(figcaption)) + p { … } |
詳しくは、CSSの:has()疑似クラスの便利な使い方のまとめをご覧ください。
ほかにも、いろいろ便利なスタイルを:has()
疑似クラスで定義できます。

知っておくと便利なCSSのセレクタ! :has()疑似クラスを使用すると、子の数に基づいて親要素のスタイルを定義できる
CSSのコンテナクエリ
CSSのコンテナクエリが登場したのは2022年ですが、2023年2月にすべてのモダンブラウザの安定版でサポートされました。
コンテナクエリは今までのメディアクエリのスクリーンベースではなく、親コンテナをベースにして子要素のスタイルを定義できます。レイアウトやコンポーネントだけでなく、レスポンシブ対応のフォントサイズにも大活躍です。

CSS コンテナクエリの準備はできてる? 安定版のブラウザにサポート、ポリフィルも大幅にアップデートされました
コンテナクエリで実装する最初のステップは、container
プロパティを追加することです。コンポーネントは親の幅に応じて変化するので、ページ全体ではなく、影響を受けるエリアのみを再描画するようにブラウザに伝える必要があります。

CSS コンテナクエリ(@container)の基礎知識と便利な使い方を解説
さらにコンテナクエリは、:has
疑似クラスを使用すると強力になります。
- レスポンシブの実装が今までと変わる! CSSの新機能コンテナクエリと:has()疑似クラス、最初に理解しておきたい基礎知識を解説
- CSSのコンテナクエリと:has()擬似クラスを使用すると、こんなことができるようになる
CSSのスタイルクエリ
コンテナクエリだけでなく、CSSのスタイルクエリも2023年にすべてのモダンブラウザの安定版でサポートされました。スタイルクエリとは、親要素のスタイルに応じて子要素のスタイルを設定できる新機能です。
親要素のサイズによるクエリはコンテナクエリですが、スタイルクエリは親要素のスタイル値によるクエリになるため、たとえば複数のバリエーションを持つ再利用可能なコンポーネントが簡単に実装できます。

CSSのスタイルクエリの基礎知識と使い方を解説、親要素の「スタイル」に応じて子要素のスタイルを適用
スタイルクエリを使用したUIコンポーネントの実装例などは、下記をご覧ください。

CSS スタイルクエリ(@container style())の基礎知識と便利な使い方を解説
CSSのネスト
そして、CSSのネストもすべてのモダンブラウザの安定版でサポートされました。
ネストはSassなどのCSSプリプロセッサですでに使用している人も多いと思いますが、CSSのネストは仕様が少し異なります。とは言え、CSSでネストが使用できるようになるのは、嬉しいことですね。
CSSのネストは、セレクタを繰り返す必要性を減らし、関連する要素のスタイルルールを同じ場所に配置することで、デベロッパーを支援します。

CSSのネストがついにブラウザで使用できるようになった! 基礎知識、便利な使い方を詳しく解説
また、Chrome 120でCSSネストがより分かりやすい構文もサポートされ、記述方法が簡単になりました。

CSSの@scopeはセレクタの適用範囲を設定できる
CSSのネストもこれまでの記述方法が大きく変わるものですが、@scope
も記述方法に大きな影響を与える新機能です。
たとえば、下記のHTMLにはimg
が2つあります。@scope
を使用すると、1つ目の.media-object
直下のimg
にのみスタイルを適用できます。.content
内のimg
はターゲットにされません。

CSSの新機能@scopeが便利すぎる! セレクタの適用範囲を設定できる、@scopeの基礎知識と使い方
上記のように上限と下限があるスコープは、ドーナツスコープ〔donut scope〕と呼ばれます。また、@scope
で使用するセレクタの詳細度は、含まれるセレクタの詳細度に影響を受けません。詳しくは、下記をご覧ください。

CSS @scopeの基礎知識と使い方を解説、セレクタの適用範囲を設定できる
CSSで三角関数が使用できるようになった
2023年、CSSの大きな話題の一つが三角関数が使用できるようになったことです。今まではcalc()
関数をはじめ、min()
, max()
, clamp()
などの関数でしたが、ついに三角関数もChrome, Edge, Safari, Firefoxのすべてにサポートされました。
CSSで使用できる三角関数は、sin()
, cos()
, tan()
, asin()
, acos()
, atan()
, atan2()
です。

2023年はCSSで三角関数「sin(), cos(), tan()」が主要ブラウザのすべてで使用できるようになるぞ!
CSSで三角関数をどこに使うのか。たとえば、今まではかなり複雑なCSSやJavaScriptが必要だった斜めのレイアウトがシンプルなCSSで実装できます。ほかにも、要素を円軌道で移動させたり、メビウスの輪なんかも実装できます。また、かなり高度になりますが、CSSの三角関数でスクリーンサイズやフォントサイズを取得することもできます。

CSSの三角関数(sin(), cos(), tan())の基礎知識と基本的な使い方を解説
- これは覚えておきたい! CSSの三角関数で斜めのレイアウトを実装するテクニック
- CSSだけでスクリーンサイズやフォントサイズを取得、CSSの三角関数tan(atan2())はcalc()ではできない計算もできる
スクロールをトリガーにしたアニメーションの実装が大きく変わる
スクロールをトリガーにしたアニメーションは、Appleの新製品発表ページをはじめ多くのランディングページで見かけます。このスクロールをトリガーにしたアニメーションの実装方法が、Chrome 115で実装されたScroll-driven Animationsで大きく変わりました。
スクロールすると要素がアニメーションで表示されたり、スクロール量で変化するインジケーター、背景が変化するパララックスなど、実装がそれなりに手間がかかりましたが、数行のコードで実装できるようになります。

CSSでの実装が大きく変わる! Scroll-driven Animations スクロールをトリガーにしたアニメーションを実装する方法
Scroll-driven Animationsの実装に役立つツールやさまざまな実装方法の解説がリリースされています。

スクロールをトリガーにしたCSSアニメーションを視覚化し、デバッグが簡単にできるデベロッパーツールの機能拡張
今までは面倒だったことが簡単に実装できるようになった新機能
今までは面倒だったことがCSSで簡単に実装できるようになった新機能もたくさんあります。
CSSのサブグリッド(subgrid
)を使用すると、下記のように子要素(画像・見出し・テキスト)の水平グリッドも簡単に揃えることができます。

CSSのsubgridがすべてのブラウザにサポートされたので、カード内の見出しやテキストを簡単に揃えることができます
新しい関数light-dark()
を使用すると、ライトモードとダークモードのスタイルを簡単に定義できるようになります。

CSSでライトモードとダークモードのスタイルを簡単に定義できる、新しい関数「light-dark()」が便利すぎる!
テキストが複数行のときに、行ごとの文字数を同じにしてバランスを自動調整するCSSの新機能「text-wrap: balance;
」も便利です。

CSSの新機能! テキストの行のバランスを自動調整する「text-wrap: balance;」の基礎知識と使い方
今まではJavaScriptを使用しないとできなかったことが、たった1行のCSSで簡単に実装できるようになりました。フォームのtextarea
に文字を入力すると、その文字量に合わせてサイズを自動で変更してくれます。

CSSの新しいプロパティ「form-sizing: content;」が便利! フォームのサイズを入力された文字量に合わせて自動変更
知っておくと便利なCSSの知識とテクニック

CSSの知っておくと便利なフクロウセレクタの使い方! 要素を積み重ねる時のマージンにかなり便利です

CSSで角丸を美しく実装するテクニック、ネストされた外側と内側を相対角丸の美しいバランスで実装

CSSの論理プロパティの使い方を徹底解説、margin-block-start, margin-inline-endなど

朗報! CSS Flexboxの8年越しのバグがようやく修正されます

CSSって難しい! セレクタ「.a .b .c」と「.a :is (.b . c)」は同じに見えるけど実は違う、ブラウザはセレクタを右から左に読む

CSS Flexboxでアイテムを左と右の両端揃えにする実装テクニック

CSSのみで、フォームの入力時にフロートする入力欄のラベルを実装するテクニック


CSSはこんなにも進化していたのか! CSSのかなり高度なテクニック -Expert CSS: The CPU Hack
HTML関連も少しだけ

2023年最新版: HTMLのheadの書き方、head内に記述する要素の総まとめ
- HTMLにsearch要素が追加されたぞ!
- HTMLメールの最近の実装方法を解説、tableは不要になりました
- これはすごい! HTMLの新機能、popover属性でポップオーバーがJavaScript無しで簡単に実装できるようになります
- HTMLにおける自己終了タグの使用、歴史的背景、使用に対する賛否両論

地味だけど嬉しい新機能! フォームのセレクトボックスで区切り線にhrを使用できるようになりました

sponsors