読み込み中...

CSSでアスペクト比を調整する方法!初心者でもわかる使い方や対処法まとめ

CSSでアスペクト比を調整する方法を徹底解説 CSS
この記事は約19分で読めます。

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

本記事のサンプルコードを活用して機能追加、目的を達成できるように作ってありますので、是非ご活用ください。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を満たす現役のプログラマチームによって監修されています。

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

Webページを作成する際、画像や動画などの要素のサイズを設定する必要があります。

しかし、要素のサイズを固定してしまうと、画面のサイズが異なる端末で表示した際に要素が大きすぎたり小さすぎたりする問題が起きてしまいます。

この問題を解決するために、アスペクト比を調整する方法があります。

本記事では、CSSを使ってアスペクト比を調整する方法を解説します。

●アスペクト比とは?

アスペクト比とは、画像や動画などの縦横比のことを指します。

例えば、縦が100pxで横が200pxの場合、アスペクト比は2:1となります。

●CSSでアスペクト比を調整する方法

CSSでアスペクト比を調整する方法には、下記の3つがあります。

  1. paddingを利用する方法
  2. ::before擬似要素を利用する方法
  3. グリッドレイアウトを利用する方法

それぞれの方法について、詳しく解説します。

○paddingを利用する方法

paddingを利用してアスペクト比を維持する方法は、CSSの技巧として多くのデザイナーやデベロッパーに採用されています。

この手法を使うと、要素のアスペクト比を維持しながら、要素の幅に応じて高さも動的に変更できるのが特徴です。こ

の方法の中核にあるのは、縦方向のpadding(特にpadding-topまたはpadding-bottom)が、要素の幅のパーセンテージとして計算されるという性質を利用することです。

次の例では、縦横比が2:1の要素に対して、padding-topを50%に設定しています。

.aspect-ratio {
  width: 100%;
  position: relative;
}

.aspect-ratio:before {
  content: "";
  display: block;
  padding-top: 50%;
}

.aspect-ratio > * {
  position: absolute;
  top: 0;
  left: 0;
  height: 100%;
  width: 100%;
}

このコードは、縦横比2:1のコンテナを生成するためのCSSルールセットを提供しています。

具体的には、まず.aspect-ratioクラスを持つ要素に対して、100%の幅と相対位置を持つように指定しています。

これにより、この要素は親要素の幅に合わせてリサイズされることになります。

次に、.aspect-ratio:beforeのセレクタを用いて、該当要素の前に擬似要素を生成しています。

この擬似要素にpadding-top: 50%;を設定することで、要素の幅の50%に相当する高さの空間が生まれます。

この結果、この空間が縦横比2:1の高さとして機能することになります。具体的に言うと、もしコンテナの幅が200pxであれば、高さは100px(200pxの50%)となります。

最後に、.aspect-ratio > *のセレクタを使って、.aspect-ratio要素の直接の子要素全てにスタイルを適用しています。

子要素は絶対位置を持ち、その親である.aspect-ratio要素の左上隅から開始されます。

そして、この子要素の高さと幅は、親要素の100%となります。

これにより、縦横比2:1のコンテナ内のコンテンツが適切にフィットするようになります。

○::before擬似要素を利用する方法

::before擬似要素を活用することで、CSSにおける様々な効果や表現を実現することができます。

特にアスペクト比の維持は、レスポンシブデザインを実現する上での有力な手段として知られています。

ここでは、擬似要素の::beforeを使用して、アスペクト比を指定した高さを持つコンテナを簡単に生成する方法を詳細に解説します。

下記の例では、縦横比が2:1の要素に対して、::before擬似要素にpadding-bottomを50%に設定しています。

.aspect-ratio {
  position: relative;
}

.aspect-ratio:before {
  content: "";
  display: block;
  padding-bottom: 50%;
}

.aspect-ratio > * {
  position: absolute;
  top: 0;
  left: 0;
  height: 100%;
  width: 100%;
}

このコードは、縦横比2:1を持つコンテナの生成をサポートするためのCSSの定義を表しています。

初めに、.aspect-ratioというクラスを持つ要素が相対位置を持つように指定されています。

これは、子要素や擬似要素が絶対位置を持つ場合、基準となる位置を親要素に持たせるための重要なステップです。

続いて、.aspect-ratio:beforeのセレクタを利用して、要素の前に擬似要素を挿入しています。

この擬似要素にpadding-bottom: 50%;というスタイルを適用することで、元の要素の幅の50%に相当する高さの空間を確保します。

これが、アスペクト比2:1の高さの部分を担当しています。

例えば、もしコンテナの幅が300pxだった場合、擬似要素の高さは150px(300pxの50%)となります。

そして最後に、.aspect-ratio > *セレクタを用いて、.aspect-ratioクラスを持つ要素の直接の子要素全てに対するスタイリングが行われます。

これらの子要素は、絶対位置を持つこととなり、その親である.aspect-ratio要素の左上隅を基点として配置されます。

その上で、子要素の高さと幅は親要素の100%に相当するように設定されており、これによってアスペクト比2:1のコンテナ内の内容が適切に配置されることが保証されます。

このような手法を用いることで、コンテンツの幅に応じて動的に高さが調整される、アスペクト比を維持したコンテナを効果的に実現することができます。

特にレスポンシブデザインのコンテキストでは、このような技術は非常に価値があります。

○グリッドレイアウトを利用する方法

CSS Gridは、2次元のレイアウトシステムを提供しており、行と列の概念を用いて要素を配置できる点が強みとなっています。

これにより、複雑なレイアウトやアスペクト比の管理が、比較的シンプルな方法で可能となります。

縦横比を持つグリッドアイテムの生成においても、Gridはその有効性を発揮します。

次の例では、縦横比が2:1の要素を、2つのgridアイテムに分割しています。

.grid-container {
  display: grid;
  grid-template-columns: 1fr;
  grid-template-rows: 2fr 1fr;
}

.grid-item {
  position: relative;
}

.grid-item > * {
  position: absolute;
  top: 0;
  left: 0;
  height: 100%;
  width: 100%;
}

このコードは、縦横比が2:1のグリッドアイテムを生成するためのCSSルールセットを表しています。

まず、.grid-containerクラスを持つ要素はグリッドコンテナとして定義され、その中にアイテムを配置します。

このコンテナは、1つの列と、2:1のアスペクト比を持つ2つの行で構成されています。

具体的には、grid-template-columns: 1fr;というプロパティで1つの等分の列を生成し、grid-template-rows: 2fr 1fr;というプロパティで縦横比が2:1の2つの行を生成しています。

このfr(fraction)単位は、利用可能なスペースの比率を表すのに便利な単位です。

次に、.grid-itemセレクタは、グリッド内の各アイテムに対して相対的な位置を設定しています。

これは、子要素が絶対位置を持つための基盤として機能します。

最後に、.grid-item > *セレクタを使用して、グリッドアイテムの直接の子要素全てにスタイルを適用しています。

これらの子要素は絶対位置を持ち、その親要素である.grid-itemの左上隅から配置されるようになります。

そして、これらの子要素の高さと幅は、それぞれの親アイテムの100%に設定されています。

これにより、縦横比が2:1のグリッドアイテム内のコンテンツが適切に配置されます。

CSS Gridを活用することで、明確なアスペクト比を持ったレイアウトを簡潔に、かつ柔軟に実現することができます。

この技術を駆使すれば、モダンなウェブデザインの要求に応えることが可能となります。

●アスペクト比の対処法

アスペクト比を調整する際に、次のような問題が起きることがあります。

  1. 画像が引き伸ばされてしまう
  2. 画像が切り取られてしまう

それぞれの問題に対する対処法について、詳しく解説します。

○画像が引き伸ばされてしまう場合

画像をウェブページ上で表示する際、そのサイズや位置を調整するのは一般的な要求となります。

特にレスポンシブデザインの時代において、画像のアスペクト比を保ちながら、異なるデバイスやビューポートのサイズで適切に表示されるようにすることは重要です。

この課題に対応するために、background-size プロパティは非常に役立つツールとして広く利用されています。

画像が引き伸ばされてしまう場合には、background-sizeプロパティを利用して、画像のサイズを調整します。

次の例では、縦横比が2:1の要素に対して、background-sizeをcoverに設定しています。

.aspect-ratio {
  width: 100%;
  position: relative;
  background-image: url("sample.jpg");
  background-size: cover;
  background-position: center;
}

このコードは、縦横比が2:1の要素に背景画像を適切に配置・拡大縮小するためのCSSスタイルを定義しています。

まず、.aspect-ratioというクラス名を持つ要素が、その親要素に対して幅100%で表示されるように指定しています。

これにより、要素は親の幅に合わせて動的にリサイズされます。

背景画像はbackground-imageプロパティを使用して指定されます。

この例では “sample.jpg” という画像が指定されていますが、これは適切なパスやURLに置き換えることで、任意の画像を設定できます。

続いて、background-size: cover;というスタイルが適用されています。

このスタイルは、背景画像が要素のサイズに合わせて大きくなるか小さくなることで、完全に要素を覆い尽くすようになります。

このcoverの値を使うことで、画像が要素に完全にフィットし、余白や切り取られる部分が発生しないようになります。

最後に、background-position: center;は背景画像が要素の中心に配置されることを保証します。

これにより、画像が要素の中央を基準にして調整され、ビューポートやデバイスのサイズが変更されたときも中心的な内容が見えるようになります。

総じて、このスタイルセットを使用することで、ウェブページのさまざまな状況やデバイスサイズにおいても、背景画像が適切に表示され、ユーザー体験の品質を向上させることができます。

○画像が切り取られてしまう場合

Webデザインにおいて、背景画像の表示方法は、ユーザーエクスペリエンスを大きく左右します。

特に、画像が切り取られてしまうと、意図しない部分が隠れてしまったり、画像の主要な部分が表示されないといった問題が発生します。

これを解決するために、CSSにはbackground-positionプロパティという便利なツールが用意されています。

このプロパティを使用することで、背景画像の位置を細かく調整し、画像が適切に表示されるようにすることができます。

次の例では、縦横比が2:1の要素に対して、background-positionをcenter centerに設定しています。

.aspect-ratio {
  width: 100%;
  position: relative;
  background-image: url("sample.jpg");
  background-size: cover;
  background-position: center center;
}

このコードは、背景画像を持つ要素のレイアウトと表示を最適化するためのCSSルールセットを提供しています。

まず、.aspect-ratioクラスを持つ要素の幅を100%とし、相対的な位置を持つように指定しています。

この指定により、要素は親要素の幅全体に広がることになります。

背景画像としてsample.jpgが指定され、そのサイズはcoverに設定されています。

coverは、要素のサイズに画像をフィットさせるための値で、要素のサイズに応じて背景画像が自動的に拡大・縮小されます。

このとき、画像の縦横比は保たれるため、画像が歪むことなく表示されます。

そして、最も重要なのがbackground-position: center center;の部分です。このプロパティにより、背景画像は要素の中央に位置するようになります。

この指定により、画像の中心部が確実に表示されるため、意図しない部分が切り取られるリスクを大幅に減少させることができます。

要素のデザインや背景画像の内容によっては、別の位置指定が適切な場合もあります。

しかし、一般的には、center centerの指定により、背景画像の主要な部分を確実に表示させることが可能となります。

このような細やかな設定により、ユーザーにとってより魅力的で分かりやすいデザインを実現することができます。

●応用例とサンプルコード

アスペクト比を調整する方法を応用して、次のような効果を実現することができます。

  1. レスポンシブな動画の表示
  2. ギャラリーの表示
  3. カードデザインの表示

それぞれ見ていきましょう!

○レスポンシブな動画の表示

動画コンテンツは、特にレスポンシブなデザインにおいて、その表示に注意が必要です。

特に、動画プレイヤーのアスペクト比を適切に保ちつつ、デバイスのサイズや向きに応じて適切にリサイズされることが求められます。

YouTubeや他の動画プラットフォームの動画を埋め込む際には、その動画がオリジナルのアスペクト比を保持するためのCSSの工夫が不可欠です。

次の例では、YouTubeの動画をレスポンシブに表示する方法を解説しています。

<div class="aspect-ratio">
  <iframe src="https://www.youtube.com/embed/xxxxx"></iframe>
</div>

<style>
.aspect-ratio {
  position: relative;
  padding-bottom: 56.25%;
}

.aspect-ratio iframe {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
}
</style>

このコードは、レスポンシブな動画表示のためのスタイルを定義しています。

具体的には、まず .aspect-ratio クラスを持つdiv要素が、動画を包むコンテナとして機能します。

このコンテナに対して position: relative;padding-bottom: 56.25%; のスタイルが適用されます。

ここでの padding-bottom の値は、16:9のアスペクト比を維持するために計算されたものです。

このパディングの値が、動画の高さを動的に調整する役割を果たします。

次に、 .aspect-ratio iframe セレクタを用いて、コンテナ内のiframeにスタイルを適用しています。

ここでの position: absolute; は、iframeがコンテナ内での絶対位置を持つように指定しており、 top: 0;left: 0; により、iframeはコンテナの左上隅から配置されます。

さらに、iframeの widthheight がそれぞれ100%に設定されているため、iframeは常にコンテナの大きさにフィットします。

このようにして、動画は常に16:9のアスペクト比を保ちながら、親要素やビューポートのサイズに応じてリサイズされるようになります。

このスタイルの設定により、異なるデバイスやウィンドウサイズでも、動画が適切に表示されることが保証されます。

○ギャラリーの表示

画像のギャラリーをウェブページに配置する場面では、それぞれの画像が統一された形で表示されることが望まれることが多いです。

特にアスペクト比を一定に保つことで、一貫性を持ったデザインやユーザーエクスペリエンスを提供することが可能となります。

CSSのGridを活用することで、このような目的を実現することが可能です。

Gridは、2次元のレイアウトシステムを提供し、アイテムの配置やアラインメント、アスペクト比の調整などが容易になります。

次の例では、画像のギャラリーをアスペクト比を調整して表示する方法を解説しています。

<div class="grid-container">
  <div class="grid-item">
    <img src="image1.jpg" alt="">
  </div>
  <div class="grid-item">
    <img src="image2.jpg" alt="">
  </div>
  <div class="grid-item">
    <img src="image3.jpg" alt="">
  </div>
  <div class="grid-item">
    <img src="image4.jpg" alt="">
  </div>
</div>

<style>
.grid-container {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  grid-gap: 20px;
}

.grid-item {
  position: relative;
  overflow: hidden;
}

.grid-item img {
  position: absolute;
  top: 0;
  left: 0;
  height: 100%;
  width: 100%;
  object-fit: cover;
}
</style>

このコードは、簡潔ながら非常に効果的なギャラリーレイアウトを実現しています。

まず、.grid-containerクラスに対して、display: grid;を指定することで、子要素をグリッドレイアウトに配置することを表しています。

grid-template-columns: repeat(4, 1fr);は、4つの列を等間隔に配置することを指示しており、これによって4枚の画像が横並びに表示されます。

grid-gap: 20px;により、グリッドアイテム間に20pxの間隔が設けられます。

次に、.grid-itemクラスのスタイル定義では、position: relative;を指定しているのは、子要素の画像がこの要素を基準に絶対配置されるためです。

overflow: hidden;は、画像がこの要素の境界を超えて表示されないようにするためのものです。

さらに、.grid-item imgセレクタでは、画像自体のスタイルを定義しています。

position: absolute;によって、画像はその親要素である.grid-itemの左上隅から配置されます。

height: 100%;width: 100%;によって、画像はその親要素のサイズに完全にフィットします。

最後に、object-fit: cover;は、画像がその要素のサイズに合わせてトリミングされ、アスペクト比が維持されるようにするためのプロパティです。

このスタイルの指定により、4つの画像は統一されたサイズとアスペクト比で表示され、見栄えの良いギャラリーが実現されます。

この手法は、レスポンシブデザインにおいても非常に有効で、さまざまなデバイスや画面サイズでの表示を綺麗に保つことができます。

○カードデザインの表示

カードデザインは、情報を見やすく、魅力的に表示するためのウェブデザインの一般的な手法としてよく採用されます。

特に、画像やタイトル、説明文などの異なるタイプのコンテンツを効果的に組み合わせる場面で、その効果を最大限に発揮します。

そして、アスペクト比を考慮することで、その見栄えをさらに洗練させることが可能です。

次の例では、カードデザインをアスペクト比を調整して表示する方法を解説しています。

<div class="card aspect-ratio">
  <img src="image.jpg" alt="">
  <div class="card-body">
    <h5 class="card-title">Card Title</h5>
    <p class="card-text">Card description.</p>
  </div>
</div>

<style>
.card {
  width: 100%;
  position: relative;
  display: flex;
  flex-direction: column;
}

.card-body {
  flex: 1;
  padding: 10px;
}

.aspect-ratio {
  position: relative;
  padding-bottom: 60%;
}

.aspect-ratio img {
  position: absolute;
  top: 0;
  left: 0;
  height: 100%;
  width: 100%;
  object-fit: cover;
  z-index: -1;
}
</style>

このコードは、アスペクト比の調整を含め、カードデザインを実現するためのHTMLとCSSの組み合わせを表しています。

初めに.cardクラスは、カードの全体のスタイリングを管理します。

これにwidth: 100%;を指定することで、カードは親要素の幅に合わせてリサイズされます。

display: flex;flex-direction: column;を組み合わせることで、カード内の要素は縦方向に整列されます。

次に、.card-bodyクラスでは、カードの本文部分のスタイリングが定義されています。

この部分は、カードの下部に位置し、タイトルや説明文を包含します。

flex: 1;の指定により、画像部分を除く残りのスペースをこの本文部分が占めるようになります。

.aspect-ratioクラスは、カードのアスペクト比を調整するためのものです。

padding-bottom: 60%;によって、カードの幅の60%に相当する高さの空間が確保され、これが画像表示の領域として利用されます。

そして、.aspect-ratio imgセレクタにより、画像はその確保された領域全体に広がるようにスタイリングされます。

position: absolute;とその他の位置指定により、画像はカードの上部に固定され、object-fit: cover;により、画像はその領域にフィットするように調整されます。

さらに、z-index: -1;によって、画像は他の要素よりも背面に配置されます。

この設定を用いることで、特定のアスペクト比を持つ魅力的なカードデザインを実現でき、それによってユーザーに情報を効果的に伝えることが可能となります。

以上のように、アスペクト比を調整する方法は、様々な場面で応用することができます。

CSSのアスペクト比を調整することで、見栄えの良いレイアウトを実現することができます。

まとめ

CSSを使って、アスペクト比を調整する方法を解説しました。

アスペクト比を調整することで、見栄えの良いレイアウトを実現することができます。

また、レスポンシブなデザインや、画像のギャラリー表示、カードデザインなど、様々な場面でアスペクト比を調整することができます。

是非、実際にコードを書いて、アスペクト比を調整する方法をマスターしてください。