Image Component
Next.js 的 Image 组件扩展了 HTML <img>
元素,实现了自动图片优化。
import Image from 'next/image'
export default function Page() {
return (
<Image
src="/profile.png"
width={500}
height={500}
alt="Picture of the author"
/>
)
}
参考
Props
可用的 props 如下:
Prop | 示例 | 类型 | 状态 |
---|---|---|---|
src | src="/profile.png" | String | 必填 |
alt | alt="Picture of the author" | String | 必填 |
width | width={500} | Integer (px) | - |
height | height={500} | Integer (px) | - |
fill | fill={true} | Boolean | - |
loader | loader={imageLoader} | Function | - |
sizes | sizes="(max-width: 768px) 100vw, 33vw" | String | - |
quality | quality={80} | Integer (1-100) | - |
priority | priority={true} | Boolean | - |
placeholder | placeholder="blur" | String | - |
style | style={{objectFit: "contain"}} | Object | - |
onLoadingComplete | onLoadingComplete={img => done())} | Function | 已弃用 |
onLoad | onLoad={event => done())} | Function | - |
onError | onError(event => fail()} | Function | - |
loading | loading="lazy" | String | - |
blurDataURL | blurDataURL="data:image/jpeg..." | String | - |
overrideSrc | overrideSrc="/seo.png" | String | - |
src
图片的来源。可以是以下之一:
内部路径字符串:
<Image src="/profile.png" />
绝对外部 URL(需在 remotePatterns 中配置):
<Image src="https://example.com/profile.png" />
静态导入:
import profile from './profile.png'
export default function Page() {
return <Image src={profile} />
}
alt
alt
属性用于为屏幕阅读器和搜索引擎描述图片。当图片被禁用或加载出错时,也会显示为回退文本。
应包含可以替代图片且不改变页面含义的文本。不应重复图片上下的说明文字。
如果图片是纯装饰性或不面向用户,alt
应设为空字符串(alt=""
)。
了解更多 图片可访问性指南。
width
和 height
width
和 height
属性表示图片的固有尺寸(像素)。用于让浏览器预留正确的宽高比,避免加载时布局偏移。它不决定图片的实际渲染尺寸,实际渲染由 CSS 控制。
<Image src="/profile.png" width={500} height={500} />
必须同时设置 width
和 height
,除非:
- 图片是静态导入的;
- 图片使用了
fill
属性
如果未知宽高,推荐使用 fill
属性。
fill
布尔值,使图片扩展至父元素大小。
<Image src="/profile.png" fill={true} />
定位要求:
- 父元素必须设置
position: "relative"
、"fixed"
或"absolute"
。 <img>
元素默认使用position: "absolute"
。
对象适应:
如果未对图片应用样式,图片会拉伸填满容器。可用 objectFit
控制裁剪和缩放:
"contain"
:缩放图片以适应容器并保持宽高比;"cover"
:图片填满容器并被裁剪。
了解更多
position
和object-fit
。
loader
一个自定义函数,用于生成图片 URL。该函数接收以下参数,并返回一个图片 URL 字符串:
'use client'
import Image from 'next/image'
const imageLoader = ({ src, width, quality }) => {
return `https://example.com/${src}?w=${width}&q=${quality || 75}`
}
export default function Page() {
return (
<Image
loader={imageLoader}
src="me.png"
alt="Picture of the author"
width={500}
height={500}
/>
)
}
提示: 使用
onLoad
等接受函数作为参数的 props 需要使用 Client Components 序列化提供的函数。
你也可以在 next.config.js
中使用 loaderFile 配置来为应用中的每个 next/image
实例配置加载器,而无需传递 prop。
sizes
在不同断点下定义图片的大小。浏览器用于从生成的 srcset
中选择最合适的尺寸。
import Image from 'next/image'
export default function Page() {
return (
<div className="grid-element">
<Image
fill
src="/example.png"
sizes="(max-width: 768px) 100vw, (max-width: 1200px) 50vw, 33vw"
/>
</div>
)
}
sizes
应在以下情况下使用:
- 图片使用了
fill
属性 - 使用 CSS 使图片响应式
如果 sizes
缺失,浏览器会假设图片宽度为视口宽度(100vw
)。这可能导致下载不必要的较大图片。
此外,sizes
会影响 srcset
的生成:
- 无
sizes
:Next.js 生成有限的srcset
(例如 1x, 2x),适用于固定尺寸图片。 - 有
sizes
:Next.js 生成完整的srcset
(例如 640w, 750w 等),优化响应式布局。
quality
一个介于 1
和 100
之间的整数,用于设置优化后图片的质量。值越高,文件体积越大,视觉保真度越高。值越低,文件体积越小,但可能影响清晰度。
// 默认质量为 75
<Image quality={75} />
如果你在 next.config.js
中配置了 qualities,则值必须与允许的条目之一匹配。
提示: 如果原始图片质量已经较低,设置较高的质量值会增加文件体积,但不会改善外观。
style
允许将 CSS 样式传递给底层的 <img>
元素。
const imageStyle = {
borderRadius: '50%',
border: '1px solid #fff',
width: '100px',
height: 'auto',
}
export default function ProfileImage() {
return <Image src="..." style={imageStyle} />
}
提示: 如果你使用
style
属性设置自定义宽度,请确保同时设置height: 'auto'
以保持图片的宽高比。
priority
一个布尔值,用于指示图片是否应预加载。
// 默认优先级为 false
<Image priority={false} />
true
:预加载图片。禁用懒加载。false
:懒加载图片。
何时使用:
- 图片位于视口上方。
- 图片是 Largest Contentful Paint (LCP) 元素。
- 你希望提高页面初始加载性能。
何时不使用:
- 当使用
loading
属性时(会触发警告)。
loading
控制图片的加载时机。
// 默认懒加载
<Image loading="lazy" />
lazy
:延迟加载图片,直到它到达视口计算距离。eager
:立即加载图片,无论其在页面中的位置如何。
仅在需要确保图片立即加载时使用 eager
。
了解更多
loading
属性。
placeholder
指定一个占位符,在图片加载时使用,以提高感知加载性能。
// 默认空
<Image placeholder="empty" />
empty
:图片加载时无占位符。blur
:使用图片的模糊版本作为占位符。必须与blurDataURL
属性一起使用。data:image/...
:使用 Data URL 作为占位符。
示例:
了解更多
placeholder
属性。
blurDataURL
一个 Data URL,用于在图片成功加载之前作为占位符。可以自动设置或与 placeholder="blur"
属性一起使用。
<Image placeholder="blur" blurDataURL="..." />
图片会自动放大并模糊,因此建议使用一个非常小的图片(10px 或更小)。
自动
如果 src
是 jpg
、png
、webp
或 avif
文件的静态导入,blurDataURL
会自动添加——除非图片是动画。
手动设置
如果图片是动态或远程的,你必须自己提供 blurDataURL
。要生成一个,你可以使用:
一个较大的 blurDataURL
可能会影响性能。保持小巧简单。
示例:
onLoad
一个回调函数,在图片完全加载且 placeholder 被移除时调用。
<Image onLoad={(e) => console.log(e.target.naturalWidth)} />
回调函数将接收一个参数,即事件,其 target
属性引用底层的 <img>
元素。
提示: 使用
onLoad
等接受函数作为参数的 props 需要使用 Client Components 序列化提供的函数。
onError
一个回调函数,在图片加载失败时调用。
<Image onError={(e) => console.error(e.target.id)} />
提示: 使用
onError
等接受函数作为参数的 props 需要使用 Client Components 序列化提供的函数。
unoptimized
一个布尔值,用于指示图片是否应优化。这对于不受益于优化的图片(例如小于 1KB 的小图片、矢量图片 (SVG)、动画图片 (GIF))很有用。
import Image from 'next/image'
const UnoptimizedImage = (props) => {
// 默认值为 false
return <Image {...props} unoptimized />
}
true
:源图片将直接从src
提供,不改变质量、大小或格式。false
:源图片将进行优化。
自 Next.js 12.3.0 起,此属性可以由 next.config.js
更新为以下配置:
module.exports = {
images: {
unoptimized: true,
},
}
overrideSrc
当向 <Image>
组件提供 src
prop 时,next/image
会自动生成 <img>
的 srcset
和 src
属性。
<Image src="/profile.jpg" />
<img
srcset="
/_next/image?url=%2Fprofile.jpg&w=640&q=75 1x,
/_next/image?url=%2Fprofile.jpg&w=828&q=75 2x
"
src="/_next/image?url=%2Fprofile.jpg&w=828&q=75"
/>
在某些情况下,你不希望生成 src
属性,你可以使用 overrideSrc
prop 覆盖它。
例如,当你从 <img>
升级到 <Image>
时,你可能希望保持相同的 src
属性以进行 SEO,例如图片排名或避免重新抓取。
<Image src="/profile.jpg" overrideSrc="/override.jpg" />
<img
srcset="
/_next/image?url=%2Fprofile.jpg&w=640&q=75 1x,
/_next/image?url=%2Fprofile.jpg&w=828&q=75 2x
"
src="/override.jpg"
/>
decoding
一个提示,告知浏览器是否应在展示其他内容更新或不展示之前等待图片解码。
// 默认异步
<Image decoding="async" />
async
:异步解码图片,并允许在完成前渲染其他内容。sync
:同步解码图片,与其他内容原子性展示。auto
:无偏好。浏览器选择最佳方法。
了解更多
decoding
属性。
其他 Props
<Image />
组件上的其他属性将传递到底层的 img
元素,但以下属性除外:
srcSet
:使用 Device Sizes 替代。