iframe 的尺寸 · 让内容决定高度
<div> 的高度由内容决定,<iframe> 不是。它是一个替换元素,默认尺寸 300 × 150,内嵌文档再长也只会出现一条内部滚动条。这个设计有它的理由:跨源 iframe 的内容尺寸本身就是信息,外层页面若能读到它,就能推断出用户在另一个站点上的登录状态或内容长短。
评论组件、嵌入式代码演示、第三方表单都需要 iframe 跟着内容长高。2016 年 whatwg/html#555 与 2017 年 CSSWG #1771 先后提出这件事,在规范落地之前,通行的做法是内嵌文档用 ResizeObserver 量自己的高度,再用 postMessage 告诉外层去改 height。Chrome 154(2026-09)实现了 CSS Sizing 4 的 frame-sizing:外层声明愿意按内容定尺寸,内嵌文档用 <meta name="responsive-embedded-sizing"> 声明愿意公开尺寸,两边都同意才生效。
每页都在真实的 iframe 上实测,内嵌文档由 lab 现场拼成 srcdoc。正文里的读数出自 Chrome 154;其中 <meta> 的写法、iframe 的懒加载提前量两处与规范文本或图片的行为不同,分别在 frame-sizing 与 懒加载 两页写明。
按内容定尺寸
frame-sizing 与 <meta name="responsive-embedded-sizing"> 的双向约定,尺寸何时计算,以及内容变化后如何用 requestResize() 更新。
frame-sizing:双方同意才按内容定高
外层用 frame-sizing 声明愿意按内容定尺寸,内嵌文档用一条 <meta> 声明愿意公开尺寸,缺一不可。实测这条 <meta> 必须带 allow-origins,且须出现在 <body> 之前。
requestResize() 与锁定的 ICB
加载后的内容变化要由内嵌文档调用 requestResize() 才会反映到 iframe 上。尺寸取滚动区域,下限是首次布局时锁定的视口高度;100vh 内容按锁定值计算,循环由此切断,代价是内部滚动条。
加载与旧方案
iframe 的 loading="lazy" 与占位,以及 postMessage 方案的写法、它为什么会陷入循环,和两套方案的衔接。
iframe 的懒加载与占位
iframe 与图片共用 loading,提前量却不同:iframe 纵横都是 2500px,图片是 1250 与 625。srcdoc 与 blob: 的 iframe 无视 lazy。按内容定高的跳变多发生在视口之外。
postMessage 旧方案与渐进增强
旧方案由内嵌文档用 ResizeObserver 量高度、postMessage 通知外层改 height,实时且跨浏览器,遇到 100vh 却会循环增长。推荐以 frame-sizing 为主、旧方案为回退。
相关链接
规范与讨论
-
CSS Sizing 4 · Responsively-sized iframes
CSSWG
frame-sizing的定义、responsive embedded sizing flag、locked embedded ICB size 与requestResize()的算法。本系列引用的「规范文本」取自此处(核对于 2026-09)。 - Responsively-sized iframes · explainer CSSWG 用例、隐私考量与双向同意的设计理由。
-
Add <meta name="responsive-embedded-sizing"> · whatwg/html#12444
GitHub
把
<meta>名称登记进 HTML 的 PR,2026-05 提出,尚未合入(核对于 2026-09)。 - Allow auto-resize on iframe · whatwg/html#555 GitHub 2016-01 在 HTML 一侧提出的需求。
-
[css-sizing] Auto-resize iframes based on content · csswg-drafts#1771
GitHub
2017-08 在 CSS 一侧提出的需求,
frame-sizing的直接来源。 - Responsive iframes · interop#1443 GitHub 2026-09 提交的 Interop 2027 focus area 提案。提案记录 Chromium 已实现,Gecko 与 WebKit 均未实现、也没有 standards position(核对于 2026-09)。
-
css/css-sizing/responsive-iframe
wpt.fyi
上述提案引用的测试集,逐项给出
allow-origins各种写法的期望高度,也覆盖<meta>的动态插入、改名、删除与跨源嵌入。 -
HTML · Lazy loading attributes
WHATWG
loading属性对<img>与<iframe>共用同一套定义。
文章与 MDN
-
iframe の高さをコンテンツに合わせる CSS の frame-sizing
azukiazusa.dev
本系列的起点,
frame-sizing与requestResize()的日文介绍。 - <iframe> MDN 全部属性与兼容性矩阵。
-
Window.postMessage()
MDN
旧方案的通信基础,以及校验
origin的安全要求。
同站
- loading:懒加载的提前量 同站 图片懒加载的实测,与本系列 iframe 的读数对照。
-
field-sizing content
同站
表单控件的「尺寸跟随内容」,与
frame-sizing同一思路。