跳至內容

<Image>

範例

注意事項:如果您使用的 Next.js 版本早於 13,您需要使用 next/legacy/image 文件,因為該元件已重新命名。

此 API 參考將幫助您了解如何使用 屬性 (props)設定選項 來設定 Image 元件。有關功能和用法,請參閱 Image 元件 頁面。

app/page.js
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 元件可用屬性的摘要

屬性 (Prop)範例類型狀態
來源 (src)src="/profile.png"字串必要
寬度 (width)width={500}整數 (像素)必要
高度 (height)height={500}整數 (像素)必要
替代文字 (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"字串-
模糊資料 URL (blurDataURL)blurDataURL="data:image/jpeg..."字串-
覆寫來源 (overrideSrc)overrideSrc="/seo.png"字串-

必要屬性

Image 元件需要以下屬性:srcaltwidthheight(或 fill)。

app/page.js
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

必須是以下其中一種

  • 一個靜態匯入的圖片檔案
  • 一個路徑字串。這可以是絕對的外部 URL,也可以是內部路徑,取決於 loader 屬性。

使用預設的 loader 時,也請考慮以下的來源圖片

  • 當 src 是外部 URL 時,您也必須設定 remotePatterns
  • 當 src 是 動畫 或不是已知格式 (JPEG、PNG、WebP、AVIF、GIF、TIFF) 時,圖片將會按原樣提供
  • 當 `src` 為 SVG 格式時,除非啟用 unoptimized 或 [dangerouslyAllowSVG`](#dangerouslyallowsvg),否則將會被阻擋。

width

width 屬性代表圖片的*固有*寬度(以像素為單位)。此屬性用於推斷圖片的正確長寬比,並避免載入期間版面偏移。它並不決定圖片的渲染大小,渲染大小由 CSS 控制,類似於 HTML <img> 標籤中的 width 屬性。

此屬性為必需,但 靜態匯入的圖片 或具有 fill 屬性 的圖片除外。

height

height 屬性代表圖片的*固有*高度(以像素為單位)。此屬性用於推斷圖片的正確長寬比,並避免載入期間版面偏移。它並不決定圖片的渲染大小,渲染大小由 CSS 控制,類似於 HTML <img> 標籤中的 height 屬性。

此屬性為必需,但 靜態匯入的圖片 或具有 fill 屬性 的圖片除外。

注意事項

  • widthheight 屬性會一起用於決定圖片的長寬比,瀏覽器會使用此長寬比在圖片載入前預留空間。
  • 固有大小並不總是代表瀏覽器中的渲染大小,渲染大小將由父容器決定。例如,如果父容器小於固有大小,圖片將會縮小以適應容器。
  • 當寬度和高度未知時,您可以使用 fill 屬性。

alt

alt 屬性用於向螢幕閱讀器和搜尋引擎描述圖片。如果圖片已被停用或載入圖片時發生錯誤,它也會作為替代文字。

它應該包含可以在不改變頁面含義的情況下取代圖片的文字。它不應作為圖片的補充說明,也不應重複圖片上方或下方標題中已提供的資訊。

如果圖片只是裝飾性的非使用者所需,則 alt 屬性應設為空字串 (alt="")。

了解更多

選用屬性

<Image /> 元件除了必要屬性之外,還接受許多額外屬性。本節說明 Image 元件最常用的屬性。關於較少使用的屬性,請參閱進階屬性章節。

loader

用於解析圖片網址的自訂函式。

loader 是一個函式,根據以下參數返回圖片的網址字串:

以下是使用自訂 loader 的範例:

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}

一個布林值,使圖片填滿父元素,這在 widthheight 未知時很有用。

父元素*必須*指定 position: "relative"position: "fixed"position: "absolute" 樣式。

預設情況下,img 元素會自動被指定 position: "absolute" 樣式。

如果沒有套用任何樣式到圖片,圖片將會被拉伸以適應容器。您可能更傾向於設定 object-fit: "contain",讓圖片以信箱模式適應容器並保留長寬比。

或者,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 會被修剪,不包含任何過小而永遠不需要的值。

例如,如果您知道您的樣式設定會導致圖片在行動裝置上全寬,在平板電腦上採用 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 倍的圖片。

深入瞭解 srcsetsizes

quality

quality={75} // {number 1-100}

最佳化圖片的品質,一個介於 1100 之間的整數,其中 100 代表最佳品質,檔案大小也最大。預設值為 75

priority

priority={false} // {false} | {true}

當設定為 true 時,圖片將被視為高優先級並預先載入。使用 priority 的圖片會自動停用延遲載入。如果同時使用了 loading 屬性並設定為 lazy,則無法使用 priority 屬性。loading 屬性僅適用於進階使用案例。當需要 priority 時,請移除 loading

您應該在任何被偵測為最大內容繪製 (LCP) 元素的圖片上使用 priority 屬性。設定多個具有優先級的圖片可能是適當的,因為不同視埠大小的 LCP 元素可能不同。

僅應在圖片顯示於首屏時使用。預設值為 false

placeholder

placeholder = 'empty' // "empty" | "blur" | "data:image/..."

圖片載入時使用的佔位符。可能的值為 bluremptydata:image/...。預設值為 empty

當使用 blur 時,blurDataURL 屬性將會作為佔位圖使用。如果 src 是一個來自靜態導入的物件,且導入的圖片格式為 .jpg.png.webp.avif,則 blurDataURL 將會自動填入,除非偵測到圖片為動畫格式。

對於動態圖片,您必須提供 blurDataURL 屬性。諸如 Plaiceholder 等解決方案可以協助產生 base64 編碼。

當使用 data:image/... 時,在圖片載入期間,資料網址(Data URL) 將會作為佔位圖使用。

當使用 empty 時,在圖片載入期間將不會有任何佔位圖,只會顯示空白。

試用看看

進階屬性

在某些情況下,您可能需要更進階的用法。<Image /> 元件可選用以下進階屬性。

style

允許將 CSS 樣式傳遞到底層的圖片元素。

components/ProfileImage.js
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)} />

警告:自 Next.js 14 起已棄用,建議改用 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" 結合使用時才會生效。

必須是 base64 編碼的圖片。它會被放大和模糊化,因此建議使用非常小的圖片(10px 或更小)。包含較大的圖片作為預留位置可能會損害應用程式效能。

試用看看

您也可以產生純色資料網址來匹配圖片。

unoptimized

unoptimized = {false} // {false} | {true}

當設定為 true 時,來源圖片將會被按原樣提供,而不會改變品質、大小或格式。預設值為 false

import Image from 'next/image'
 
const UnoptimizedImage = (props) => {
  return <Image {...props} unoptimized />
}

從 Next.js 12.3.0 版本開始,可以透過在 next.config.js 中使用以下設定來將此屬性套用至所有圖片:

next.config.js
module.exports = {
  images: {
    unoptimized: true,
  },
}

overrideSrc

當提供 src 屬性給 <Image> 元件時,產生的 <img> 標籤會自動產生 srcsetsrc 屬性。

input.js
<Image src="/me.jpg" />
output.html
<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> 時,您可能希望保留相同的 src 屬性以利於 SEO,例如圖片排名或避免重新爬取。

input.js
<Image src="/me.jpg" overrideSrc="/override.jpg" />
output.html
<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 元素,但以下例外

設定選項 localPatterns

您可以選擇在 next.config.js 檔案中設定 localPatterns,以允許最佳化特定路徑並封鎖所有其他路徑。

next.config.js
module.exports = {
  images: {
    localPatterns: [
      {
        pathname: '/assets/images/**',
        search: '',
      },
    ],
  },
}

注意事項:以上範例將確保 next/imagesrc 屬性必須以 /assets/images/ 開頭,且不得包含查詢字串。嘗試最佳化任何其他路徑將會回傳 400 Bad Request 錯誤。

remotePatterns

為了保護您的應用程式免受惡意使用者的攻擊,需要進行設定才能使用外部圖片。這可確保只有來自您帳戶的外部圖片才能透過 Next.js 圖片最佳化 API 提供服務。這些外部圖片可以使用 next.config.js 檔案中的 remotePatterns 屬性進行設定,如下所示

next.config.js
module.exports = {
  images: {
    remotePatterns: [
      {
        protocol: 'https',
        hostname: 'example.com',
        port: '',
        pathname: '/account123/**',
        search: '',
      },
    ],
  },
}

注意事項:上述範例將確保 next/imagesrc 屬性必須以 https://example.com/account123/ 開頭,且不得包含查詢字串。任何其他協議、主機名稱、連接埠或不符合的路徑都將回傳 400 Bad Request 錯誤。

以下是 next.config.js 檔案中使用萬用字元模式設定 hostnameremotePatterns 屬性範例

next.config.js
module.exports = {
  images: {
    remotePatterns: [
      {
        protocol: 'https',
        hostname: '**.example.com',
        port: '',
        search: '',
      },
    ],
  },
}

注意事項:上述範例將確保 next/imagesrc 屬性必須以 https://img1.example.comhttps://me.avatar.example.com 或任何子網域開頭。它不能包含連接埠或查詢字串。任何其他協議或不符合的主機名稱都將回傳 400 Bad Request 錯誤。

萬用字元模式可用於 pathnamehostname,並具有以下語法

  • * 匹配單個路徑區段或子網域
  • ** 匹配結尾處的任意數量路徑區段或開頭處的任意數量子網域

** 語法不能用於模式中間。

注意事項:省略 protocolportpathnamesearch 時,將隱含使用萬用字元 **。不建議這樣做,因為它可能允許惡意行為者最佳化您並不想允許的 URL。

以下是 next.config.js 檔案中使用 search 設定 remotePatterns 屬性的範例

next.config.js
module.exports = {
  images: {
    remotePatterns: [
      {
        protocol: 'https',
        hostname: 'assets.example.com',
        search: '?v=1727111025337',
      },
    ],
  },
}

注意事項:上述範例將確保 next/imagesrc 屬性必須以 https://assets.example.com 開頭,且必須包含完全相同的查詢字串 ?v=1727111025337。任何其他協議或查詢字串都將回傳 400 Bad Request 錯誤。

domains

警告:自 Next.js 14 起已棄用,建議使用更嚴格的 remotePatterns 以保護您的應用程式免受惡意使用者攻擊。僅在您擁有網域中所有內容的情況下才使用 domains

remotePatterns 類似,domains 設定可用於提供允許的外部圖片主機名稱清單。

但是,domains 設定不支援萬用字元模式匹配,也無法限制協議、連接埠或路徑名稱。

以下是 next.config.js 檔案中 domains 屬性的範例

next.config.js
module.exports = {
  images: {
    domains: ['assets.acme.com'],
  },
}

loaderFile

如果您想使用雲端供應商來最佳化圖片,而不是使用 Next.js 內建的圖片最佳化 API,您可以在 next.config.js 中設定 loaderFile,如下所示

next.config.js
module.exports = {
  images: {
    loader: 'custom',
    loaderFile: './my/image/loader.js',
  },
}

這必須指向 Next.js 應用程式根目錄的相對檔案路徑。該檔案必須匯出一個預設函式,該函式返回一個字串,例如:

my/image/loader.js
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 屬性時,會使用這些寬度,以確保為使用者的裝置提供正確的圖片。

如果未提供設定,則使用以下預設值。

next.config.js
module.exports = {
  images: {
    deviceSizes: [640, 750, 828, 1080, 1200, 1920, 2048, 3840],
  },
}

imageSizes

您可以在 next.config.js 檔案中使用 images.imageSizes 屬性指定圖片寬度列表。這些寬度會與 裝置尺寸 的陣列串接,以形成用於產生圖片 srcset 的完整尺寸陣列。

之所以有兩個獨立的列表,是因為 imageSizes 僅用於提供 sizes 屬性的圖片,這表示圖片寬度小於螢幕的完整寬度。因此,imageSizes 中的尺寸都應該小於 deviceSizes 中的最小尺寸。

如果未提供設定,則使用以下預設值。

next.config.js
module.exports = {
  images: {
    imageSizes: [16, 32, 48, 64, 96, 128, 256, 384],
  },
}

formats

預設的圖片最佳化 API 會自動透過請求的 Accept 標頭偵測瀏覽器支援的圖片格式,以決定最佳的輸出格式。

如果 Accept 標頭符合多個已設定的格式,則會使用陣列中第一個符合的格式。因此,陣列的順序很重要。如果沒有符合的格式(或者來源圖片是動畫),圖片最佳化 API 會 fallback 到原始圖片的格式。

如果未提供設定,則使用以下預設值。

next.config.js
module.exports = {
  images: {
    formats: ['image/webp'],
  },
}

您可以啟用 AVIF 支援,並在以下設定中 fallback 到 WebP。

next.config.js
module.exports = {
  images: {
    formats: ['image/avif', 'image/webp'],
  },
}

注意事項:

  • AVIF 編碼通常需要多花 50% 的時間,但與 WebP 相比,它可以壓縮小 20%。這表示第一次請求圖片時,速度通常會比較慢,而後續快取的請求速度會比較快。
  • 如果您使用 Proxy/CDN 在 Next.js 之前自行託管,則必須設定 Proxy 轉發 Accept 標頭。

快取行為

以下描述預設 載入器 的快取演算法。對於所有其他載入器,請參閱您的雲端供應商的說明文件。

圖片會根據請求動態最佳化,並儲存在 <distDir>/cache/images 目錄中。最佳化的圖片檔案將會提供給後續的請求,直到到期為止。當發出與快取但已過期的檔案相符的請求時,系統會立即提供過期的圖片。然後,系統會在背景中重新最佳化圖片(也稱為重新驗證),並使用新的到期日儲存到快取中。

可以透過讀取 x-nextjs-cache 回應標頭的值來判斷圖片的快取狀態。可能的值如下:

  • MISS - 路徑不在快取中(最多只會發生一次,在第一次訪問時)
  • STALE - 路徑在快取中,但已超過重新驗證時間,因此將會在背景中更新
  • HIT - 路徑在快取中,且尚未超過重新驗證時間

到期時間(或稱最大存留期)由 minimumCacheTTL 設定或上游圖片的 Cache-Control 標頭定義,以較大者為準。具體來說,使用的是 Cache-Control 標頭的 max-age 值。如果同時找到 s-maxagemax-age,則優先使用 s-maxagemax-age 也會傳遞給任何下游用戶端,包括 CDN 和瀏覽器。

  • 當上游圖片未包含 Cache-Control 標頭或其值非常低時,您可以設定 minimumCacheTTL 來增加快取持續時間。
  • 您可以設定 deviceSizesimageSizes 來減少可能產生的圖片總數。
  • 您可以設定 formats 來停用多種格式,以利於單一圖片格式。

minimumCacheTTL

您可以設定已最佳化快取圖片的存活時間 (TTL),單位為秒。在大多數情況下,最好使用靜態圖片導入,它會自動雜湊檔案內容,並使用 Cache-Control 標頭設定為 immutable 永久快取圖片。

next.config.js
module.exports = {
  images: {
    minimumCacheTTL: 60,
  },
}

最佳化圖片的到期時間(或最大存活時間)由 minimumCacheTTL 或上游圖片的 Cache-Control 標頭決定,以較大者為準。

如果您需要針對每張圖片更改快取行為,您可以設定 headers 來設定上游圖片(例如 /some-asset.jpg,而不是 /_next/image 本身)的 Cache-Control 標頭。

目前沒有機制可以讓快取失效,因此最好將 minimumCacheTTL 保持在較低的值。否則,您可能需要手動更改 src 屬性或刪除 <distDir>/cache/images

disableStaticImages
next.config.js
module.exports = {
  images: {
    disableStaticImages: true,
  },
}

dangerouslyAllowSVG

預設的 載入器 不會最佳化 SVG 圖片,原因有幾個。首先,SVG 是一種向量格式,這意味著它可以無損地調整大小。其次,SVG 擁有許多與 HTML/CSS 相同的功能,如果沒有適當的 內容安全策略 (CSP) 標頭,可能會導致漏洞。

因此,我們建議在 src 屬性已知為 SVG 時使用 unoptimized 屬性。當 src".svg" 結尾時,會自動執行此操作。

但是,如果您需要使用預設的圖片最佳化 API 提供 SVG 圖片,您可以在 next.config.js 中設定 dangerouslyAllowSVG

next.config.js
module.exports = {
  images: {
    dangerouslyAllowSVG: true,
    contentDispositionType: 'attachment',
    contentSecurityPolicy: "default-src 'self'; script-src 'none'; sandbox;",
  },
}

此外,強烈建議同時設定 contentDispositionType 強制瀏覽器下載圖片,以及設定 contentSecurityPolicy 以防止嵌入在圖片中的腳本執行。

contentDispositionType

預設的 載入器 會將 Content-Disposition 標頭設為 attachment,因為 API 可以提供任意遠端圖片,所以增加了額外的保護。

預設值為 attachment,這會強制瀏覽器在直接訪問時下載圖片。當 dangerouslyAllowSVG 為 true 時,這一點尤其重要。

您可以選擇設定 inline,允許瀏覽器在直接訪問時渲染圖片,而無需下載。

next.config.js
module.exports = {
  images: {
    contentDispositionType: 'inline',
  },
}

動態圖片 載入器 會自動繞過動態圖片的圖片優化,並按原樣提供圖片。

動態檔案的自動偵測會盡力而為,並支援 GIF、APNG 和 WebP。如果您想明確繞過特定動態圖片的圖片優化,請使用 unoptimized 屬性。

響應式圖片 sizes 以及 style(或 className)。

您可以使用以下方法之一來渲染響應式圖片。

使用靜態匯入的響應式圖片
components/author.js
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',
      }}
    />
  )
}

試用看看

具備長寬比的響應式圖片

如果圖片來源是動態或遠端網址,您還需要提供 widthheight 來設定響應式圖片的正確長寬比。

components/page.js
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 樣式。

app/page.js
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 媒體查詢顯示正確的圖片。

components/theme-image.module.css
.imgDark {
  display: none;
}
 
@media (prefers-color-scheme: dark) {
  .imgLight {
    display: none;
  }
  .imgDark {
    display: unset;
  }
}
components/theme-image.tsx
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" 的預設行為確保只載入正確的圖片。您不能使用 priorityloading="eager",因為這會導致兩個圖片都被載入。您可以改用 fetchPriority="high"

試用看看

取得圖片屬性 getImageProps

針對更進階的應用場景,您可以呼叫 getImageProps() 來取得會傳遞給底層 <img> 元素的屬性,並將這些屬性傳遞給其他元件、樣式、畫布等等。

這樣也可以避免呼叫 React 的 useState(),進而提升效能,但它不能與 placeholder 屬性一起使用,因為預留位置永遠不會被移除。

主題偵測圖片

如果您想要針對淺色和深色模式顯示不同的圖片,您可以使用 <picture> 元素,根據使用者偏好的色彩配置來顯示不同的圖片。

app/page.js
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>
  )
}

美術指導

如果您想要針對行動裝置和桌面顯示不同的圖片(有時稱為 美術指導),您可以提供不同的 srcwidthheightquality 屬性給 getImageProps()

app/page.js
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 image-set() CSS 函式來最佳化背景圖片。

app/page.js
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 影片

版本歷史

版本變更
v15.0.0新增 decoding 屬性。 contentDispositionType 設定預設值變更為 attachment
v14.2.0新增 overrideSrc 屬性。
v14.1.0getImageProps() 已穩定。
v14.0.0onLoadingComplete 屬性和 domains 設定已棄用。
v13.4.14placeholder 屬性支援 data:/image...
v13.2.0新增 contentDispositionType 設定。
v13.0.6新增 ref 屬性。
v13.0.0next/image 匯入已重新命名為 next/legacy/imagenext/future/image 匯入已重新命名為 next/image。 提供了程式碼修改器來安全且自動地重新命名您的匯入。 移除 <span> 包裝器。 移除 layoutobjectFitobjectPositionlazyBoundarylazyRoot 屬性。 alt 為必要項。 onLoadingComplete 會接收 img 元素的參考。 移除內建載入器設定。
v12.3.0remotePatternsunoptimized 設定已穩定。
v12.2.0新增實驗性 remotePatterns 和實驗性 unoptimized 設定。 移除 layout="raw"
v12.1.1新增 style 屬性。 新增對 layout="raw" 的實驗性支援。
v12.1.0新增 dangerouslyAllowSVGcontentSecurityPolicy 設定。
v12.0.9新增 lazyRoot 屬性。
v12.0.0新增 formats 設定。
新增 AVIF 支援。
包裝器 <div> 已變更為 <span>
v11.1.0新增 onLoadingCompletelazyBoundary 屬性。
v11.0.0src 屬性支援靜態匯入。
新增 placeholder 屬性。
新增 blurDataURL 屬性。
v10.0.5新增 loader 屬性。
v10.0.1新增 layout 屬性。
v10.0.0推出 next/image