サイトロゴ

Enjoy Creating
Web & Mobile Apps

MENU BOX
WEB
MOBILE
OPEN

ホーム

 > 

 > 

【CSS】height値を変えずに画像の縦横比を変える方法(aspect-ratio)

【CSS】height値を変えずに画像の縦横比を変える方法(aspect-ratio)

この記事にはプロモーションが含まれています。

Webページには画像を配置することも多いですが、パソコンとスマートフォンで画像の縦横比を変えたい…という場合も多いですよね。

PCでは一般的に横長(16:9など)の画像の方がおさまりがよくて見やすいですが、スマートフォンでは正方形(1:1)や縦長の方が、大きく表示されるので見やすくなります。

シンプルなのは、PC用とスマホ用で縦横比が異なる2枚の画像を作り、HTMLの<picture>要素を使って画像表示を切り替えるという方法です。

記事リンク:<picture>要素を使って画像を切り替える方法

しかし、現実的にはそこまで手間暇かけられないというケースも多いかと思います。
そこで代替案となるのが、1枚の同じ画像の縦横比を切り替えるという方法です。

ですが、表示させる横幅(width)に応じて縦横比を計算し、その値をheightに指定するのも、それはそれでとても面倒くさいですよね。
横幅を画面(ブラウザ)や親要素の大きさに合わせて可変させる場合など、相対的な単位で指定したい場合はなおさらです。

そこで今回はaspect-ratioプロパティを使って、height値を変えることなく画像の縦横比を変える方法をご紹介します!

– 目次 –

まずはwidth/height属性の指定

aspect-ratioはその名の通り、画像のアスペクト比(縦横比)を指定するものです。

ですがわざわざCSSで指定せずとも、<img>要素のwidth属性とheight属性を指定することにより、ブラウザが自動的にaspect-ratioを計算してくれるようになっています。

例えば500×500pxの正方形(1:1)の画像があるとして、HTMLで以下のようにマークアップすれば自ずとaspect-ratioは1/1になります。

HTML

<img src="img/square.jpg" alt="正方形の画像" width="500" height="500">

ブラウザの検証画面

アスペクト比の検証画像

画像の元々のアスペクト比をブラウザに分かりやすく明示するためにも、<img>要素のwidth属性とheight属性の指定は重要となります。
また、width/height属性の指定は、Webページの読み込み速度にも関わってきます。

width/height属性の指定の重要性を解説している参考記事リンク(英語サイト)
Setting Height And Width On Images Is Important Again

なのでCSSでaspect-ratioの値を指定できるからといって、width/height属性の指定を怠らないようにしましょう。

なお、<img>要素のwidth/height属性の指定と、CSSによるwidth/heightプロパティの指定は異なるものなので注意が必要です。

    POINT!
  1. ・img要素に指定したwidth/heigh属性がaspect-ratioとして認識される!
  2. ・画像の本来のアスペクト比をブラウザに正しく伝えるためにも、width/height属性はしっかり指定しよう!
  3. ・CSSによるwidth/heightの指定とは異なるのものなので注意!

aspect-ratioの指定

width/height属性の指定の重要性を押さえたところで、<img>要素にaspect-ratioプロパティを指定して見ましょう。
が、その前に事前準備が必要です。

CSSによるwidth/hegihtの値(≠属性値)の指定がなければ、画像のサイズは属性値のwidth/heightとなります。
そのため、aspect-ratioの値を変更しても画像の縦横比が変わらないということになってしまいます。

よって、<img>要素の属性値によるwidth/height指定だけでなく、CSSでwidth/heighの値を調整する必要があります。

通常、表示させたい横幅(width)を定めた上で、縦幅(height)はautoにしておくと良いでしょう。

また、縦横比を変えると画像が引き伸ばされて歪んでしまいます。
それを防ぐためには、object-fit: coverを指定しておくと良いです。

下は、aspect-ratioを指定する前のCSS調整の例です。

CSS

img {
	width: 300px;
	height: auto;
	object-fit: cover;
}

これにて準備が完了です。
今回サンプルで用意した画像は、縦横比が16:9のこちらの画像です。

16:9のサンプル画像

16:9のサンプル画像

それではまず、こちらのサンプル画像の縦横比を1:1の正方形にしてみましょう!

CSS

img {
	width: 300px;
	height: auto;
	object-fit: cover;
	aspect-ratio: 1 / 1;
}

表示結果

16:9のサンプル画像

heightの値をautoにしたまま、画像の縦横比を変えることができました。

heightの値を計算する必要がないので、縦横比を細かく指定するのも楽々です。
下は縦横比を1:1.35(やや縦長)にしたものです。

CSS

img {
	width: 300px;
	height: auto;
	object-fit: cover;
	aspect-ratio: 1 / 1.35;
}

表示結果

16:9のサンプル画像

縦横比を文章で表す時は【:コロン】を使うことが多いですが、aspect-ratioを指定する際は/スラッシュを用いる点には注意が必要かもしれません。

なお、スラッシュを挟んで左側の数値が横、右側の数値が縦の比率となります。

    POINT!
  1. ・属性値だけでなくCSSによるwidth/heightの指定も必要!
  2. ・縦横比が変わっても画像が引き伸ばされないよう、object-fitも指定しておこう!
  3. ・aspect-ratioで縦横比を指定する際、数値は/(スラッシュ)で区切る!

メディアクエリで切り替える

この章では、PCでは横長の縦横比で画像を表示し、スマホでは縦長の縦横比で表示されるように手を加えていきたいと思います。

メディアクエリを使ってブレイクポイントを指定し、画面(ブラウザ)の幅がある一定の大きさ以下になったら縦横比を切り替える…という方法でやっていきます。

なお、今回はわかりやすくするためブレイクポイントは400pxとし、400px以下とそれを超える幅とで表示を切り替えていきます。
また、このブログサイトはPCからの訪問者が圧倒的に多いため、モバイルファーストではなくデスクトップファーストの書き方で紹介します。

下が縦横比切り替えのCSSサンプルコードです。

CSS

/*400pxを超えるモニターでは横長表示*/
img {
	object-fit: cover;
	width: 100%; /*横幅は親要素の幅いっぱいに*/
	height: auto;
	aspect-ratio: 16 / 9;
	}
/*400px以下のスマホでは縦長表示*/
@media screen and (max-width: 400px) {
	img {
		aspect-ratio: 1 / 1.35;
	}
}

表示結果(動画サイズ:114KB)

上の動画では、画面(ビューポート)の幅400pxを境目に画像の縦横比が切り替わっているのが確認できます。

また横幅(width)が100%で可変ですが、それに合わせて可変的なheight値を計算して代入しなくても良いので、縦横比が崩れずにビューポート幅に合わせて画像の大きさが変わるのもポイントです。

    POINT!
  1. ・メディアクエリを使ってPCとスマホで画像の縦横比を切り替えることができる!
  2. ・任意のブレイクポイントを指定し、aspect-ratioの指定を切り替えよう!
  3. ・aspect-ratioを使うことで、横幅を可変サイズにしても縦横比が崩れることはない!

アニメーションも可能

縦横比を変更するaspect-ratioですが、実はアニメーションも可能です。

サンプルとして、縦横比16:9の横長の画像から縦横比1:1の正方形の画像に移り変わり、そして元の縦横比の画像に戻るアニメーションを作ってみましょう。

まずはアニメーションを設定する前の通常状態のCSSです。

CSS

img {
	width: 300px;
	height: auto;
	object-fit: cover;
	aspect-ratio: 16 / 9;
}

表示結果

16:9のサンプル画像

そしてanimationプロパティとキーフレームを使ってアニメーションを指定していきます。

CSS

img {
	width: 300px;
	height: auto;
	object-fit: cover;
	aspect-ratio: 16 / 9;
	animation: aspect-animation 2s linear infinite alternate;

	@keyframes aspect-animation {
		to { aspect-ratio: 1 / 1; }
	}
}

表示結果

16:9のサンプル画像

横長⇔正方形の縦横比の変化を繰り返す画像アニメーションができました。
他にも、マウスオーバーや画像クリックに合わせて縦横比をアニメーションさせてみるのも面白いかもしれませんね!

    POINT!
  1. ・aspect-ratioはアニメーションさせることも可能!
  2. ・animationプロパティとキーフレームを使ってアニメーションを指定しよう!
  3. ・マウスオーバーやクリックに合わせてアニメーションさせるのも良いかも!
– 注目の人気記事 –

今回の動画で紹介したコード!

今回の解説動画で使用したコードです。学習用としてご自由にコピペしてお使い下さい。(※スクロールできます)

HTML・CSS

<!doctype html>
<html>
<head>
<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width,initial-scale=1">
<title>縦横比を変更する方法</title>
<style>
	div {
		margin: 50px 0;
		box-sizing: border-box;
	}
	img {
		max-width: 500px;
		width: 100%;
		height: auto;
		object-fit: cover;
	}
	.seihoukei {
		aspect-ratio: 1/1;
	}
	.tatenaga {
		aspect-ratio: 1/ 1.25;
	}
	
	@media screen and (max-width: 400px) {
		.kirikae {
			aspect-ratio: 1 / 1.5;
		}
	}
	.aspect-anime {
		animation: aspectAnime linear 2s infinite alternate;
		aspect-ratio: 16/9;
		width: 300px;
	}
	@keyframes aspectAnime {
		to {aspect-ratio: 1/ 1;}
	}
</style>
</head>

<body>
<section>
	<div>
		<img src="img/penguin.jpg" alt="" width="512" height="288">
	</div>
	
	<div>
		<img src="img/penguin.jpg" alt="" width="512" height="288" class="seihoukei">
	</div>

	<div>
		<img src="img/penguin.jpg" alt="" width="512" height="288" class="tatenaga">
	</div>
</section>
	
<section>
	<div>
		<img src="img/penguin.jpg" alt="" width="512" height="288" class="kirikae">
	</div>
</section>
	
<section>
	<div>
		<img src="img/penguin.jpg" alt="" width="512" height="288" class="aspect-anime">
	</div>
</section>
</body>
</html>

« »

カテゴリーリンク

著者について- author profile -

ROYDOプロフィール写真
Michihiro

モバイルアプリ(iOS・Android)ディベロッパー&デザイナー

これまでに、可読性の高いカラーパターンを自動で生成するアプリや、『第3火曜日』といった形式で通知をスケジュールできるアプリなどを制作。

サブでWebデザイン・フロントエンドエンジニアとしても活動しています。

📝ツール・言語:JavaScript/React Native/Kotlin/Android Studio/Swift/SwiftUI

🎓資格:基本情報技術者/ウェブデザイン技能検定3級

Twitterアイコン Instagramアイコン