こんにちは。キューでWebエンジニアをしている永井です。
今回はこちらの記事のNext.js 13版になります。
Next.js 13にアップデートされ、next/imageに大きな変更がありました。
前回の内容では、Next.js 13で正しく動作しないので改めて記事にしていきます。
環境
Next.js 13.0.5
React 18.2.0
Next.js 13のアップデート内容
前回の記事から関係のあるアップデート内容を簡単にご紹介します。
imgがラップされなくなった
Next.js 12以前は、next/imageで生成されるimgはラップされていました。
// Next.js 12未満
<div ... >
<img ... />
</div>
// Next.js 12
<span ... >
<img ... />
</span>
Next.js 13では、ラッパーがなくなりimg単体になりました。
<img ... / >
一部のPropsが非推奨に
前回の記事で使用していたlayout
, objectFit
が非推奨になりました。
<Image
src={path}
layout="fill"
objectFit="contain"
/>
Next.js 13では、このように実装します。
<Image
src={path}
fill
style={{ objectFit: 'contain' }} // or className={xxx}を用いる
/>
実装方法
上記の内容を踏まえて、Next.js 13で実装するとこちらになります。
// JS
<Image
className={styles.image}
src={path}
alt={alt}
fill
/>
// CSS
.image {
object-fit: contain;
position: relative !important;
width: auto !important;
}
Propsの指定
fill
で高さ・幅を指定しないようにしています。alt
はNext.js 13で必須に変更されたので指定する必要があります。
スタイルの指定
object-fit
は、styleかclassNameで指定する必要があるので、今回はclassNameで指定しています。
次に、next/imageのスタイルを上書きします。
※imgのstyle属性でスタイルが指定されているので!important;
を使用して上書きする必要があります。
position:absolute;
→position: relative !important;
width: 100%
→width: auto !important;
これでNext.js 13でもアスペクト比を保ちつつ画像を表示させることができます。