CSS aspect-ratio 実践ガイド ― 脱・paddingハックで縦横比を操る

レスポンシブな画像や動画の縦横比を保つために、もう複雑な計算をする必要はありません。1行のコードで解決するモダンな手法をマスターしましょう。

あの「paddingハック」はもう不要です

カード型のコンポーネントを作るとき、サムネイル画像を「16:9」や「1:1」の比率で固定したい場面は頻繁にあります。かつて、横幅の可変に合わせて高さを維持するには、非常に面倒なテクニックが必要でした。

❌ 過去のやり方(paddingハック)
.image-wrapper {
  position: relative;
  width: 100%;
  padding-top: 56.25%; /* 16:9のための謎の計算 (9÷16) */
}
.image-wrapper img {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
}

親要素に高さを直接指定せず、paddingの%指定(親の幅に対する比率になる性質)と、子要素の絶対配置を組み合わせた力技です。現場ではおなじみのコードでしたが、コードが長くなるうえに直感的ではありませんでした。

今は aspect-ratio というプロパティを使えば、これらがたった1行で解決します。

基本:最小限のコードで縦横比を指定する

使い方はとても直感的です。幅 / 高さ の形式で比率を書くだけです。

✅ モダンな書き方
.box {
  width: 100%;
  aspect-ratio: 16 / 9;
  background-color: #fca5a5;
}
▶ Live Demo — ブラウザ幅を変えてみてください
16 : 9
1 : 1

実践:画像とobject-fitを組み合わせる

実務で最も活躍するのは、CMSからアップロードされる「サイズがバラバラな画像」を、綺麗なカードレイアウトに収めるときです。

要素の枠を aspect-ratio で固定できても、中の画像(imgタグ)が歪んでしまっては意味がありません。必ず object-fit: cover; とセットで使いましょう。

カードコンポーネントのサムネイル画像
.card-thumbnail {
  width: 100%;
  aspect-ratio: 4 / 3;
  object-fit: cover; /* 画像の歪みを防ぎ、枠をトリミングで埋める */
  border-radius: 8px;
}
💡 現場の経験則
aspect-ratio は width が指定されている場合は height を自動計算し、逆に height が指定されている場合は width を自動計算します。フレックスボックス内で使う場合は、意図せぬ縮小を防ぐために width: 100% などを明示的に指定しておくのが無難です。

まとめ

  • かつて必須だった「padding-topハックとabsolute配置」はもう使う必要がない。
  • aspect-ratio: 16 / 9; のように、直感的な比率指定が1行で可能になった。
  • 画像に適用する場合は、object-fit: cover; と組み合わせて歪みを防ぐのが鉄則。
  • レスポンシブなカードUIや、YouTubeのiframe埋め込みなどで非常に重宝する。