レスポンシブ iframe
— iframe がコンテンツのサイズに自動で追従する

Chrome 154 で導入された新しい仕組み CSS frame-sizing<meta name="responsive-embedded-sizing">window.requestResize() を体験できるデモページです。 従来は postMessage などの手動実装や iframe-resizer のようなライブラリが必要だった 「埋め込みコンテンツへの高さ合わせ」が、標準の CSS だけでできるようになります。

判定中… このブラウザの対応状況を判定しています。

概要 — 2 つの部品で構成される

従来の iframe は既定でサイズが固定のため、内容がはみ出せばスクロールバーが出て、 少なければ余白が残ります。新しい仕組みでは「埋め込まれる側がサイズの公開を許可」し、 「埋め込み側が CSS でそのサイズを採用する」という 2 ステップで、クロスオリジンでも postMessage なしにサイズが同期されます。

埋め込まれる側(子ページ)
オプトイン <meta name="responsive-embedded-sizing">

「自分のレイアウトサイズを親に公開してよい」ことを宣言します。 content="allow-origins=…" で許可するオリジンを絞れます。

埋め込み側(親ページ)
CSS frame-sizing

iframe の width / height を子文書のレイアウトサイズに合わせます。 子側がオプトインしていない場合は従来どおり固定サイズになります。

このデモは HTTP サーバー経由で閲覧してください (例: python3 -m http.server 8000http://localhost:8000/)。 file:// で開くとオリジンの扱いの関係で正しく動作しない場合があります。
01

高さをコンテンツに自動合わせ — frame-sizing: content-block-size

同じ子ページ child-basic.html を、固定高さの iframe と frame-sizing: content-block-size を指定した iframe にそれぞれ埋め込んだ比較です。 右側はスクロールバーなしで文書全体が収まり、iframe の高さが内容の高さと一致します。

従来height 固定 — はみ出した分はスクロールバー
child-basic.html – × –
新仕様frame-sizing — 高さが内容にぴったり追従
child-basic.html – × –
親ページ側のコード
<!-- 従来: 高さが固定なので、内容が多いとスクロールバーが出る -->
<iframe class="traditional" src="child-basic.html"></iframe>

<!-- 新仕様: 高さが子文書のレイアウトサイズに自動追随 -->
<iframe class="fit" src="child-basic.html"></iframe>

<style>
  .traditional { height: 320px; }

  .fit {
    width: 100%;
    height: 480px;                        /* 未対応ブラウザ向けフォールバック */
    frame-sizing: content-block-size;     /* 高さを子文書に合わせる(既定値は auto) */
  }
</style>

子ページ側には次の 1 行を入れておく必要があります(理由はデモ 02 へ)。

<!-- child-basic.html 内 -->
<meta name="responsive-embedded-sizing" content="allow-origins=*">
02

オプトインが必須 — meta タグの有無で挙動が変わる

どちらの iframe にも同じ CSS(frame-sizing: content-block-size)を指定しています。 しかし右側の子ページには responsive-embedded-sizing メタタグがないため、 サイズは公開されず、従来どおり固定サイズで表示されます。 「親が子のサイズを勝手に測る」ことはできない、というセキュリティ設計です。

子: meta ありサイズが公開され自動リサイズ
child-basic.html – × –
子: meta なしサイズ非公開のため固定のまま
child-no-meta.html – × –
親ページ側のコード(両方とも同じ CSS)
<style>
  .opt-frame {
    width: 100%;
    height: 480px;                      /* フォールバック */
    frame-sizing: content-block-size;
  }
</style>

<iframe class="opt-frame" src="child-basic.html"></iframe>    <!-- 子: meta あり → 自動リサイズ -->
<iframe class="opt-frame" src="child-no-meta.html"></iframe>  <!-- 子: meta なし → 固定のまま -->
03

動的なリサイズ — window.requestResize()

読み込み時(DOMContentLoaded / load)のサイズはブラウザが自動で報告してくれますが、 それ以降に JavaScript で内容が変わった場合は、子ページの中から window.requestResize() を呼んで「レイアウトサイズが変わった」ことを伝える必要があります。 下の iframe 内のボタンで行を増減してみてください。iframe の高さが追従します。

child-dynamic.html – × –
子ページ(child-dynamic.html)側のスクリプト
addButton.addEventListener('click', () => {
  list.appendChild(createItem());
  window.requestResize();   // レイアウトサイズが変わったことを親に通知
});

removeButton.addEventListener('click', () => {
  list.lastElementChild?.remove();
  window.requestResize();
});

// 初回のサイズ報告はブラウザが DOMContentLoaded / load のタイミングで
// 自動で行うため、読み込み時に呼ぶ必要はない
04

幅をコンテンツに自動合わせ — frame-sizing: content-inline-size

高さだけでなく幅も合わせられます。子文書側が width: max-content で固有の幅を持つようにレイアウトし、 iframe には frame-sizing: content-inline-size を指定すると、 iframe の幅が子文書の幅に追従します。iframe 内のボタンでパネル幅を変更してみてください。

child-inline.html – × –
親ページ / 子ページ側のコード
<!-- 親ページ -->
<style>
  .wfit {
    width: 100%;                        /* フォールバック */
    height: 250px;
    frame-sizing: content-inline-size;  /* 幅を子文書に合わせる */
  }
</style>
<iframe class="wfit" src="child-inline.html"></iframe>

<style>
  /* 子ページ(child-inline.html): 文書自体に固有の幅を持たせる */
  html, body { width: max-content; }
</style>

<script>
  // 子ページ内: ボタンでパネル幅を変更したら通知
  panel.style.width = '480px';
  window.requestResize();
</script>
Re

リファレンス

frame-sizing の値

iframe などの埋め込み要素に指定します。値は 1 つだけ指定でき、対応する方向の width / height を上書きします。

意味
auto初期値。子文書のレイアウトサイズの影響を受けず、従来どおり指定したサイズで表示されます。
content-widthiframe の width を子文書のレイアウト幅に合わせます。
content-heightiframe の height を子文書のレイアウト高さに合わせます。
content-inline-size論理プロパティ版。inline-size(横書きでは幅)を子文書に合わせます。
content-block-size論理プロパティ版。block-size(横書きでは高さ)を子文書に合わせます。

content-inline-size / content-block-size は iframe 自身の writing-mode を参照します(子文書の書字方向ではありません)。

responsive-embedded-sizing メタタグ(埋め込まれる側)

<!-- (1) 最もシンプルなオプトイン -->
<meta name="responsive-embedded-sizing">

<!-- (2) すべてのオリジンからの埋め込みを許可 -->
<meta name="responsive-embedded-sizing" content="allow-origins=*">

<!-- (3) 許可するオリジンを個別に指定(スペース区切りで複数可) -->
<meta name="responsive-embedded-sizing"
      content="allow-origins=https://example.com https://partner.example">

許可されていないオリジンから埋め込まれた場合、frame-sizing は機能せず固定サイズのままになります。 クロスオリジンの埋め込みで使う場合は、この許可リストがセキュリティの境界になります。

window.requestResize()(埋め込まれる側)

ブラウザ対応(2026 年 9 月時点)

Chrome / Edge154+

実験的な機能として提供。chrome://flags で該当フラグを有効化する必要があります。

Firefox未対応

対応はまだ発表されていません。

Safari未対応

対応はまだ発表されていません。

仕様は CSS Box Sizing Module Level 4 / HTML Standard で議論中の実験的な機能です。Production ではフォールバックを必ず用意します。

CSS / JS による機能検出とフォールバック
/* CSS の場合 */
iframe.embed {
  width: 100%;
  height: 480px;   /* 未対応ブラウザ向けフォールバック */
}
@supports (frame-sizing: content-block-size) {
  iframe.embed { frame-sizing: content-block-size; }
}

/* JS の場合 */
if (CSS.supports('frame-sizing', 'content-block-size')) {
  // 対応している
}