Image
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"
/>
)
}
提示: 如果你使用的是 Next.js 13 之前的版本,请参考 next/legacy/image 文档,因为组件名称有变更。
参考
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 字符串:
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}
/>
)
}
你也可以在 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
属性