CSSCSS @container scroll-state()クエリ:JavaScriptなしでスクロール位置を検出
CSS scroll-stateクエリは、コンテナが自身のスクロール状態を子要素に宣言的に公開し、JavaScriptのIntersection Observerやscrollイベントリスナーを置き換えます。Chrome 133ではstuck、snapped、scrollableの3つの状態が実装され、Chrome 144では最新のスクロール方向を追跡するscrolled状態が追加されました。これにより、スクロールダウン時にヘッダーを非表示、スクロールアップ時に表示するといったパターンを@container scroll-state(scrolled: bottom)ルールだけで実装できます。使用するには、スクロールの祖先要素にcontainer-type: scroll-stateを設定する必要があり、現在はChromeのみの対応のためprogressive enhancementが推奨されます。
Read Articlearrow_forward Video · CSS31:24
dialog要素で数分でモーダルを作る
ネイティブHTML <dialog>要素は、フォーカストラップ、Escapeキーによる閉鎖、閉じた状態でのdisplay: noneをデフォルトで提供し、カスタムオーバーレイの実装を置き換えます。.showModal()はブラウザのtop layerに昇格させてz-indexの競合を完全に排除し、.show()はチャットウィジェットのように背景との操作が必要な非モーダル用途で使用します。CSSリセットでmargin: 0を設定するとデフォルトのmargin: autoによる中央揃えが崩れ、<dialog>要素に直接display: gridを適用するとopen/closeが機能しなくなるため、必ずdialog[open]セレクターに適用する必要があります。::backdrop疑似要素で背景のdimmingをカスタマイズでき、scrollbar-gutter: stableでスクロールバー切り替え時のレイアウトシフトを防げます。
AI_INFOGRAPHICWATCH_VIDEOarrow_forwardArticle · CSSREAD TIME: 3m
匿名@layerで複数ルールの詳細度を一度に下げる
リセットスタイルシートのルールを匿名の@layer {}ブロックで囲むことは、すべてのセレクターを:where()でラップするよりも可読性の高いspecificity低減方法です。cascadeでは、layeredルールは常にunlayeredルールよりも優先度が低いため、ソース順に関わらずユーザースタイルシートのルールが匿名layerの宣言を上書きします。すでに名前付き@layerブロックを使用している場合は、後に定義されたlayerが優先されるため、匿名layerは必ず最初に宣言する必要があります。匿名(名前なし)layerを使用することで、サードパーティが含む名前付きlayerが既存の@layer first, reset, base, components宣言の順序を変えてしまう衝突を防げます。
READ_FULL_LOGarrow_forwardArticle · CSSREAD TIME: 2m
CSS @scopeとMixin — Winging It エピソード28
OddBirdのポッドキャストエピソードで、Chris Coyierとともに2つのCSS機能を取り上げます。まず、2025年末にFirefoxがサポートを追加してすべての主要ブラウザで利用可能になった@scopeの実用的なユースケースを検討します。次に、Miriam Suzanneが開発中のCSS mixins仕様について議論し、@contentブロックがSassのmixinと同様に動作する仕組みを探ります。@content対@contentsの命名問題や、CSSがプログラマブルでコンポーネント対応の言語へと向かう方向性についても取り上げています。
READ_FULL_LOGarrow_forwardArticle · レイアウトREAD TIME: 34m
CSSレイアウトの基礎を理解する
CSSレイアウトは、すべてのアルゴリズムが拡張する少数のコアモデルの上に構築されています:normal flow(blockは縦に積み重なり、inlineは横に流れる)、box model(content-box対border-box)、whitespaceによるanonymous boxの生成、兄弟要素や親/子間のmargin collapse(display: flow-rootやoverflow: autoで防止可能)、inline要素のbaseline揃え、position: absoluteのoffset parentチェーン、そしてstacking contextがあります。Flexboxは要素をbottom-upで配分し、GridはあらかじめHTMLで定義されたエリアにtop-downで配置します。高さが指定されたblock要素にplace-content: centerを適用することが、現代的な垂直センタリングの最もシンプルな解法です。
READ_FULL_LOGarrow_forwardArticle · CSSREAD TIME: 10m
CSS Anchor Positioningのフォールバック:収まらないときの対処法
CSS anchor positioningのfallbackシステムは、ツールチップやドロップダウンがビューポートからはみ出す際に、JavaScriptなしで自動的に位置を再設定します。position-try-fallbacksプロパティはflip-block、flip-inlineなどのフリップキーワードや@position-try at-ruleをカンマ区切りで列挙し、順番に試行します。@position-try at-ruleでは別のposition-anchorターゲットやmax-block-sizeによるカスタムサイズ調整が可能ですが、positioning関連のプロパティのみ使用できます。position-try-order: most-block-sizeは複数のfallbackが適合する場合に最も多くの垂直スペースを確保できる位置を選択し、オーバーフロー発生時だけでなく初期表示時にも評価されます。
READ_FULL_LOGarrow_forwardsummarizeDigest_Summary
今週のCSSカバレッジは一つのテーマに収束しています。かつてJavaScriptが必要だった動作を、ブラウザがますます自前で処理できるようになっているということです。注目アイテムであるBrecht De RuyteによるCSS @container scroll-state()クエリの詳解が最も明確な例です。Chrome 144の新しいscrolled状態を使えば、@container scroll-state(scrolled: bottom)ルール一つで、JavaScriptゼロのスクロールダウン時ヘッダー非表示パターンが実装できます。Chrome 133で導入されたstuck・snapped・scrollable状態を基盤としていますが、現在はChrome限定のためprogressive enhancementが推奨されます。Kevin Powellのネイティブ<dialog>要素の動画も同じ文脈です。.showModal()がブラウザのtop layerに昇格させてz-indexの競合を完全に排除し、組み込みのフォーカストラップとEscapeキーによる閉鎖が数百行のカスタムオーバーレイコードを置き換えます。
精密なポジショニングも詳しく取り上げられています。Schalk NeethlingのCSS anchor positioningのfallbackシステムガイド — position-try-fallbacks、名前付き@position-try at-rule、position-try-order: most-block-size — は、ツールチップやポップオーバーがJavaScriptによる計測なしに自動的に位置を再調整する仕組みを示しています。Manuel Matuzovićはリセットスタイルシートを匿名@layer {}ブロックで囲む洗練されたcascadeテクニックを紹介します。これにより全てのunlayeredルールよりspecificityが低くなり、セレクターごとに:where()で包む冗長なパターンをすっきりと置き換えられます。
言語の未来を見渡すと、OddBirdのポッドキャストでMiriam SuzanneとChris Coyierが、2025年末のFirefoxサポートによりクロスブラウザとなった@scopeと、@contentブロックを活用したネイティブCSS mixins仕様を探っています。Polypaneの包括的なCSSレイアウト基礎解説は、normal flow・box model・margin collapse・stacking contextなど全レイアウトアルゴリズムの土台となるメンタルモデルを整理し、高さを指定したblock要素にplace-content: centerを適用することが現代的な垂直中央揃えの最もシンプルな解法だと結論づけています。
Key Takeaways- CSS scroll-stateクエリ(scrolled、stuck、snapped、scrollable)により、ChromeでJavaScriptのscrollリスナーを宣言的なcontainerクエリに置き換えられますが、ブラウザサポートが広まるまでprogressive enhancementが不可欠です。
- ネイティブ<dialog>要素のtop layer昇格とanchor positioningのfallbackシステムにより、レイアウトのためにJavaScriptを使う最も一般的な2つのパターンが不要になります。
- 匿名@layerブロックは、リセットスタイルシートのspecificityを下げるための:where()パターンより、cascade全体で衝突の少ない洗練された代替手段です。