CSSにはここ数年で実用的になった便利な関数があります。ブラウザ対応が進み、現在は主要ブラウザすべてで使えるようになりました。
この記事では aspect-ratio・calc()・clamp()・min() / max() の4つをプレビュー+コード付きで解説します。
この記事でわかること
- aspect-ratio で縦横比をキープする方法
- calc() で異なる単位を混ぜて計算する方法
- clamp() で@mediaなしのレスポンシブサイズを実現する方法
- min() / max() で幅の上限・下限を指定する方法
なぜモダンCSS関数を使うのか
従来は アスペクト比の維持に padding-top ハックが必要だったり、レスポンシブなフォントサイズに複数の @media が必要でした。これらのモダンCSS関数を使うと、よりシンプルで意図のわかりやすいコードが書けます。
aspect-ratio(アスペクト比)
aspect-ratio: 16 / 9 を指定すると、幅を決めるだけで高さが自動で計算される。動画・サムネイル・アイコンの比率維持に最適。padding-top ハックを使う古い手法は不要になった。
.ratio-box { width: 50%; /* 幅だけ決めれば、高さは自動で計算される */ aspect-ratio: 16 / 9; /* 幅:高さ = 16:9 の比率を保つ */ } /* 他によく使う比率 */ .square { aspect-ratio: 1 / 1; } /* 正方形 */ .four-three { aspect-ratio: 4 / 3; } /* 昔のテレビ比率 */ .thumbnail { aspect-ratio: 3 / 2; } /* 写真の標準サイズ */
calc()(異なる単位を混ぜて計算)
calc() は px・%・em・vw などの異なる単位を混ぜて計算できる。「全体幅から固定のサイドバー幅を引いた残りをメインに」のような計算が1行で書ける。
80px
/* 異なる単位を混ぜた計算が可能 */ .main { width: calc(100% - 240px); /* 100%(親幅)からサイドバーの240pxを引いた残りがメインの幅 */ } /* 四則演算(+ - * /)がすべて使える */ .col { /* (全体幅 - gap×2)÷ 3列 */ width: calc((100% - 32px) / 3); } /* ※ 演算子の前後にスペースが必要(+ や - は特に注意)*/ .box { height: calc(100vh - 60px); /* 画面高さ - ヘッダー高さ */ }
clamp()(最小・推奨・最大を1行で指定)
clamp(最小値, 推奨値, 最大値) の3つの値を指定する。@media なしで画面幅に応じて滑らかに変化するレスポンシブなタイポグラフィやサイズに使う。
/* clamp(最小値, 推奨値, 最大値) */ .hero-title { /* 最小20px、推奨5vw(画面幅の5%)、最大48px */ /* → 画面が狭いと20px、広がるにつれて大きくなり、48pxで頭打ち */ font-size: clamp(20px, 5vw, 48px); } .container { /* 最小320px、推奨90%、最大1200px */ /* → @media なしでスマホからPCまで対応できる */ width: clamp(320px, 90%, 1200px); } .padding { /* 余白もclampで流動的に */ padding: clamp(16px, 4vw, 48px); }
min() / max()(比較して選択)
min() は指定した値のうち小さい方を採用(最大幅の制限)、max() は大きい方を採用(最小幅の確保)。max-width や min-width を1行で書ける。
max-widthと同じ効果
min-widthと同じ効果
/* min():小さい方を採用 → 最大幅の指定と同じ効果 */ .container { /* 80% と 600px を比較して小さい方 */ /* → スマホでは80%幅、PCでは600pxを超えないように */ width: min(80%, 600px); /* max-width: 600px; width: 80%; と同じ意味 */ } /* max():大きい方を採用 → 最小幅の確保と同じ効果 */ .sidebar { /* 200px と 30% を比較して大きい方 */ /* → 最低でも200pxを確保しつつ、広い画面では30%まで広がる */ width: max(200px, 30%); /* min-width: 200px; width: 30%; と同じ意味 */ }
まとめ
aspect-ratioは幅を決めるだけで高さが自動計算される。動画・サムネイルに最適calc()は px と % など異なる単位を混ぜた計算ができるclamp(最小, 推奨, 最大)は @media なしでレスポンシブなサイズ指定が可能min()は小さい方(最大幅の指定)、max()は大きい方(最小幅の確保)を採用- 4つともモダンブラウザで広くサポートされており、実務でそのまま使える