Image
示例
此 API 参考将帮助你了解如何使用 Image 组件的 props 和 配置选项。有关功能和用法的更多信息,请参阅 Image 组件 页面。
import Image from 'next/image'
export default function Page() {
return (
<Image
src="/profile.png"
width={500}
height={500}
alt="Picture of the author"
/>
)
}
Props
以下是 Image 组件可用 props 的摘要
Prop | 示例 | 类型 | 状态 |
---|---|---|---|
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" | 字符串 | - |
必需 Props
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
,否则将被阻止
width
width
属性表示图像的固有宽度(像素)。此属性用于推断图像的正确宽高比,并避免加载期间的布局偏移。它不决定图像的渲染大小,图像的渲染大小由 CSS 控制,类似于 HTML <img>
标签中的 width
属性。
必需,但 静态导入的图像 或具有 fill
属性 的图像除外。
height
height
属性表示图像的固有高度(像素)。此属性用于推断图像的正确宽高比,并避免加载期间的布局偏移。它不决定图像的渲染大小,图像的渲染大小由 CSS 控制,类似于 HTML <img>
标签中的 height
属性。
必需,但 静态导入的图像 或具有 fill
属性 的图像除外。
须知
width
和height
属性结合使用,用于确定图像的宽高比,浏览器使用该宽高比在图像加载前为其预留空间。- 固有大小并不总是意味着浏览器中的渲染大小,渲染大小将由父容器决定。例如,如果父容器小于固有大小,则图像将被缩小以适应容器。
- 当宽度和高度未知时,你可以使用
fill
属性。
alt
alt
属性用于为屏幕阅读器和搜索引擎描述图像。它也是在图像被禁用或加载图像时发生错误时的后备文本。
它应该包含可以替换图像的文本,而不会改变页面的含义。它并非旨在补充图像,不应重复图像上方或下方标题中已提供的信息。
如果图像是 纯粹装饰性的,不添加任何信息 或 不面向用户,则 alt
属性应为空字符串 (alt=""
)。
可选 Props
<Image />
组件除了必需的属性外,还接受许多其他属性。本节介绍 Image 组件最常用的属性。有关较少使用的属性的详细信息,请参阅高级 Props 部分。
loader
用于解析图像 URL 的自定义函数。
loader
是一个函数,它根据以下参数返回图像的 URL 字符串
以下是使用自定义 loader 的示例
'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}
/>
)
}
须知:使用像
loader
这样接受函数的 props 需要使用 客户端组件 来序列化提供的函数。
或者,你可以使用 next.config.js
中的 loaderFile 配置来配置应用程序中 next/image
的每个实例,而无需传递 prop。
fill
fill={true} // {true} | {false}
一个布尔值,使图像填充父元素,当 width
和 height
未知时非常有用。
父元素必须分配 position: "relative"
、position: "fixed"
或 position: "absolute"
样式。
默认情况下,img 元素将自动分配 position: "absolute"
样式。
如果未对图像应用任何样式,则图像将拉伸以适应容器。你可能更喜欢设置 object-fit: "contain"
,以便图像在容器中进行 Letterbox 处理并保持宽高比。
或者,object-fit: "cover"
将使图像填充整个容器并被裁剪以保持宽高比。
有关更多信息,另请参阅
sizes
一个字符串,类似于媒体查询,提供关于图像在不同断点处的宽度的信息。对于使用 fill
或 样式设置为响应式大小 的图像,sizes
的值将极大地影响性能。
sizes
属性服务于与图像性能相关的两个重要目的
- 首先,浏览器使用
sizes
的值来确定要从next/image
自动生成的srcset
中下载哪个尺寸的图像。当浏览器选择时,它还不知道页面上图像的大小,因此它会选择与视口大小相同或更大的图像。sizes
属性允许你告知浏览器,图像实际上会小于全屏。如果你未在使用fill
属性的图像中指定sizes
值,则会使用默认值100vw
(全屏宽度)。 - 其次,
sizes
属性会更改自动生成的srcset
值的行为。如果不存在sizes
值,则会生成一个小的srcset
,适用于固定大小的图像(1x/2x/等等)。如果定义了sizes
,则会生成一个大的srcset
,适用于响应式图像(640w/750w/等等)。如果sizes
属性包含诸如50vw
之类的大小(表示视口宽度的百分比),则srcset
将被修剪,不包括任何太小而永远不需要的值。
例如,如果你知道你的样式将导致图像在移动设备上为全宽,在平板电脑上为 2 列布局,在桌面显示器上为 3 列布局,则应包含如下所示的 sizes 属性
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
。
如果在 next.config.js
中定义了 qualities
配置,则 quality
prop 必须与配置中定义的值之一匹配。
须知:如果原始源图像质量已经很低,则将 quality prop 设置得太高可能会导致生成的优化图像大于原始源图像。
priority
priority={false} // {false} | {true}
当为 true 时,Next.js 将 预加载 图像。对于使用 priority
的图像,会自动禁用懒加载。如果也使用了 loading
属性并设置为 lazy
,则无法使用 priority
属性。loading
属性仅用于高级用例。当需要 priority
时,请移除 loading
。
你应该对任何检测为 最大内容绘制 (LCP) 元素的图像使用 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/...
时,Data URL 将在图像加载时用作占位符。
当为 empty
时,图像加载时将没有占位符,只有空白空间。
试用一下
高级 Props
在某些情况下,你可能需要更高级的用法。 <Image />
组件可以选择接受以下高级属性。
style
允许将 CSS 样式传递到底层图像元素。
const imageStyle = {
borderRadius: '50%',
border: '1px solid #fff',
}
export default function ProfileImage() {
return <Image src="..." style={imageStyle} />
}
请记住,必需的 width 和 height props 可能会与你的样式相互作用。如果你使用样式来修改图像的宽度,你也应该将其高度样式设置为 auto
以保持其固有的宽高比,否则你的图像将会失真。
onLoadingComplete
'use client'
<Image onLoadingComplete={(img) => console.log(img.naturalWidth)} />
警告:自 Next.js 14 起已弃用,推荐使用
onLoad
。
一个回调函数,在图像完全加载并且 占位符 已被移除后调用。
回调函数将被调用,并带有一个参数,即底层 <img>
元素的引用。
须知:使用像
onLoadingComplete
这样接受函数的 props 需要使用 客户端组件 来序列化提供的函数。
onLoad
<Image onLoad={(e) => console.log(e.target.naturalWidth)} />
一个回调函数,在图像完全加载并且 占位符 已被移除后调用。
回调函数将被调用,并带有一个参数,即 Event 对象。该对象的 target
属性引用底层的 <img>
元素。
须知:使用像
onLoad
这样接受函数的属性,需要使用 客户端组件 来序列化提供的函数。
onError
<Image onError={(e) => console.error(e.target.id)} />
当图片加载失败时调用的回调函数。
须知:使用像
onError
这样接受函数的属性,需要使用 客户端组件 来序列化提供的函数。
loading
loading = 'lazy' // {lazy} | {eager}
图片的加载行为。默认为 lazy
。
当设置为 lazy
时,延迟加载图像,直到它到达视口的一定计算距离内。
当设置为 eager
时,立即加载图像。
了解更多关于 loading
属性。
blurDataURL
一个 Data URL,用作 src
图片成功加载之前的占位符图像。仅在与 placeholder="blur"
结合使用时生效。
必须是 base64 编码的图像。它将被放大和模糊化,因此建议使用非常小的图像(10px 或更小)。包含较大的图像作为占位符可能会损害您的应用程序性能。
试用一下
您也可以 生成纯色 Data URL 以匹配图像。
unoptimized
unoptimized = {false} // {false} | {true}
当为 true 时,源图像将直接从 src
提供,而不会更改质量、大小或格式。默认为 false
。
这对于不适合优化的图像很有用,例如小图像(小于 1KB)、矢量图像 (SVG) 或动画图像 (GIF)。
import Image from 'next/image'
const UnoptimizedImage = (props) => {
return <Image {...props} unoptimized />
}
自 Next.js 12.3.0 起,可以通过更新 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"
/>
decoding
给浏览器的提示,指示浏览器是否应在呈现其他内容更新之前等待图像解码。默认为 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.js 图像优化 API 提供。这些外部图像可以使用 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
文件中使用主机名中的通配符模式的 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
警告:自 Next.js 14 起已弃用,为了支持更严格的
remotePatterns
,以保护您的应用程序免受恶意用户的攻击。仅当您拥有从该域提供的所有内容时才使用domains
。
与 remotePatterns
类似,domains
配置可用于提供外部图像的允许主机名列表。
但是,domains
配置不支持通配符模式匹配,并且无法限制协议、端口或路径名。
以下是 next.config.js
文件中 domains
属性的示例:
module.exports = {
images: {
domains: ['assets.acme.com'],
},
}
loaderFile
如果您想使用云服务提供商来优化图像,而不是使用 Next.js 内置的图像优化 API,您可以在 next.config.js
中配置 loaderFile
,如下所示:
module.exports = {
images: {
loader: 'custom',
loaderFile: './my/image/loader.js',
},
}
这必须指向相对于您的 Next.js 应用程序根目录的文件。该文件必须导出一个返回字符串的默认函数,例如:
'use client'
export default function myImageLoader({ src, width, quality }) {
return `https://example.com/${src}?w=${width}&q=${quality || 75}`
}
或者,您可以使用 loader
属性 来配置 next/image
的每个实例。
示例
须知:自定义图像加载器文件(接受函数)需要使用 客户端组件 来序列化提供的函数。
高级
以下配置适用于高级用例,通常不是必需的。如果您选择配置以下属性,您将覆盖未来更新中对 Next.js 默认值的任何更改。
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],
},
}
qualities
默认的 图像优化 API 将自动允许 1 到 100 之间的所有质量值。如果您希望限制允许的质量值,可以在 next.config.js
中添加配置。
module.exports = {
images: {
qualities: [25, 50, 75],
},
}
在上面的示例中,仅允许三个质量值:25、50 和 75。如果 quality
属性与此数组中的值不匹配,则图像将失败并返回 400 Bad Request。
formats
默认的 图像优化 API 将通过请求的 Accept
标头自动检测浏览器支持的图像格式,以确定最佳输出格式。
如果 Accept
标头与配置的格式中的多个格式匹配,则使用数组中的第一个匹配项。因此,数组顺序很重要。如果没有匹配项(或者源图像是动画图像),则图像优化 API 将回退到原始图像的格式。
如果未提供任何配置,则使用以下默认值。
module.exports = {
images: {
formats: ['image/webp'],
},
}
您可以启用 AVIF 支持,如果浏览器 不支持 AVIF,它将回退到 src 图像的原始格式
module.exports = {
images: {
formats: ['image/avif'],
},
}
须知:
- 我们仍然建议在大多数情况下使用 WebP。
- AVIF 通常编码时间长 50%,但与 WebP 相比,压缩率高 20%。这意味着首次请求图像时,通常会较慢,然后后续缓存的请求会更快。
- 如果您使用代理/CDN 自托管在 Next.js 前端,则必须配置代理以转发
Accept
标头。
缓存行为
以下描述了默认 loader 的缓存算法。对于所有其他加载器,请参阅您的云服务提供商的文档。
图像在请求时动态优化,并存储在 <distDir>/cache/images
目录中。优化后的图像文件将为后续请求提供服务,直到达到过期时间。当发出与缓存但已过期的文件匹配的请求时,将立即提供过期的图像(stale)。然后在后台再次优化图像(也称为重新验证),并以新的过期日期保存到缓存中。
可以通过读取 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
以减少可能生成的图像总数。 - 您可以配置 formats 以禁用多种格式,而支持单一图像格式。
minimumCacheTTL
您可以配置缓存优化图像的生存时间 (TTL),以秒为单位。在许多情况下,最好使用 静态图像导入,这将自动哈希文件内容,并使用 immutable
的 Cache-Control
标头永久缓存图像。
module.exports = {
images: {
minimumCacheTTL: 60,
},
}
优化图像的过期时间(或更确切地说是最大年龄)由 minimumCacheTTL
或上游图像 Cache-Control
标头定义,以较大者为准。
如果您需要更改每个图像的缓存行为,您可以配置 headers
以在上游图像上设置 Cache-Control
标头(例如,/some-asset.jpg
,而不是 /_next/image
本身)。
目前没有使缓存失效的机制,因此最好保持较低的 minimumCacheTTL
。否则,您可能需要手动更改 src
属性或删除 <distDir>/cache/images
。
disableStaticImages
默认行为允许您导入静态文件,例如 import icon from './icon.png'
,然后将其传递给 src
属性。
在某些情况下,如果静态图像导入功能与其他期望导入行为不同的插件冲突,您可能希望禁用此功能。
您可以在 next.config.js
中禁用静态图像导入:
module.exports = {
images: {
disableStaticImages: true,
},
}
dangerouslyAllowSVG
默认的 loader 不会优化 SVG 图像,原因有几个。首先,SVG 是一种矢量格式,这意味着可以无损地调整大小。其次,SVG 具有许多与 HTML/CSS 相同的功能,如果不使用适当的 内容安全策略 (CSP) 标头,可能会导致漏洞。
因此,当 src
属性已知为 SVG 时,我们建议使用 unoptimized
属性。当 src
以 ".svg"
结尾时,会自动发生这种情况。
但是,如果您需要使用默认的图像优化 API 提供 SVG 图像,则可以在 next.config.js
中设置 dangerouslyAllowSVG
:
module.exports = {
images: {
dangerouslyAllowSVG: true,
contentDispositionType: 'attachment',
contentSecurityPolicy: "default-src 'self'; script-src 'none'; sandbox;",
},
}
此外,强烈建议同时设置 contentDispositionType
以强制浏览器下载图像,以及 contentSecurityPolicy
以防止嵌入在图像中的脚本执行。
contentDispositionType
默认的 loader 将 Content-Disposition
标头设置为 attachment
,以增加保护,因为 API 可以提供任意远程图像。
默认值为 attachment
,它强制浏览器在直接访问时下载图像。当 dangerouslyAllowSVG
为 true 时,这一点尤其重要。
您可以选择配置 inline
,以允许浏览器在直接访问时渲染图像,而无需下载它。
module.exports = {
images: {
contentDispositionType: 'inline',
},
}
动画图像
默认的 loader 将自动绕过动画图像的图像优化,并按原样提供图像。
动画文件的自动检测是尽力而为的,并支持 GIF、APNG 和 WebP。如果您想为给定的动画图像显式绕过图像优化,请使用 unoptimized 属性。
响应式图片
默认生成的 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',
}}
/>
)
}
试用一下
具有宽高比的响应式图片
如果源图片是动态的或远程 URL,您还需要提供 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,并将其传递给另一个组件、样式、画布等。
这也可以避免调用 React useState()
,从而带来更好的性能,但它不能与 placeholder
属性一起使用,因为占位符将永远不会被移除。
主题检测 Picture
如果您想为浅色和深色模式显示不同的图片,您可以使用 <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>
)
}
Art Direction
如果您想为移动设备和桌面设备显示不同的图片,有时称为 Art Direction,您可以为 getImageProps()
提供不同的 src
、width
、height
和 quality
属性。
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>
)
}
已知的浏览器 Bug
此 next/image
组件使用浏览器原生 懒加载,对于 Safari 15.4 之前的旧版本浏览器,可能会回退到主动加载。 当使用模糊占位符时,Safari 12 之前的旧版本浏览器将回退到空占位符。 当使用 `width` / `height` 为 `auto` 的样式时,在 Safari 15 之前且不 保留宽高比 的旧版本浏览器上,可能会导致 布局偏移。 有关更多详细信息,请参阅 此 MDN 视频。
- Safari 15 - 16.3 在加载时显示灰色边框。 Safari 16.4 修复了此问题。 可能的解决方案
- 使用 CSS
@supports (font: -apple-system-body) and (-webkit-appearance: none) { img[loading="lazy"] { clip-path: inset(0.6px) } }
- 如果图片位于首屏上方,请使用
priority
- 使用 CSS
- Firefox 67+ 在加载时显示白色背景。 可能的解决方案
- 启用 AVIF
formats
- 使用
placeholder
- 启用 AVIF
版本历史
版本 | 更改 |
---|---|
v15.0.0 | contentDispositionType 配置默认值已更改为 attachment 。 |
v14.2.23 | 添加了 qualities 配置。 |
v14.2.15 | 添加了 decoding 属性,并添加了 localPatterns 配置。 |
v14.2.14 | 添加了 remotePatterns.search 属性。 |
v14.2.0 | 添加了 overrideSrc 属性。 |
v14.1.0 | getImageProps() 已稳定。 |
v14.0.0 | onLoadingComplete 属性和 domains 配置已弃用。 |
v13.4.14 | placeholder 属性支持 data:/image... |
v13.2.0 | 添加了 contentDispositionType 配置。 |
v13.0.6 | 添加了 ref 属性。 |
v13.0.0 | next/image 导入已重命名为 next/legacy/image 。 next/future/image 导入已重命名为 next/image 。 codemod 可用,以安全且自动地重命名您的导入。 删除了 <span> 包装器。 删除了 layout 、objectFit 、objectPosition 、lazyBoundary 、lazyRoot 属性。 alt 是必需的。 onLoadingComplete 接收对 img 元素的引用。 删除了内置加载器配置。 |
v12.3.0 | remotePatterns 和 unoptimized 配置已稳定。 |
v12.2.0 | 添加了实验性的 remotePatterns 和实验性的 unoptimized 配置。 删除了 layout="raw" 。 |
v12.1.1 | 添加了 style 属性。 添加了对 layout="raw" 的实验性支持。 |
v12.1.0 | 添加了 dangerouslyAllowSVG 和 contentSecurityPolicy 配置。 |
v12.0.9 | 添加了 lazyRoot 属性。 |
v12.0.0 | 添加了 formats 配置。添加了 AVIF 支持。 包装器 <div> 已更改为 <span> 。 |
v11.1.0 | 添加了 onLoadingComplete 和 lazyBoundary 属性。 |
v11.0.0 | src 属性支持静态导入。添加了 placeholder 属性。添加了 blurDataURL 属性。 |
v10.0.5 | 添加了 loader 属性。 |
v10.0.1 | 添加了 layout 属性。 |
v10.0.0 | 引入了 next/image 。 |
这对您有帮助吗?