コンテンツにスキップ

アスペクト比

hc-aspect は固定の縦横比のボックスを確保し、カラムがリサイズされても メディア(や埋め込み)が形を保つようにします — 画像の読み込み中に レイアウトシフトが起きません。純 CSS で、ネイティブの aspect-ratio プロパティの上に構築されています。直下のメディア子要素は object-fit: cover でボックスを満たします。

aspect-ratioobject-fitBaseline 2021(現行ブラウザで 広く利用可能)なので、@supports のゲートは使っていません。 aspect-ratio のないレガシーエンジンではボックスはコンテンツの高さに 潰れます。歴史的なフォールバックは padding-top ハックです:

/* Only needed for engines predating Baseline 2021. */
@supports not (aspect-ratio: 1 / 1) {
.hc-aspect { position: relative; padding-top: 56.25%; /* 16:9 */ }
.hc-aspect > * { position: absolute; inset: 0; }
}

よく使う比率は data-ratio プリセットとして用意されています。属性を 省くとデフォルトの 1 / 1 です。

data-ratio比率典型的な用途
省略1 / 1アバター、サムネイル。
16/916 / 9動画、ヒーロー画像。
4/34 / 3写真、カード。
3/23 / 2写真撮影。
2/12 / 1ワイドバナー。
21/921 / 9シネマ / ウルトラワイド。
9/169 / 16縦長 / ストーリー。

その他の比率はカスタムプロパティを直接設定します — プリセットは不要 です:

<div class="hc-aspect" style="--hc-aspect-ratio: 3 / 4">
<img src="/poster.jpg" alt="" />
</div>

<iframe>(動画プレイヤーや地図など)も画像と同じようにボックスを 満たすため、レスポンシブな埋め込みにパディングのラッパーは不要です。

<div class="hc-aspect" data-ratio="16/9">
<iframe src="https://example.com/embed/…" title="Demo video"
allowfullscreen></iframe>
</div>

メディア子要素はデフォルトでクロップして満たします (object-fit: cover)。代わりに画像全体をボックス内にレターボックス 表示するには data-fit="contain" を使います — 下では同じ横長画像が、 左はクロップ、右はレターボックス表示されています:

  • hc-aspect はプレゼンテーション用のラッパーです — role も セマンティクスも追加しません。意味は子要素が運びます: <img> には 意味のある alt(純粋な装飾なら alt="")を、<iframe> には title を与えてください。
  • ボックスが画像の読み込み前にスペースを確保するため、UX と支援技術の 読み上げ順の両方を損なうレイアウトシフト(CLS)を防ぎます。

専用トークンはありません — 共有のスペーシング / カラートークンを 再利用します。汎用の --hc-* 変数でテーマしてください。

生成される CSS 変数を表示
--hc-aspect-ratio (default 1 / 1; set by data-ratio presets or inline)
  • カード — 比率固定の カバー画像のよくあるホスト。
  • アバター — イニシャル フォールバックつきの円形 1 / 1 画像。
  • スケルトン — 読み込みプレースホルダーとして比率ボックスと組み合わせます。