1441 字
7 分鐘

Chrome 154 responsive iframe:用 frame-sizing 取代手動高度同步

如果 iframe 內的文章、付款表單或互動元件高度不固定,常見做法是讓子頁面用 postMessage 回報高度,再由父頁面修改 iframe 的 height。這套流程需要自己處理來源驗證、載入時機、內容變動與重複通知。

Chrome for Developers 在 2026 年 9 月 16 日介紹 Chrome 154 的 responsive iframe sizing:父頁面可以用 frame-sizing 指定 iframe 依內容尺寸調整,嵌入頁面則要用 responsive-embedded-sizing meta 宣告允許的來源。這不是所有瀏覽器立即共用的通用解法,因此仍要保留 fallback 和版面位移檢查。

先分清楚它解決的是哪一段 iframe 問題#

frame-sizing 主要處理「父頁面不知道嵌入內容應有多高或多寬」這件事。它不會自動替你解決:

  • iframe 內的登入、權限或 CORS 問題。
  • 內容本身載入失敗、圖片沒有尺寸或字型晚到造成的版面變化。
  • 其他瀏覽器或舊版 Chrome 對新 CSS property 的支援。
  • 父頁面刻意限制高度時的捲動與互動設計。

如果你的需求其實是移動 DOM 節點但保留 iframe 狀態,請先看moveBefore() 移動 DOM 並保留狀態;那和 iframe 依內容調整尺寸是不同問題。

最小設定:父頁面加上 frame-sizing#

先在父頁面給 iframe 一個明確的寬度,再選擇要跟隨內容的尺寸:

<iframe
class="embed"
src="https://embed.example/article"
title="嵌入文章"
></iframe>
.embed {
width: 100%;
frame-sizing: content-height;
}

content-height 適合寬度已由父頁面決定、但內容高度會變動的文章或元件。官方也列出 content-widthcontent-inline-sizecontent-block-size 等方向;實際選擇要配合你的 writing mode、版面限制與使用情境,不要把所有 iframe 都套成同一個值。

子頁面必須先 opt-in#

嵌入內容要在載入前宣告允許哪些父頁面使用 responsive sizing。若只在自己的網站嵌入,可以把來源寫得更窄:

<head>
<meta
name="responsive-embedded-sizing"
content="allow-origins=https://publisher.example"
/>
</head>

allow-origins=* 可以用於需要接受多個來源的嵌入服務,但它會放寬允許範圍。若來源集合可預先知道,優先列出明確 origin,並且不要把這個宣告誤當成 iframe 的內容安全政策;frame-ancestors、CSP、登入與資料權限仍要獨立設定。

這個 meta 宣告不能等頁面載入後才由 JavaScript 動態補上來補救。把它放在嵌入文件的 <head>,並讓父頁面以正式的 src 載入,才能讓瀏覽器在初始載入階段取得 opt-in 狀態。

內容變動時用 requestResize 通知#

初次載入以外,嵌入內容可能因展開 FAQ、切換分頁或非同步資料而改變高度。Chrome 官方說明可以在內容更新後呼叫 window.requestResize()

function renderExtraContent(html) {
document.querySelector('#content').insertAdjacentHTML('beforeend', html);
if ('requestResize' in window) {
window.requestResize();
}
}

這段程式碼是示意範本,重點是把通知放在「內容已更新」的邊界,而不是每個 scrollresize 或動畫 frame 都呼叫。若你的內容由多個非同步來源組成,可以在一次 render batch 完成後統一通知,避免不必要的尺寸更新。

舊瀏覽器要保留可用的 fallback#

新 property 不應成為 iframe 唯一的可用路徑。可以用 feature query 讓支援的瀏覽器套用 responsive sizing,其他瀏覽器則保留預設高度:

.embed {
width: 100%;
min-height: 240px;
}
@supports (frame-sizing: content-height) {
.embed {
frame-sizing: content-height;
min-height: 0;
}
}

min-height 不是精確的高度同步,但可以避免舊瀏覽器把 iframe 壓成看不見的區域。若你仍需要支援完整的舊瀏覽器體驗,再保留原本的 postMessage 流程,並將它當作 fallback,而不是在新舊兩套程式碼中同時無條件修改高度。

先檢查 CLS,再決定是否全面套用#

內容依載入結果改變尺寸,可能把父頁面下方內容推開。這使 responsive iframe 不只是 CSS 相容性問題,也涉及 Core Web Vitals:

  1. 先為首屏 iframe 預留合理的 min-height 或版面空間。
  2. 對圖片、廣告和非同步區塊提供穩定尺寸,減少內容自己反覆變高。
  3. 在 Chrome 154 和主要 fallback 瀏覽器分別觀察載入、展開互動與返回頁面的版面位移。
  4. 若 iframe 本身是低優先內容,評估延後載入是否比立即調整高度更穩定。

不要因為 frame-sizing 省掉了 postMessage,就直接刪除現有監控。先以一個嵌入頁面做對照,確認高度、捲動、鍵盤操作與 CLS 都符合預期,再擴大使用範圍。

這項功能適合什麼時候採用#

適合採用的情境是:你能控制嵌入文件、父頁面與來源清單,而且主要問題是內容尺寸會隨資料改變。不適合直接採用的情境是:嵌入來源不可修改、瀏覽器支援範圍極廣,或既有 postMessage 已經有完整的安全驗證與穩定性監控。

Q: 加上 frame-sizing 後,所有瀏覽器都會自動調整 iframe 高度嗎?#

A: 不會。這是 Chrome 154 的新能力,仍要依實際瀏覽器支援保留固定高度或 postMessage fallback,並以 feature query 逐步套用。

Q: 跨來源 iframe 可以使用 responsive sizing 嗎?#

A: 可以在官方設計的 opt-in 流程下使用,但嵌入文件仍須在 meta 中列出允許的父頁面來源。allow-origins=* 不是預設最佳答案;能明確限制來源時,應使用明確 origin。

Q: requestResize() 可以每次 DOM 變動都呼叫嗎?#

A: 不建議。把它放在一次內容更新完成後的邊界,並合併同一批非同步變更;反覆通知只會增加尺寸更新和版面變動的機會。

參考資料:

Chrome 154 responsive iframe:用 frame-sizing 取代手動高度同步
https://laplusda.com/posts/chrome-154-responsive-iframe-sizing/
作者
Zero
發佈於
2026-09-22
許可協議
CC BY-NC-SA 4.0