<Image>
示例
需要了解:如果您使用的是 Next.js 13 之前的版本,则需要使用next/legacy/image 文档,因为组件名称已更改。
此 API 参考将帮助您了解如何使用属性和配置选项,这些选项可用于 Image 组件。有关功能和用法,请参阅Image 组件页面。
import Image from 'next/image'
export default function Page() {
return (
<Image
src="/profile.png"
width={500}
height={500}
alt="Picture of the author"
/>
)
}
属性
以下是 Image 组件可用的属性摘要
属性 | 示例 | 类型 | 状态 |
---|---|---|---|
src | src="/profile.png" | 字符串 | 必需 |
width | width={500} | 整数 (px) | 必需 |
height | height={500} | 整数 (px) | 必需 |
alt | alt="作者图片" | 字符串 | 必需 |
loader | loader={imageLoader} | 函数 | - |
fill | fill={true} | 布尔值 | - |
sizes | sizes="(max-width: 768px) 100vw, 33vw" | 字符串 | - |
quality | quality={80} | 整数 (1-100) | - |
priority | priority={true} | 布尔值 | - |
placeholder | placeholder="blur" | 字符串 | - |
style | style={{objectFit: "contain"}} | 对象 | - |
onLoadingComplete | onLoadingComplete={img => done())} | 函数 | 已弃用 |
onLoad | onLoad={event => done())} | 函数 | - |
onError | onError(event => fail()} | 函数 | - |
loading | loading="lazy" | 字符串 | - |
blurDataURL | blurDataURL="data:image/jpeg..." | 字符串 | - |
overrideSrc | overrideSrc="/seo.png" | 字符串 | - |
必需属性
Image 组件需要以下属性:src
、alt
、width
和 height
(或 fill
)。
import Image from 'next/image'
export default function Page() {
return (
<div>
<Image
src="/profile.png"
width={500}
height={500}
alt="Picture of the author"
/>
</div>
)
}
src
必须是以下之一
使用默认loader时,还要考虑源图像的以下内容
- 当 src 为外部 URL 时,您还必须配置remotePatterns
- 当 src 为动画或不是已知格式(JPEG、PNG、WebP、AVIF、GIF、TIFF)时,图像将按原样提供服务
- 当 src 为 SVG 格式时,它将被阻止,除非启用了
unoptimized
或 [
dangerouslyAllowSVG`](#dangerouslyallowsvg)
width
width
属性表示以像素为单位的固有图像宽度。此属性用于推断图像的正确纵横比,并在加载过程中避免布局偏移。它不确定图像的渲染大小,渲染大小由 CSS 控制,类似于 HTML <img>
标记中的width
属性。
必需,除了静态导入的图像或具有
必需,除了静态导入的图像或具有
了解一下 它应包含可替换图像的文本,而不会改变页面含义。它并非旨在补充图像,不应重复图像上方或下方标题中已提供的信息。 如果图像纯粹是装饰性的或并非供用户使用,则 用于解析图像 URL 的自定义函数。 以下是如何使用自定义加载器的示例 或者,您可以在 一个布尔值,它使图像填充父元素,当 父元素必须分配 默认情况下,img 元素将自动分配 如果未对图像应用任何样式,则图像将拉伸以适应容器。您可能更喜欢设置 或者, 有关更多信息,另请参阅 一个字符串,类似于媒体查询,它提供有关图像在不同断点下宽度的信息。 例如,如果您知道您的样式将导致图像在移动设备上全宽,在平板电脑上采用 2 列布局,在台式机显示器上采用 3 列布局,则应包含如下所示的 sizes 属性 此 了解有关 优化图像的质量,一个介于 如果为真,则图像将被视为高优先级并预加载。对于使用 对于检测为最大内容绘制 (LCP)元素的任何图像,都应该使用 仅当图像在视口可见区域上方时才使用。默认为 在图像加载过程中使用的占位符。可能的值为 当 对于动态图像,您必须提供 当 当 试一试 在某些情况下,您可能需要更高级的使用方式。 允许将 CSS 样式传递到底层图像元素。 请记住,所需的宽度和高度属性可能会与您的样式发生交互。如果您使用样式修改图像的宽度,则还应将其高度设置为 警告:自 Next.js 14 起已弃用,建议使用 图像完全加载并删除占位符后调用的回调函数。 回调函数将被调用,并带有一个参数,即对底层 图像完全加载并删除占位符后调用的回调函数。 回调函数将被调用,并带有一个参数,即包含对底层 如果图像加载失败,则调用的回调函数。 图像的加载行为。默认为 当 当 了解有关 在 必须是 base64 编码的图像。它将被放大和模糊,因此建议使用非常小的图像(10px 或更小)。包含较大的图像作为占位符可能会损害应用程序性能。 试一试 您还可以生成与图像匹配的纯色数据 URL。 如果为真,则源图像将按原样提供,而不是更改质量、大小或格式。默认为 从 Next.js 12.3.0 开始,可以通过使用以下配置更新 向 在某些情况下,不希望生成 例如,在将现有网站从 提示浏览器在呈现其他内容更新之前是否应该等待图像解码完成。默认为 可能的值如下 详细了解 除了属性外,您还可以在 您可以选择在 注意:以上示例将确保 为了保护您的应用程序免受恶意用户的攻击,需要进行配置才能使用外部图像。这确保只有来自您帐户的外部图像才能通过 Next.js 图像优化 API 提供服务。这些外部图像可以通过 注意:以上示例将确保 以下是 注意:以上示例将确保 通配符模式可用于 注意:省略 以下是 注意:以上示例将确保 警告:自 Next.js 14 起已弃用,转而使用严格的 与 但是, 以下是 如果您想使用云提供商来优化图像而不是使用 Next.js 内置的图像优化 API,您可以像下面这样在 这必须指向 Next.js 应用程序根目录下的一个文件。该文件必须导出一个返回字符串的默认函数,例如 或者,您可以使用 示例 以下配置适用于高级用例,通常不需要。如果您选择配置以下属性,您将覆盖 Next.js 在未来更新中的任何更改。 如果您知道用户的预期设备宽度,则可以使用 如果未提供任何配置,则使用以下默认值。 您可以使用 有两个单独的列表的原因是, 如果未提供任何配置,则使用以下默认值。 默认的 图像优化 API 将通过请求的 如果 如果未提供任何配置,则使用以下默认值。 您可以启用 AVIF 支持,并仍然使用以下配置回退到 WebP。 了解一下: 以下描述了默认加载器的缓存算法。对于所有其他加载器,请参阅您的云提供商的文档。 图像在请求时会动态优化并存储在 可以通过读取 您可以配置缓存优化图像的生存时间 (TTL)(以秒为单位)。在许多情况下,最好使用静态图像导入,它会自动散列文件内容并永久缓存图像,并使用 优化图像的过期时间(或更确切地说是最大年龄)由 如果您需要更改每个图像的缓存行为,则可以配置 目前尚无使缓存失效的机制,因此最好将 默认行为允许您导入静态文件,例如 在某些情况下,如果此功能与期望导入行为不同的其他插件冲突,您可能希望禁用此功能。 您可以在 默认加载器出于一些原因不会优化 SVG 图像。首先,SVG 是一种矢量格式,这意味着它可以无损缩放。其次,SVG 具有许多与 HTML/CSS 相同的功能,如果没有适当的内容安全策略 (CSP) 标头,这可能导致漏洞。 因此,当 但是,如果您需要使用默认的图像优化 API 提供 SVG 图像服务,则可以在 此外,强烈建议还设置 默认加载器将 默认值为 您可以选择配置 默认加载器将自动绕过图像优化以处理动画图像,并按原样提供图像服务。 动画文件的自动检测是尽力而为的,支持 GIF、APNG 和 WebP。如果您想显式绕过给定动画图像的图像优化,请使用unoptimized属性。 默认生成的 您可以使用以下方法之一呈现响应式图像。 如果源图像不是动态的,则可以使用静态导入来创建响应式图像 试一试 如果源图像为动态图像或远程 URL,则还需要提供 试一试 如果您不知道纵横比,则需要设置 试一试 如果要为亮模式和暗模式显示不同的图像,则可以创建一个新的组件,该组件包装两个 了解一下: 试一试 对于更高级的用例,您可以调用 这还可以避免调用 React 的 如果要为明暗模式显示不同的图像,可以使用 如果要为移动设备和桌面显示不同的图像,有时称为 艺术指导,您可以为 您甚至可以将 此 height
height
属性表示图像的内在高度(单位为像素)。此属性用于推断图像的正确纵横比,并在加载过程中避免布局偏移。它不决定图像的渲染大小,图像的渲染大小由 CSS 控制,类似于 HTML <img>
标签中的 height
属性。
width
和 height
属性结合使用来确定图像的纵横比,浏览器在图像加载前使用此纵横比为图像预留空间。fill
属性。alt
alt
属性用于为屏幕阅读器和搜索引擎描述图像。如果禁用了图像或加载图像时发生错误,它也是备用文本。alt
属性应为空字符串 (alt=""
)。可选属性
<Image />
组件除了必需属性外,还接受许多其他属性。本节介绍 Image 组件最常用的属性。有关更少使用的属性的详细信息,请参阅高级属性部分。loader
loader
是一个函数,它根据以下参数返回图像的 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
实例,而无需传递属性。fill
fill={true} // {true} | {false}
width
和 height
未知时非常有用。position: "relative"
、position: "fixed"
或 position: "absolute"
样式。position: "absolute"
样式。object-fit: "contain"
用于将图像设置为 letterbox 以适应容器并保持纵横比。object-fit: "cover"
将使图像填充整个容器并裁剪以保持纵横比。sizes
sizes
的值将极大地影响使用 fill
或样式设置为响应式大小的图像的性能。sizes
属性在与图像性能相关的两个重要方面发挥作用
sizes
的值来确定要下载哪个尺寸的图像,来自 next/image
自动生成的 srcset
。当浏览器进行选择时,它尚不知道页面上图像的大小,因此它选择一个尺寸与视口相同或更大的图像。sizes
属性允许您告诉浏览器图像实际上将小于全屏。如果在具有 fill
属性的图像中未指定 sizes
值,则使用默认值 100vw
(全屏宽度)。sizes
属性更改了自动生成的 srcset
值的行为。如果不存在 sizes
值,则会生成一个小的 srcset
,适用于固定尺寸的图像 (1x/2x/等)。如果定义了 sizes
,则会生成一个大的 srcset
,适用于响应式图像 (640w/750w/等)。如果 sizes
属性包含诸如 50vw
之类的尺寸,这些尺寸表示视口宽度的百分比,则 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
示例可能会对性能指标产生重大影响。如果没有 33vw
尺寸,则从服务器选择的图像将比需要宽 3 倍。由于文件大小与宽度的平方成正比,因此如果没有 sizes
,用户将下载一个比必要大 9 倍的图像。srcset
和 sizes
的更多信息quality
quality={75} // {number 1-100}
1
和 100
之间的整数,其中 100
是最佳质量,因此文件大小最大。默认为 75
。priority
priority={false} // {false} | {true}
priority
的图像,会自动禁用延迟加载。如果还使用了 loading
属性并将其设置为 lazy
,则不能使用 priority
属性。loading
属性仅适用于高级用例。当需要 priority
时,请删除 loading
。priority
属性。由于不同的视口尺寸可能对应不同的 LCP 元素,因此可能需要使用多个优先级图像。false
。placeholder
placeholder = 'empty' // "empty" | "blur" | "data:image/..."
blur
、empty
或data:image/...
。默认为empty
。blur
时,blurDataURL
属性将用作占位符。如果src
来自静态导入的对象,并且导入的图像为.jpg
、.png
、.webp
或.avif
,则blurDataURL
将自动填充,除非检测到图像为动画图像。blurDataURL
属性。诸如Plaiceholder之类的解决方案可以帮助生成base64
。data:image/...
时,数据 URL将在图像加载过程中用作占位符。empty
时,图像加载过程中将没有占位符,只有空白区域。高级属性
<Image />
组件可以选择接受以下高级属性。style
const imageStyle = {
borderRadius: '50%',
border: '1px solid #fff',
}
export default function ProfileImage() {
return <Image src="..." style={imageStyle} />
}
auto
以保持其固有纵横比,否则您的图像将失真。onLoadingComplete
<Image onLoadingComplete={(img) => console.log(img.naturalWidth)} />
onLoad
。<img>
元素的引用。onLoad
<Image onLoad={(e) => console.log(e.target.naturalWidth)} />
<img>
元素的引用的target
的事件。onError
<Image onError={(e) => console.error(e.target.id)} />
loading
loading = 'lazy' // {lazy} | {eager}
lazy
。lazy
时,延迟加载图像,直到其到达距视口计算出的距离。eager
时,立即加载图像。loading
属性的更多信息。blurDataURL
src
图像成功加载之前用作占位符图像的数据 URL。仅在与placeholder="blur"
结合使用时有效。unoptimized
unoptimized = {false} // {false} | {true}
false
。import Image from 'next/image'
const UnoptimizedImage = (props) => {
return <Image {...props} unoptimized />
}
next.config.js
将此属性分配给所有图像module.exports = {
images: {
unoptimized: true,
},
}
overrideSrc
<Image>
组件提供src
属性时,将为生成的<img>
自动生成srcset
和src
属性。<Image src="/me.jpg" />
<img
srcset="
/_next/image?url=%2Fme.jpg&w=640&q=75 1x,
/_next/image?url=%2Fme.jpg&w=828&q=75 2x
"
src="/_next/image?url=%2Fme.jpg&w=828&q=75"
/>
src
属性,并且您可能希望使用overrideSrc
属性覆盖它。<img>
升级到<Image>
时,您可能希望出于 SEO 目的(如图像排名或避免重新抓取)保持相同的src
属性。<Image src="/me.jpg" overrideSrc="/override.jpg" />
<img
srcset="
/_next/image?url=%2Fme.jpg&w=640&q=75 1x,
/_next/image?url=%2Fme.jpg&w=828&q=75 2x
"
src="/override.jpg"
/>
解码
async
。
async
- 异步解码图像,并在其完成之前允许渲染其他内容。sync
- 同步解码图像,以便与其他内容进行原子呈现。auto
- 对解码模式没有偏好;浏览器决定最佳方案。decoding
属性。其他属性
<Image />
组件上的其他属性将传递给底层的 img
元素,以下属性除外
srcSet
。请改用 设备尺寸。配置选项
next.config.js
中配置 Image 组件。以下选项可用localPatterns
next.config.js
文件中配置 localPatterns
,以允许优化特定路径并阻止所有其他路径。module.exports = {
images: {
localPatterns: [
{
pathname: '/assets/images/**',
search: '',
},
],
},
}
next/image
的 src
属性必须以 /assets/images/
开头,并且不能包含查询字符串。尝试优化任何其他路径将返回 400 Bad Request。remotePatterns
next.config.js
文件中的 remotePatterns
属性进行配置,如下所示module.exports = {
images: {
remotePatterns: [
{
protocol: 'https',
hostname: 'example.com',
port: '',
pathname: '/account123/**',
search: '',
},
],
},
}
next/image
的 src
属性必须以 https://example.com/account123/
开头,并且不能包含查询字符串。任何其他协议、主机名、端口或不匹配的路径将返回 400 Bad Request。next.config.js
文件中使用通配符模式在 hostname
中的 remotePatterns
属性示例module.exports = {
images: {
remotePatterns: [
{
protocol: 'https',
hostname: '**.example.com',
port: '',
search: '',
},
],
},
}
next/image
的 src
属性必须以 https://img1.example.com
或 https://me.avatar.example.com
或任意数量的子域名开头。它不能包含端口或查询字符串。任何其他协议或不匹配的主机名将返回 400 Bad Request。pathname
和 hostname
,并具有以下语法
*
匹配单个路径段或子域名**
匹配末尾的任意数量的路径段或开头的任意数量的子域名**
语法不能用于模式中间。
protocol
、port
、pathname
或 search
时,将隐式使用通配符 **
。不建议这样做,因为它可能允许恶意攻击者优化您不希望优化的 URL。next.config.js
文件中使用 search
的 remotePatterns
属性示例module.exports = {
images: {
remotePatterns: [
{
protocol: 'https',
hostname: 'assets.example.com',
search: '?v=1727111025337',
},
],
},
}
next/image
的 src
属性必须以 https://assets.example.com
开头,并且必须具有完全相同的查询字符串 ?v=1727111025337
。任何其他协议或查询字符串将返回 400 Bad Request。domains
remotePatterns
以保护您的应用程序免受恶意用户的攻击。只有在您拥有从该域名提供的所有内容时,才使用 domains
。remotePatterns
类似,domains
配置可用于提供外部图像允许的主机名列表。domains
配置不支持通配符模式匹配,也不能限制协议、端口或路径名。next.config.js
文件中 domains
属性的示例module.exports = {
images: {
domains: ['assets.acme.com'],
},
}
loaderFile
next.config.js
中配置 loaderFile
module.exports = {
images: {
loader: 'custom',
loaderFile: './my/image/loader.js',
},
}
export default function myImageLoader({ src, width, quality }) {
return `https://example.com/${src}?w=${width}&q=${quality || 75}`
}
loader
属性 来配置 next/image
的每个实例。高级
deviceSizes
next.config.js
中的 deviceSizes
属性指定设备宽度断点列表。当 next/image
组件使用 sizes
属性时,将使用这些宽度来确保为用户的设备提供正确的图像。module.exports = {
images: {
deviceSizes: [640, 750, 828, 1080, 1200, 1920, 2048, 3840],
},
}
imageSizes
next.config.js
文件中的 images.imageSizes
属性指定图像宽度列表。这些宽度与 设备尺寸 的数组连接起来,形成用于生成图像 srcset 的完整尺寸数组。imageSizes
仅用于提供 sizes
属性的图像,这表示图像小于屏幕的完整宽度。因此,imageSizes
中的尺寸应都小于 deviceSizes
中的最小尺寸。module.exports = {
images: {
imageSizes: [16, 32, 48, 64, 96, 128, 256, 384],
},
}
formats
Accept
标头自动检测浏览器支持的图像格式,以确定最佳输出格式。Accept
标头匹配多个配置的格式,则使用数组中的第一个匹配项。因此,数组顺序很重要。如果没有匹配项(或源图像为 动画),图像优化 API 将回退到原始图像的格式。module.exports = {
images: {
formats: ['image/webp'],
},
}
module.exports = {
images: {
formats: ['image/avif', 'image/webp'],
},
}
Accept
标头。缓存行为
<distDir>/cache/images
目录中。优化后的图像文件将在后续请求中提供服务,直到达到过期时间。当请求匹配一个已缓存但已过期的文件时,会立即提供过期的图像。然后,图像会在后台再次优化(也称为重新验证)并保存到缓存中,并带有新的过期日期。x-nextjs-cache
响应头的值来确定图像的缓存状态。可能的值如下
MISS
- 该路径不在缓存中(最多发生一次,在第一次访问时)STALE
- 该路径在缓存中,但超过了重新验证时间,因此将在后台更新HIT
- 该路径在缓存中,并且尚未超过重新验证时间minimumCacheTTL
配置或上游图像的Cache-Control
标头(以较大者为准)定义了过期时间(或更确切地说是最大年龄)。具体来说,使用Cache-Control
标头的max-age
值。如果同时找到s-maxage
和max-age
,则优先使用s-maxage
。max-age
也会传递到任何下游客户端,包括CDN和浏览器。
Cache-Control
标头或其值为非常低时,您可以配置minimumCacheTTL
来增加缓存持续时间。deviceSizes
和imageSizes
来减少可能生成的图像总数。minimumCacheTTL
Cache-Control
标头的immutable
值。module.exports = {
images: {
minimumCacheTTL: 60,
},
}
minimumCacheTTL
或上游图像的Cache-Control
标头(以较大者为准)定义。headers
以在上游图像(例如/some-asset.jpg
,而不是/_next/image
本身)上设置Cache-Control
标头。minimumCacheTTL
保持较低。否则,您可能需要手动更改src
属性或删除<distDir>/cache/images
。disableStaticImages
import icon from './icon.png'
,然后将其传递给src
属性。next.config.js
中禁用静态图像导入module.exports = {
images: {
disableStaticImages: true,
},
}
dangerouslyAllowSVG
src
属性已知为 SVG 时,我们建议使用unoptimized
属性。当src
以".svg"
结尾时,会自动发生这种情况。next.config.js
中设置dangerouslyAllowSVG
module.exports = {
images: {
dangerouslyAllowSVG: true,
contentDispositionType: 'attachment',
contentSecurityPolicy: "default-src 'self'; script-src 'none'; sandbox;",
},
}
contentDispositionType
以强制浏览器下载图像,以及contentSecurityPolicy
以防止嵌入在图像中的脚本执行。contentDispositionType
Content-Disposition
标头设置为attachment
,以提供额外的保护,因为 API 可以提供任意远程图像。attachment
,当直接访问时,它会强制浏览器下载图像。当dangerouslyAllowSVG
为真时,这一点尤其重要。inline
,以允许浏览器在直接访问时呈现图像,而无需下载。module.exports = {
images: {
contentDispositionType: 'inline',
},
}
动画图像
响应式图像
srcset
包含1x
和2x
图像,以支持不同的设备像素比。但是,您可能希望呈现一个随视口拉伸的响应式图像。在这种情况下,您需要设置sizes
以及style
(或className
)。使用静态导入的响应式图像
import Image from 'next/image'
import me from '../photos/me.jpg'
export default function Author() {
return (
<Image
src={me}
alt="Picture of the author"
sizes="100vw"
style={{
width: '100%',
height: 'auto',
}}
/>
)
}
具有纵横比的响应式图像
width
和height
以设置响应式图像的正确纵横比import Image from 'next/image'
export default function Page({ photoUrl }) {
return (
<Image
src={photoUrl}
alt="Picture of the author"
sizes="100vw"
style={{
width: '100%',
height: 'auto',
}}
width={500}
height={300}
/>
)
}
使用
fill
的响应式图像fill
属性并在父元素上设置position: relative
。或者,您可以根据所需的拉伸与裁剪行为设置object-fit
样式import Image from 'next/image'
export default function Page({ photoUrl }) {
return (
<div style={{ position: 'relative', width: '300px', height: '500px' }}>
<Image
src={photoUrl}
alt="Picture of the author"
sizes="300px"
fill
style={{
objectFit: 'contain',
}}
/>
</div>
)
}
主题检测 CSS
<Image>
组件,并根据 CSS 媒体查询显示正确的组件。.imgDark {
display: none;
}
@media (prefers-color-scheme: dark) {
.imgLight {
display: none;
}
.imgDark {
display: unset;
}
}
import styles from './theme-image.module.css'
import Image, { ImageProps } from 'next/image'
type Props = Omit<ImageProps, 'src' | 'priority' | 'loading'> & {
srcLight: string
srcDark: string
}
const ThemeImage = (props: Props) => {
const { srcLight, srcDark, ...rest } = props
return (
<>
<Image {...rest} src={srcLight} className={styles.imgLight} />
<Image {...rest} src={srcDark} className={styles.imgDark} />
</>
)
}
loading="lazy"
的默认行为确保仅加载正确的图像。您不能使用 priority
或 loading="eager"
,因为这会导致两张图像都加载。相反,您可以使用 fetchPriority="high"
。getImageProps
getImageProps()
获取将传递给底层 <img>
元素的 props,并将其传递给其他组件、样式、画布等。useState()
,因此可以提高性能,但不能与 placeholder
prop 一起使用,因为占位符永远不会被移除。主题检测图片
<picture>
元素根据用户的 首选配色方案 显示不同的图像。import { getImageProps } from 'next/image'
export default function Page() {
const common = { alt: 'Theme Example', width: 800, height: 400 }
const {
props: { srcSet: dark },
} = getImageProps({ ...common, src: '/dark.png' })
const {
props: { srcSet: light, ...rest },
} = getImageProps({ ...common, src: '/light.png' })
return (
<picture>
<source media="(prefers-color-scheme: dark)" srcSet={dark} />
<source media="(prefers-color-scheme: light)" srcSet={light} />
<img {...rest} />
</picture>
)
}
艺术指导
getImageProps()
提供不同的 src
、width
、height
和 quality
props。import { getImageProps } from 'next/image'
export default function Home() {
const common = { alt: 'Art Direction Example', sizes: '100vw' }
const {
props: { srcSet: desktop },
} = getImageProps({
...common,
width: 1440,
height: 875,
quality: 80,
src: '/desktop.jpg',
})
const {
props: { srcSet: mobile, ...rest },
} = getImageProps({
...common,
width: 750,
height: 1334,
quality: 70,
src: '/mobile.jpg',
})
return (
<picture>
<source media="(min-width: 1000px)" srcSet={desktop} />
<source media="(min-width: 500px)" srcSet={mobile} />
<img {...rest} style={{ width: '100%', height: 'auto' }} />
</picture>
)
}
背景 CSS
srcSet
字符串转换为 image-set()
CSS 函数以优化背景图像。import { getImageProps } from 'next/image'
function getBackgroundImage(srcSet = '') {
const imageSet = srcSet
.split(', ')
.map((str) => {
const [url, dpi] = str.split(' ')
return `url("${url}") ${dpi}`
})
.join(', ')
return `image-set(${imageSet})`
}
export default function Home() {
const {
props: { srcSet },
} = getImageProps({ alt: '', width: 128, height: 128, src: '/img.png' })
const backgroundImage = getBackgroundImage(srcSet)
const style = { height: '100vh', width: '100vw', backgroundImage }
return (
<main style={style}>
<h1>Hello World</h1>
</main>
)
}
已知浏览器错误
next/image
组件使用浏览器原生 延迟加载,这可能会回退到旧版浏览器(Safari 15.4 之前的版本)的急切加载。使用模糊放大占位符时,Safari 12 之前的旧版浏览器将回退到空占位符。当使用 width
/height
为 auto
的样式时,可能会在 Safari 15 之前的旧版浏览器上导致 布局偏移,这些浏览器不 保留纵横比。有关更多详细信息,请参阅 此 MDN 视频。
@supports (font: -apple-system-body) and (-webkit-appearance: none) { img[loading="lazy"] { clip-path: inset(0.6px) } }
priority
formats
placeholder
版本历史
版本 更改 v15.0.0
添加了 decoding
prop。contentDispositionType
配置的默认值更改为 attachment
。v14.2.0
添加了 overrideSrc
prop。v14.1.0
getImageProps()
稳定。v14.0.0
onLoadingComplete
prop 和 domains
配置已弃用。v13.4.14
placeholder
prop 支持 data:/image...
v13.2.0
添加了 contentDispositionType
配置。v13.0.6
添加了 ref
prop。v13.0.0
next/image
导入已重命名为 next/legacy/image
。next/future/image
导入已重命名为 next/image
。一个 代码修改工具可用 以安全且自动地重命名您的导入。已删除 <span>
包装器。已删除 layout
、objectFit
、objectPosition
、lazyBoundary
、lazyRoot
props。alt
是必需的。onLoadingComplete
接收对 img
元素的引用。已删除内置加载器配置。v12.3.0
remotePatterns
和 unoptimized
配置稳定。v12.2.0
添加了实验性 remotePatterns
和实验性 unoptimized
配置。已删除 layout="raw"
。v12.1.1
添加了 style
prop。添加了对 layout="raw"
的实验性支持。v12.1.0
添加了 dangerouslyAllowSVG
和 contentSecurityPolicy
配置。v12.0.9
添加了 lazyRoot
prop。v12.0.0
添加了 formats
配置。
添加了 AVIF 支持。
包装器 <div>
更改为 <span>
。v11.1.0
添加了 onLoadingComplete
和 lazyBoundary
props。v11.0.0
src
prop 支持静态导入。
添加了 placeholder
prop。
添加了 blurDataURL
prop。v10.0.5
添加了 loader
prop。v10.0.1
添加了 layout
prop。v10.0.0
引入 next/image
。
这有帮助吗?