モダン CSS アーキテクチャ:カスケードレイヤー、ネスト、そして @property
ウェブプロジェクトが成長するにつれ、CSS の管理は大きな課題となります。長年、私たちはグローバルスコープ、詳細度、コードの整理といった問題を解決するために、Sass などの外部ツールや BEM などの手法に頼ってきました。
しかし、CSS は進化しました。現在では、これらの機能をブラウザが直接提供するネイティブな機能が備わっており、パフォーマンスの向上とより深い統合が可能になっています。
1. カスケードレイヤー (@layer):詳細度戦争の終結
カスケードは CSS の核心ですが、同時に悩みの種でもあります。複数のスタイルが同じ要素に競合する場合、詳細度の高い方が優先されます。そのため、サードパーティ製ライブラリを上書きするためにクラスを追加し続けたり、!important を多用したりすることがよくありました。
カスケードレイヤーを使用すると、スタイルのグループごとの優先順位を明示的に定義できます。
レイヤーの定義方法:
@layer reset, base, components, utilities;
@layer base {
a { color: blue; }
}
@layer components {
/* セレクターの詳細度が低くても、このレイヤーが 'base' に勝ちます! */
.nav a { color: red; }
}
ファイルの先頭で順序(reset, base, components, utilities)を定義することで、セレクターの複雑さに関係なく、「utilities」が常に「components」に優先されるように確実な管理ができます。
2. ネイティブ CSS ネスト:Sass はもう不要?
10 年以上にわたり、ネストは Sass などのプリプロセッサを使用する最大の理由でした。今では、すべての主要なブラウザでネイティブにサポートされています。
ネイティブネストの構文:
.card {
background: white;
padding: 1rem;
& .title {
font-size: 1.5rem;
font-weight: bold;
}
&:hover {
border-color: blue;
}
@media (min-width: 600px) {
padding: 2rem;
}
}
ネイティブネストはコードの重複を減らし、関連するスタイルをまとめます。何より、コンパイルステップが不要なため、開発ワークフローが高速化されます。
3. @property:型安全な CSS 変数 (Houdini)
標準の CSS 変数 (--variable) は素晴らしいですが、ブラウザはそれらを単純な文字列として扱います。そのため、グラデーションや特定の数値を簡単にアニメーションさせることはできませんでした。
@property ルール(Houdini API の一部)を使用すると、カスタムプロパティを特定の型、初期値、継承動作とともに「登録」できます。
グラデーションのアニメーション:
@property --angle {
syntax: '<angle>';
initial-value: 0deg;
inherits: false;
}
.rotating-gradient {
background: conic-gradient(from var(--angle), red, blue);
transition: --angle 2s linear;
}
.rotating-gradient:hover {
--angle: 360deg;
}
ブラウザが --angle を(単なる文字列ではなく)実際の「角度」として理解するため、数値を補間して、以前は純粋な CSS 変数では不可能だった滑らかなアニメーションを作成できます。
4. テーマ設定のための CSS カスタムプロパティ
@property は型安全性を追加しますが、標準のカスタムプロパティは依然として動的なテーマ設定の王道です。それらを color-mix() 関数や oklch() 色空間と組み合わせることで、単一の変数からカラーパレット全体を作成できます。
:root {
--brand-hue: 250; /* 青色 */
--primary: oklch(60% 0.15 var(--brand-hue));
--primary-light: oklch(90% 0.05 var(--brand-hue));
}
5. @counter-style によるリストのカスタマイズ
リストの標準的な点、丸、四角に飽きていませんか?@counter-style を使用すると、独自のナンバリングシステム、記号、接尾辞を定義できます。
@counter-style thumbs {
system: cyclic;
symbols: '👍' '👎';
suffix: ' ';
}
ul {
list-style: thumbs;
}
FAQ:よくある質問
Q: Sass の使用をやめるべきですか?
A: ネイティブネストとカスタムプロパティは、ほとんどの人が Sass を使う理由の約 80% をカバーしています。mixin、関数、複雑なループなどの高度な機能が必要ない場合は、純粋な CSS に移行できるでしょう。
Q: @layer は古いブラウザでサポートされていますか?
A: カスケードレイヤーは、2022 年初めからすべての常青ブラウザでサポートされています。古いブラウザでは無視されるため、サイトが依然として機能するように確保(プログレッシブエンハンスメント)する必要があります。
Q: なぜ単なる --var ではなく @property を使うのですか?
A: 変数をアニメーションさせたり、フォールバック値を提供したり、変数を特定の型(<color> や <length> など)に制限したりする必要がある場合に使用します。
ウェブの未来を構築する
モダン CSS は、グローバルで壊れやすいスタイルから、より構造化され、型定義され、モジュール化されたアーキテクチャへと移行しています。これらの新しいツールを採用することで、デバッグしやすく、読み込みの速いサイトを構築できます。
コードをモダン化してみませんか?CSS ネストコンバーター(近日公開予定)で、お使いの Sass がネイティブ CSS にどのように変換されるかを確認してみてください。