next/imageでの高さ100%設定
Next.jsのnext/image
コンポーネントで画像の高さを100%に設定する際によく遭遇する問題とその解決方法について解説します。
問題点
next/image
コンポーネントを使用して画像の高さを100%に設定しようとすると、以下のようなエラーが発生することがあります:
Error: Image with src "/deco.svg" must use "width" and "height" properties or "unsized" property.
これはドキュメントではlayout="fill"
を使用する場合にwidth
とheight
が不要とされているにもかかわらず発生するため、混乱を招きます。
解決方法
方法1: fillプロパティを使用する(推奨)
親要素をposition: relative
に設定し、Imageコンポーネントにfill={true}
を設定します:
<div className="relative h-full w-full">
<Image
src="/deco.svg"
alt="説明文"
fill={true}
style={{ objectFit: "cover" }}
/>
</div>
必要なCSS
.relative {
position: relative;
}
.h-full {
height: 100%;
}
.w-full {
width: 100%;
}
TIP
objectFit
プロパティは以下の値を取ります:
cover
: アスペクト比を保ちながらコンテナを埋めるcontain
: 画像全体が表示されるように調整fill
: コンテナに合わせて歪める
方法2: スタイルを使用する
Next.js 13.5以上では、以下の方法も有効です:
<Image
src="/deco.svg"
alt="説明文"
width={0}
height={0}
sizes="100vw"
style={{ width: '100%', height: 'auto' }}
/>
方法3: 外部画像の場合
外部URLから画像を読み込む場合:
<div className="relative h-[300px] w-full">
<Image
src="https://example.com/image.jpg"
alt="説明文"
fill
className="object-cover"
/>
</div>
よくある間違いと解決策
WARNING
以下の方法は非推奨または正しく動作しない可能性があります
非推奨なlayoutプロパティ:
jsx// 非推奨 <Image layout="fill" ... /> // 推奨 <Image fill ... />
スタイルの適用方法:
jsx// 非推奨: 直接スタイルを適用 <Image style={{ height: '100%' }} ... /> // 推奨: 親要素とfillプロパティを組み合わせる <div style={{ position: 'relative', height: '100%' }}> <Image fill ... /> </div>
完全な使用例
import Image from 'next/image';
export default function FullHeightImage() {
return (
<div className="container">
<div className="image-wrapper">
<Image
src="/deco.svg"
alt="デコレーション画像"
fill
style={{
objectFit: 'cover',
objectPosition: 'center'
}}
/>
</div>
</div>
);
}
.container {
width: 100%;
height: 500px; /* 任意の高さ */
}
.image-wrapper {
position: relative;
width: 100%;
height: 100%;
}
まとめ
next/image
で高さ100%を実現するには:
- 親要素に
position: relative
と高さの設定 - Imageコンポーネントに
fill
プロパティを追加 - 必要に応じて
objectFit
で画像の調整を行う
この方法で、レスポンシブで高さ100%の画像を簡単に実装できます。
INFO
Next.jsのバージョンによって挙動が変わる可能性があるため、常に最新の公式ドキュメントを確認することをお勧めします。