CSSは不思議な世界です。昨日までの正解が、今日も正解とは限らない。 ただし安心してください。全部を追いかける必要はありません。 「よく出るやつ」から順番に覚えると、制作スピードと保守性がちゃんと上がります。
この記事は、現場で出番が多い最近のCSSを5つに絞って、なぜ今の書き方に更新した方が良いのか、どう書くのか、メリットとデメリットまでまとめたものです。 流し読みでも拾えるように、結論と使いどころを先に置きます。
先に結論 まず覚えるならこの5つ
- inset: absoluteのtop right bottom leftを1行で
- min() max(): 最大値や最小値の制御を1行で
- clamp(): レスポンシブの調整をメディアクエリ地獄から救う
- :is() :where(): セレクタ整理と詳細度コントロール
- auto-fit auto-fill: Gridのレスポンシブを賢く自動化
この5つは「知っているだけで差が付く」タイプです。 別に最先端マウントのためではなく、手戻りを減らすために効きます。
なぜ止める必要があるのか 昔の書き方が引き起こす3つのコスト
コスト1 行数が増えるほどミスは増える
CSSは改行の数だけ人が死ぬわけではありませんが、行数の分だけ見落としは増えます。 topとleftは直したのにbottomだけ直していない、max-widthを変えたのにwidthを変え忘れた。 こういう小さな事故が積もると、納期が静かに溶けます。
コスト2 メディアクエリの増殖で設計が崩れる
レスポンシブの調整をメディアクエリで全部解決しようとすると、ブレイクポイントが増えます。 増えると何が起きるか。優先順位が分からなくなります。 結果として「この画面幅だけ崩れる」という幽霊が現れます。
コスト3 詳細度バトルで保守が地獄になる
特にチーム案件やWordPress案件で起きがちです。 後から来た人が、どこを触れば直るのか分からない。 仕方なく強いセレクタを書き足して、さらに分からなくなる。 このループを止めるのが:is()と:where()です。
つまり、最近のCSSは派手な新機能というより「事故を減らす道具」です。
1 insetでposition指定をスッキリさせる
親要素いっぱいにabsolute要素を広げたい。バナーのリンク領域、背景の疑似要素、モーダルのオーバーレイ。 ほぼ毎週どこかで書きます。
昔の書き方
.overlay {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
}
最近の書き方 inset
.overlay {
position: absolute;
inset: 0;
}
4行が1行になります。単純ですが効果は大きいです。 insetはショートハンドなので、上右下左をまとめて指定できます。
個別指定もできる
.box {
position: absolute;
inset: 10px 20px 30px 40px; /* 上 右 下 左 */
}
メリット
- 書き忘れが減る
- 可読性が上がる
- 意図が伝わりやすい
デメリットと注意
- positionがstaticだと効かない。position指定が前提
- チームで慣れていないと最初は読み替えが必要
ただ、慣れのコストはすぐ回収できます。今日から置き換えて良い系です。
2 min() max()でサイズ制御を1行で終わらせる
「これ以上大きくしたくない」「これ以上小さくしたくない」。 この2つがUIの8割です。残り2割はデザイナーの気分です。
min() 小さい方を採用する
最大値の天井を作りたいときに効きます。 典型はコンテンツ幅です。
.container {
width: min(100%, 960px);
}
画面が狭いときは100%で伸び、広いときは960pxで止まります。 昔ならmax-widthとwidthの2行になりがちでした。
max() 大きい方を採用する
最小サイズの保証に使えます。例えばボタンが潰れるのを防ぎたいとき。
.button {
inline-size: max(12rem, 40%);
}
40%が小さくなりすぎても、12remは守られます。
メリット
- 2行の指定を1行にできることが多い
- 絶対値と相対値のいいとこ取りが簡単
- メディアクエリが減りやすい
デメリットと注意
- 慣れないと直感で読みにくい。minは最大値っぽく使う場面がある
- 複雑な式にするとチーム内の共有が必要
おすすめは、まずは「幅の上限」「余白の下限」みたいな分かりやすい用途で使うことです。
3 clamp()でレスポンシブ調整を楽にする
clampは、レスポンシブを一気に楽にする関数です。 値を「最小」「理想」「最大」で挟み込みます。 メディアクエリを増やす前に、まずclampで済まないか考えるのが良いです。
基本の形
font-size: clamp(1rem, 2vw, 1.5rem);
画面が小さいときは1remを下回らず、画面が大きくなっても1.5remを超えません。 真ん中の2vwが「理想」枠として働きます。
よくある実務例 タイトル文字のサイズ
.title {
font-size: clamp(1.25rem, 1rem + 1vw, 2rem);
line-height: 1.2;
}
「スマホだと大きすぎる」「PCだと小さすぎる」を1行で潰しにいけます。
メリット
- ブレイクポイント依存を減らせる
- デザインの意図を保ったまま自然にスケールする
- 調整対象が増えても式の再利用が効く
デメリットと注意
- 式が雑だと意図しないサイズになる。計算の確認が必要
- チームで基準(最小と最大)を決めないとバラバラになりやすい
対策はシンプルです。プロジェクトで「フォントサイズの下限と上限」だけ先に合意しておく。 これでclampは暴れません。
4 :is()と:where()でセレクタ整理と詳細度をコントロールする
CSSが読みにくくなる理由の一つが、セレクタの重複です。 同じ指定を複数箇所に書いて、後で直す時に漏れる。 これを減らすのが:is()と:where()です。
:is() 複数要素をまとめる(詳細度は引き継ぐ)
.hero :is(h1, h2, p) {
color: #fff;
}
heroの中のh1 h2 pにまとめて指定できます。 ただし:is()は中で最も強いセレクタの詳細度を引き継ぎます。
:where() 複数要素をまとめる(詳細度は常に0)
.article :where(h1, h2, h3, p, ul, ol) {
margin-block: 0;
}
:where()は詳細度が常に0です。 リセットCSSや、後から上書きしやすいベーススタイルに向いています。
実務で効く使い分け
- コンポーネント内でまとめたい -> :is()
- ベースを作って上書き余地を残したい -> :where()
メリット
- 重複が減る。直す場所が減る
- 詳細度の意図を設計に組み込める
- メンテの心理的負担が減る
デメリットと注意
- :is()は詳細度が上がる可能性がある。強いセレクタを入れすぎない
- 濫用すると逆に読みづらい。まとめるのは繰り返しが多い所だけ
おすすめは「繰り返し3回以上」を目安にまとめることです。 2回ならまだ許す。3回はもう:is()か:where()で救ってあげる。
5 auto-fit auto-fillでGridを柔軟にする
Gridのrepeatでauto-fit auto-fillを使うと、カードレイアウトが急に賢くなります。 列数を固定せず、入るだけ並べて、足りなければ自動で折り返す。 しかもコードは短い。強いです。
鉄板の組み合わせ repeat + minmax
.cards {
display: grid;
gap: 16px;
grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
}
240pxを下限に、入るだけ並び、余った分は1frで伸びます。 レスポンシブカードの定番です。
auto-fitとauto-fillの違い ざっくり
- auto-fit: 空き枠を潰して詰める。見た目がギュッとまとまりやすい
- auto-fill: 枠を維持しやすい。幅が安定しやすい
迷ったら「詰めたいならauto-fit」「枠を守りたいならauto-fill」でまずOKです。 細かい違いは案件のUIを見て選べば大丈夫です。
メリット
- ブレイクポイントを減らせる
- カード数が増減しても崩れにくい
- レイアウトの意図がコードで伝わる
デメリットと注意
- minmaxの下限が雑だと、狙いと違う折り返しになる
- 古い設計のGridだと導入に少し整理が必要
対策は、カードの最低幅をちゃんと決めることです。 デザイン上「これ以下は読めない」というラインを下限に置くと事故が減ります。
まとめ 最近のCSSはテクではなく保守の武器
今回の5つは、どれも派手さはありません。 でも実務のストレスを確実に減らします。
- insetで位置指定の事故を減らす
- min maxで幅と余白の指定を短くする
- clampでレスポンシブの調整を滑らかにする
- :is :whereでセレクタの重複と詳細度バトルを減らす
- auto-fit auto-fillでGridのレスポンシブを自動化する
全部を一気に完璧にしなくてOKです。 まずは今の案件で1つだけ入れる。これで十分に伸びます。
最後に この記事と相性が良い次の一手
ここからはオマケです。今回の5つを使い始めると、次に気になるものが出てきます。 現場で役に立つ順に並べます。
コンテナクエリ レスポンシブの発想が変わる
画面幅ではなく、コンポーネントの幅でスタイルを切り替える考え方です。 Gridやカードレイアウトと相性が良く、デザインシステム系の案件で特に効きます。
:has() 条件付きスタイルの表現力が上がる
親要素を条件で選べるので、JSでクラスを付ける回数が減る場面があります。 ただし使いどころは選びましょう。万能ではありません。
prefers-reduced-motion アニメを優しくする
動きのあるUIを作るなら、reduce設定の尊重は今や基本です。 派手さよりも「誰でも使える」が評価される時代です。
プロジェクトに落とし込むコツ
- まずはinsetとmin maxから導入する。置き換えが簡単で効果が出やすい
- clampは設計(下限と上限)を決めてから使う
- :is :whereは重複3回以上を目安に導入する
- Gridはrepeat auto-fit minmaxをテンプレ化してしまう
CSSは頑張るほど良いというより、整えるほど強いです。 今日のあなたの1行が、来月のあなたの睡眠を守ります。
