メインコンテンツに移動

iframeの使い方とは?基本の書き方からレスポンシブ対応・安全な実装まで詳しく解説

iframe は、Web ページの中へ別のページや別の HTML 文書を埋め込むための仕組みです。フロントエンド開発をしていると、動画、地図、フォーム、社内ダッシュボード、外部ウィジェット、管理画面の一部、プレビュー表示などを、いま表示しているページの中へそのまま取り込みたい場面がよくあります。そのときに使われる代表的な方法の一つが iframe です。構文自体はシンプルで、<iframe> を置いて src を指定するだけでも動きます。しかし、実務では単に表示できれば十分ということはあまりありません。レイアウトへの馴染ませ方、モバイルでの見え方、表示速度、セキュリティ、親ページとの連携方法まで含めて考えないと、あとから扱いにくい埋め込みになりやすいです。

また、iframe は便利である一方で、かなり誤解されやすい要素でもあります。何でも iframe で載せられると思われることもあれば、逆に「古いから使わないほうがよい」と一括りにされることもあります。しかし、実際にはどちらも極端です。iframe は今でも実務で広く使われていますし、向いている用途では非常に有効です。ただし、向いていない場面で無理に使うと、保守性、アクセシビリティ、UI の一体感、状態管理のしやすさといった面で不利になることもあります。つまり、iframe は「使うべきかどうか」だけでなく、「どの場面で、どのような設定で使うべきか」を理解しておくことが大切です。本記事では、iframe とは何かという基礎から始めて、基本の書き方、よく使う属性、レスポンシブ対応、安全な実装、親ページとの通信、そして実務で向いているケースと向いていないケースまで、コード例を交えながら順番に詳しく解説していきます。

1. iframeとは何か

iframe は inline frame の略で、現在表示している HTML 文書の中へ、別の HTML 文書を「枠」として埋め込むための要素です。見た目としてはひとつのページの中に別ページが表示されているように見えますが、実際には親ページの DOM に別ページの HTML が直接混ざっているわけではありません。ブラウザの中では、iframe の中身は独立した別文書として扱われます。この「見た目は一体だが、実体は別文書」という性質が、iframe の便利さでもあり、扱い方を難しくする要因でもあります。

この性質があるからこそ、親ページの HTML 構造を大きく崩さずに、別システムや外部サービスの画面を埋め込むことができます。たとえば、動画プレーヤー、地図、外部予約フォーム、社内ダッシュボード、別チームが管理しているツールの一部、あるいは埋め込み型のウィジェットなどは、最初から同じ DOM の中へ組み込むより、iframe で独立させたまま表示したほうが都合がよいことがあります。つまり、iframe は単なる「別ページ表示のためのタグ」ではなく、独立した UI を現在のページの中へ安全に持ち込むためのコンテナ として理解すると分かりやすいです。

1.1 iframe で何ができるのか

iframe を使うと、外部サイトや別 HTML ファイルを、そのまま今のページの一部として表示できます。もっともよく見る例は、動画埋め込みや地図埋め込みですが、それだけではありません。社内向けの管理画面の一部、外部サービスが提供するフォーム、別アプリケーションで作られたチャットウィジェット、決済画面、分析ダッシュボード、ドキュメントプレビューなどでもよく使われます。つまり、iframe は「ページの中に別ページを表示する」という基本機能を通じて、かなり幅広い用途に対応できます。

さらに、iframe は単に表示するだけではなく、場合によっては親ページとの連携も可能です。たとえば、親ページのボタン操作をきっかけに iframe 内へ通知を送ったり、逆に iframe 内で起きた操作結果を親ページへ返したりできます。このような連携には postMessage が使われることが多いです。つまり、iframe は単なる受け身の埋め込みではなく、適切に設計すれば独立性を保ちながらやり取りもできる要素 です。

1.2 どんな場面で向いているのか

iframe が向いているのは、まず「別物として動いているページや機能を、そのまま載せたい場面」です。たとえば、自分たちのチームが管理していない外部サービス、別のチームが運用しているダッシュボード、すでに完成している予約フォームなどを、自分たちのページの一部として見せたい場合には非常に便利です。このとき、わざわざその UI を自前で再実装しなくても、既存のページをそのまま表示できるからです。つまり、iframe は「既存資産をそのまま活かしたい」ときに強い方法です。

一方で、ページの主要な本文や、親ページと一体化した UI を作りたい場面にはあまり向いていません。親ページと iframe 内は別文書なので、見た目の統一、サイズの同期、状態共有、アクセシビリティ上の流れの自然さを保つのが面倒になりやすいからです。つまり、iframe は万能ではなく、「独立性がメリットになる場面」でこそ価値が高いと考えるべきです。

2. iframe の基本的な書き方

iframe の基本構文はとても単純です。HTML に <iframe> 要素を書き、src 属性へ表示したいページの URL を指定します。それだけでも別ページは表示できます。ただし、実務ではこれだけでは不十分なことが多いです。少なくとも title を付けて iframe の内容が何なのかを明示し、必要に応じて widthheightloadingsandbox などを設定したほうがよいです。とくに title はアクセシビリティのためにも重要で、支援技術が iframe の役割を理解しやすくなります。つまり、構文は簡単でも、「どういう埋め込みなのか」を明示するための属性は最初から意識したほうがよいです。

また、埋め込む URL は何でもよいわけではありません。外部サイトの中には、そもそも iframe 埋め込みを禁止しているものもあります。X-Frame-OptionsContent-Security-Policy などの制御によって、別サイトから枠内表示されることを拒否している場合があるからです。そのため、「ブラウザで普通に開ける URL なら iframe でも表示できる」とは限りません。学習や動作確認では、自分で用意した HTML ファイルや srcdoc を使うと安定して試しやすいです。

2.1 最小構成の基本例

まずは、もっとも分かりやすい最小構成の例です。親ページと埋め込みページの 2 ファイルを用意し、同じフォルダへ置いて読み込みます。外部サービスの制限を気にせず確実に確認できるため、学習用としても非常に扱いやすいです。

parent.html

<!doctype html>
<html lang="ja">
 <head>
   <meta charset="UTF-8" />
   <title>iframe basic example</title>
 </head>
 <body>
   <h1>親ページ</h1>

   <iframe
     src="./embedded.html"
     title="埋め込みサンプル"
     width="600"
     height="300">
   </iframe>
 </body>
</html>

embedded.html

<!doctype html>
<html lang="ja">
 <head>
   <meta charset="UTF-8" />
   <title>embedded page</title>
   <style>
     body {
       font-family: sans-serif;
       margin: 0;
       padding: 24px;
       background: #f5f5f5;
     }
   </style>
 </head>
 <body>
   <h2>埋め込みページ</h2>
   <p>これは iframe の中に表示されている別ページです。</p>
 </body>
</html>

この例では、親ページの中に embedded.html が表示されます。ここで押さえておきたいのは、見た目には親ページの一部に見えても、埋め込まれているのは別 HTML だということです。そのため、iframe 内の CSS や JavaScript は、親ページとは別の文書として動きます。つまり、この最小例は iframe の基本的な独立性を理解するのにとても向いています。

2.2 srcdoc を使ったすぐ試せる例

別ファイルを作るのではなく、まず 1 ファイルだけで手早く試したい場合は srcdoc が便利です。srcdoc を使うと、iframe 内に表示する HTML を直接属性へ書き込めます。サンプルやデモを作るときには非常に扱いやすく、外部ファイルの準備も不要です。

<!doctype html>
<html lang="ja">
 <head>
   <meta charset="UTF-8" />
   <title>iframe srcdoc example</title>
 </head>
 <body>
   <h1>srcdoc の例</h1>

   <iframe
     title="srcdoc サンプル"
     width="100%"
     height="220"
     srcdoc='
       <!doctype html>
       <html lang="ja">
         <body style="font-family:sans-serif;padding:24px;margin:0;background:#eef6ff;">
           <h2>iframe 内の HTML</h2>
           <p>この内容は srcdoc で直接書かれています。</p>
         </body>
       </html>
     '>
   </iframe>
 </body>
</html>

この方法なら、外部 URL の制限や別ファイル管理を気にせず、その場で iframe の振る舞いを試せます。もちろん実務で大きな埋め込み UI を srcdoc で管理することはあまりありませんが、学習やデモ、ちょっとしたプレビュー用途ではかなり便利です。つまり、srcdoc は「iframe の仕組みをまず理解する」ための入り口として優秀です。

3. よく使う属性とその意味

iframe を実務で使うとき、src とサイズ指定だけで済ませてしまうのはあまりおすすめできません。なぜなら、iframe には表示方法、安全性、許可される機能、読み込みタイミングなどを制御するための重要な属性がいくつもあるからです。代表的なものとしては、titleloadingsandboxallowreferrerpolicyallowfullscreen などがあります。これらを適当に付けるのではなく、「この埋め込みに何を許可するのか」「何を制限するのか」を整理しながら設定することが大切です。つまり、iframe の属性は飾りではなく、埋め込み方そのものを決めるための本体の一部です。

また、こうした属性はアクセシビリティやセキュリティにも直結します。title がないと支援技術が内容を理解しにくくなりますし、sandbox がなければ余計な権限を与えたまま埋め込んでしまうかもしれません。loading="lazy" を付けなければ、初期表示時に重い iframe を無条件で読み込んでしまうこともあります。つまり、iframe を「動けばよい」ではなく、「ちゃんと制御された埋め込み」にするためには、属性の意味を理解しておく必要があります。

3.1 title・loading・allowfullscreen などの基本属性

まずほぼ必須に近いのが title です。これはアクセシビリティのための属性で、何の iframe なのかを支援技術へ伝える役割があります。実務では「動画プレーヤー」「お問い合わせフォーム」「埋め込み地図」など、内容が分かる具体的なタイトルを付けたほうがよいです。また、loading="lazy" を付けると、iframe が画面に近づくまで読み込みを遅らせることができるため、初期表示の負荷を下げやすくなります。さらに、動画系などでは allowfullscreen を付けることで、全画面表示を可能にできます。

<iframe
 src="./embedded.html"
 title="お問い合わせフォーム"
 width="100%"
 height="400"
 loading="lazy"
 allowfullscreen>
</iframe>

この程度の設定でも、埋め込みの役割、読み込みタイミング、全画面表示の許可といった基本的な意図をかなり明確にできます。つまり、iframe を書くときは src とサイズだけで終わらせず、まず titleloading の必要性を考える習慣を持っておくとよいです。

3.2 sandbox と referrerpolicy の意味

iframe を安全に使いたいなら、sandbox を理解しておくことは非常に重要です。sandbox を付けると、iframe 内のページに対して強い制限をかけられます。そのうえで、必要な権限だけを allow-scriptsallow-formsallow-same-originallow-popups などのトークンで個別に許可できます。つまり、何でも自由に動かすのではなく、「この埋め込みには何が必要か」を考えて最小限だけ開けるのが基本です。

一方、referrerpolicy は、親ページの参照元情報を iframe 側へどこまで送るかを制御する属性です。外部サービスを埋め込む場合、親ページの URL 情報をどの程度渡したいか、あるいは渡したくないかを調整できます。プライバシーや情報漏えいの観点からも、埋め込み先に応じて設定を見直したほうがよいことがあります。

<iframe
 src="./embedded.html"
 title="制限付きの埋め込み"
 width="100%"
 height="300"
 sandbox="allow-scripts allow-forms"
 referrerpolicy="strict-origin-when-cross-origin">
</iframe>

この例では、スクリプトとフォーム送信だけを許可し、それ以外の不要な権限はかなり抑えています。つまり、sandbox と referrerpolicy は「つけるかどうか」ではなく、「何をどこまで許可するか」を設計するための属性だと理解するべきです。

4. レスポンシブ対応の考え方

iframe を実務で使うとき、かなり高い頻度で問題になるのがレスポンシブ対応です。固定幅・固定高さで置いた iframe は、デスクトップでは一見問題なく見えても、モバイルではすぐにはみ出したり、縦横比が不自然になったりします。特に動画、地図、外部ツールの埋め込みでは、この問題が目立ちやすいです。つまり、iframe は「表示できるか」だけでなく、「どの画面幅でも自然に見えるか」を最初から考えておく必要があります。

現在の実務では、iframe 自体に無理をさせるより、それを包むラッパー要素を使ってレスポンシブ制御する方法がかなり扱いやすいです。とくに aspect-ratio を使うと、昔の padding-top ハックよりもかなり分かりやすく、保守もしやすいです。つまり、レスポンシブ iframe を作るときは、「iframe 本体」だけでなく「親コンテナ」も設計対象だと考えるべきです。

4.1 固定幅のままだと何が問題になるのか

固定幅の iframe は、親要素より大きくなれば当然はみ出します。デスクトップでは 600px や 800px といった幅でも成立することがありますが、モバイルでそのまま表示されると横スクロールが発生したり、コンテンツが縮みすぎたりして、非常に見づらくなります。また、高さも固定のままだと、中のコンテンツと比率が合わず、余白が不自然になったり、上下が窮屈に見えたりすることがあります。つまり、iframe は画像のように自然に縮むわけではないため、何も考えずに固定値で置くとすぐに問題が出やすいです。

そのため、レスポンシブ対応では「単純に横幅を 100% にする」だけでは足りないこともあります。なぜなら、横幅を広げたり縮めたりするときに、中の内容に合った縦横比も一緒に保ったほうが見やすいからです。動画であれば 16:9 が多いですし、地図や埋め込みフォームならもう少し縦長がよいこともあります。つまり、レスポンシブ iframe では、横幅だけでなく「どの比率で見せたいか」まで含めて設計するべきです。

4.2 実用的なレスポンシブ iframe のコード例

以下は、実務でもかなりそのまま使いやすいレスポンシブ iframe の基本形です。ラッパーに aspect-ratio を指定し、その中で iframe を幅・高さ 100% にしています。これにより、横幅は親要素に合わせて自然に変わりつつ、比率は安定したまま表示できます。

<!doctype html>
<html lang="ja">
 <head>
   <meta charset="UTF-8" />
   <title>responsive iframe</title>
   <style>
     .iframe-wrap {
       width: 100%;
       aspect-ratio: 16 / 9;
       max-width: 960px;
     }

     .iframe-wrap iframe {
       width: 100%;
       height: 100%;
       border: 0;
     }
   </style>
 </head>
 <body>
   <h1>レスポンシブ iframe</h1>

   <div class="iframe-wrap">
     <iframe
       src="./embedded.html"
       title="レスポンシブ埋め込み"
       loading="lazy">
     </iframe>
   </div>
 </body>
</html>

この形なら、デスクトップでは十分な大きさを確保しつつ、モバイルでは画面幅に合わせて自然に縮みます。しかも比率が保たれるため、不自然な潰れ方をしにくいです。つまり、レスポンシブ iframe は iframe 単体で何とかするより、比率を持ったラッパー込みで作るほうがかなり安定します。

5. 安全に使うために知っておきたいこと

iframe を使うときに軽視しやすいのが、安全性の設計です。iframe は別ページをそのまま埋め込めるため、便利さの反面、どこまでの権限を与えるのか、どこまで親ページと連携させるのかを考えずに使うと、不要に危険な埋め込みになることがあります。特に外部サイトや外部ツールをそのまま表示する場合、埋め込み先でどんなスクリプトが動くのか、どんなフォーム送信やポップアップが発生しうるのかを理解せずに何でも許可してしまうのは避けたほうがよいです。つまり、iframe は便利だからこそ、「何を制限するか」を最初に考える必要があります。

また、iframe の安全性を理解するうえで重要なのが、親ページと iframe 内が別文書として扱われるという前提です。この分離は、セキュリティ上の観点から非常に意味があります。親ページが iframe 内を自由に読めないこともありますし、その逆もあります。この制約は一見不便ですが、別の文書同士が無制限に干渉できないようにするための仕組みでもあります。つまり、iframe の安全性は「自由にできないこと」の中にこそあります。

5.1 sandbox は必要最小限の許可で考える

sandbox を付けると、iframe 内でできることを大きく制限できます。そこから必要な権限だけを個別に追加していくのが基本的な考え方です。つまり、最初から何でも許可するのではなく、「この埋め込みで本当に必要な機能は何か」を整理しながら使うべきです。たとえば、フォーム送信だけ必要なら allow-forms を付ければよいかもしれませんし、スクリプト動作が必要なら allow-scripts を追加する必要があるかもしれません。しかし、それ以外の権限まで無条件に開ける必要はないことがほとんどです。

この考え方は、iframe に限らず Web セキュリティ全般の基本でもあります。つまり、「使えるから全部開ける」ではなく、「必要なものだけを許可する」という発想です。sandbox は少し地味な属性に見えるかもしれませんが、外部埋め込みを実務で扱うならかなり重要です。とくに第三者サービスの UI や社外ページを載せるときには、sandbox の有無で安心感が大きく変わります。

5.2 同一オリジン制約を理解しておく

iframe に慣れていないと、「親ページの中に見えているのだから、中の DOM も普通に JavaScript で触れるだろう」と考えたくなることがあります。しかし、親ページと iframe 内が異なるオリジンである場合、ブラウザはその相互アクセスをかなり厳しく制限します。これが同一オリジン制約です。つまり、他サイトの内容を勝手に読んだり操作したりできないようにするための仕組みです。このルールを知らないと、「なぜ iframe の中へアクセスできないのか」でかなり混乱しやすいです。

逆に言えば、この制約があるからこそ iframe は安全に使いやすいとも言えます。もし外部ページの DOM に親ページから何でも触れたら、外部埋め込みは非常に危険になります。つまり、同一オリジン制約は不便さではなく、安全な境界を作るための前提です。iframe を扱うなら、この「見えているが自由には触れない」という性質を最初から理解しておくことが大切です。

6. 表示速度を悪化させないための工夫

iframe は、別ページを丸ごと埋め込むようなものです。そのため、埋め込み対象が重いほど、親ページの体感速度にも影響しやすくなります。とくに動画プレーヤー、地図、広告ウィジェット、分析ダッシュボードなどは、それ自体が大きな HTML、CSS、JavaScript、画像を抱えていることが多く、何も考えずに複数並べると初期表示の負荷がかなり大きくなります。しかも、親ページ側からその中身を細かく最適化できるわけではないため、「何をいつ読み込ませるか」を設計することが大切になります。つまり、iframe の最適化は中身の軽量化というより、読み込みタイミングの設計に近いです。

また、iframe が重いとページ全体が遅く感じられるだけでなく、ユーザーの集中も切れやすくなります。特にモバイルでは通信環境や端末性能にばらつきがあるため、この差がかなり目立ちます。そのため、iframe を使うときは「本当に初期表示から必要か」「ユーザーが見える位置に来るまで待てるか」といった観点を持つとかなり違います。つまり、埋め込みの便利さと表示速度のバランスを取ることが重要です。

6.1 loading="lazy" をまず検討する

iframe 最適化で最初に考えたいのが、loading="lazy" です。これを付けると、iframe がビューポートへ近づくまで読み込みを遅らせられるため、初期表示の負荷を減らしやすくなります。特にページ下部の地図、補助的な動画、サブコンテンツとしての外部ウィジェットなど、最初に見えない埋め込みにはかなり相性がよいです。つまり、「いま見えていないのに最初から重い iframe を読む」必要がない場合には、lazy loading は非常に有効です。

<iframe  src="./embedded.html"  title="遅延読み込みの例"  width="100%"  height="320"  loading="lazy"> </iframe>

もちろん、ファーストビューの主役になる動画や、初期表示の中心となる埋め込みには lazy loading が向かない場合もあります。しかし、補助的な埋め込みなら、まずは loading="lazy" を付けるかどうかを検討するだけでもかなり違います。つまり、iframe の最適化は難しいことから始めるより、「本当に最初から必要か」を見直すことから始めるのが実務的です。

6.2 埋め込みを増やしすぎない

iframe は便利なので、気づくとページのいろいろな場所に置きたくなることがあります。しかし、iframe は 1 つ増えるごとに別ページの読み込みコストが増えるため、使いすぎると当然ページは重くなります。とくに、複数の外部サービスを同時に埋め込んでいるページでは、親ページ自体は軽くても、トータルではかなり重くなることがあります。つまり、個々の iframe が正しく設定されていても、「数が多すぎる」だけで体感速度は悪化しやすいです。

そのため、場合によっては最初から iframe を表示せず、サムネイルやプレースホルダーを置いて、ユーザー操作のあとで初めて iframe を生成する方法のほうがよいこともあります。動画埋め込みなどではこの方法が特に有効です。つまり、iframe の速度対策は属性の工夫だけでなく、「そもそも最初から出すべきか」という表示設計の問題でもあります。

7. 親ページと iframe の連携方法

iframe は別文書として動くため、親ページと完全に一体化しているわけではありません。しかし、実務では「親の操作に応じて iframe に何かしてほしい」「iframe 側の結果を親へ返したい」といったニーズがよくあります。そうしたときに使われる代表的な方法が postMessage です。これは、異なるウィンドウコンテキスト同士でメッセージをやり取りするための仕組みで、iframe と親ページの通信で非常によく使われます。つまり、iframe は独立しているから完全に孤立しているわけではなく、適切な方法であれば連携可能です。

ただし、連携できることと、安全に連携できることは別です。特に外部サイトを埋め込んでいる場合、どこから来たメッセージかを確認せずに処理すると危険です。そのため、postMessage を使うときは event.origin を確認し、想定した送信元だけを受け入れるようにするのが基本になります。つまり、親ページと iframe の通信はとても便利ですが、「できるから使う」ではなく、「安全に通信する」ことまで含めて設計するべきです。

7.1 すぐ動く postMessage の例

以下は、1 ファイルで試せる簡単なサンプルです。srcdoc の中のボタンを押すと、親ページへメッセージが送られ、親ページ側の表示が変わります。まずは仕組みを理解するにはかなり分かりやすい例です。

<!doctype html>
<html lang="ja">
 <head>
   <meta charset="UTF-8" />
   <title>iframe postMessage example</title>
 </head>
 <body>
   <h1>親ページ</h1>
   <p id="log">まだメッセージは受信していません。</p>

   <iframe
     id="demo-frame"
     title="postMessage サンプル"
     width="100%"
     height="220"
     srcdoc='
       <!doctype html>
       <html lang="ja">
         <body style="font-family:sans-serif;padding:24px;">
           <button id="send">親へメッセージを送る</button>
           <script>
             document.getElementById("send").addEventListener("click", function () {
               parent.postMessage({ type: "IFRAME_CLICK", text: "iframe 内のボタンが押されました" }, "*");
             });
           </script>
         </body>
       </html>
     '>
   </iframe>

   <script>
     window.addEventListener("message", function (event) {
       const log = document.getElementById("log");

       if (event.data && event.data.type === "IFRAME_CLICK") {
         log.textContent = event.data.text;
       }
     });
   </script>
 </body>
</html>

この例では、iframe 内のボタン操作が親ページへ通知されます。学習用サンプルとしてはこのままで十分動きますし、まずは「別文書同士でもメッセージは送れる」という感覚をつかむのに向いています。つまり、iframe の連携は DOM 直接操作ではなく、メッセージ通信の形で考えると理解しやすいです。

7.2 実務では origin を確認する

上のサンプルでは分かりやすさを優先して * を使っていますが、本番ではそのまま使うべきではありません。外部サイトを埋め込んでいる場合や複数の iframe とやり取りしている場合、想定していない送信元からのメッセージを受け取ってしまう可能性があるからです。そのため、受信側では event.origin を確認し、想定したオリジンから来たメッセージだけを処理するようにします。

window.addEventListener("message", function (event) {
 if (event.origin !== "https://example.com") {
   return;
 }

 if (event.data && event.data.type === "IFRAME_CLICK") {
   console.log("安全に受信:", event.data);
 }
});

このようにしておけば、通信自体はしつつも、送信元を限定できます。つまり、postMessage を実務で使うなら、「通信できる」こと以上に「誰と通信しているのかを確認する」ことが非常に重要です。

8. iframe が向いているケースと向いていないケース

iframe は便利な要素ですが、すべての場面に向いているわけではありません。むしろ、向いているケースと向いていないケースを最初に切り分けておくことが、実務では非常に重要です。iframe の強みは、別ページや別システムをそのまま独立した状態で取り込めることにあります。一方で、親ページと一体化した UI を作るには、サイズ調整、見た目の統一、状態共有、スクロール挙動などの面で面倒が増えやすいです。つまり、iframe は「便利な箱」ではありますが、ページの主要構造を何でも押し込む道具として考えると、かえって設計を複雑にしやすいです。

そのため、iframe を選ぶときは「表示できるかどうか」ではなく、「別文書として扱うことがメリットになるかどうか」を判断基準にしたほうがよいです。独立性が価値になるなら iframe はかなり強いですし、一体感や細かい制御が重要なら別の方法のほうが向いていることがあります。以下では、その向き不向きをより具体的に整理します。

8.1 向いているケース

iframe が向いているのは、主に「親ページとは独立して動いている別ページや別アプリケーションを、そのまま載せたいケース」です。たとえば、外部動画プレーヤー、地図サービス、決済ページ、予約フォーム、社内ダッシュボード、別チームの管理画面の一部などはその代表例です。これらはもともと独立した UI として成立しており、わざわざ親ページの DOM や CSS の中へ統合しなくても価値があります。つまり、「別物のまま使う」ことに意味がある場面では iframe は非常に有効です。

また、セキュリティや保守の観点からも、あえて別文書として扱いたいケースがあります。たとえば、別チームが保守している機能を親ページへ直に組み込むより、iframe として境界をはっきりさせたほうが責務分離しやすいことがあります。このように、iframe の向いているケースは単に技術的に埋め込みやすい場面ではなく、独立性そのものに意味がある場面 だと考えると整理しやすいです。

8.1.1 外部サービスや既存システムをそのまま載せたい場合

iframe がもっとも力を発揮しやすいのは、外部サービスや既存の別システムを、そのまま現在のページへ取り込みたい場合です。たとえば、YouTube の動画プレーヤー、Google マップの埋め込み、外部予約サービス、決済プロバイダが提供する支払い画面などは、自前で再実装するより埋め込んだほうがはるかに現実的です。これらは UI も機能も埋め込み元が責任を持っており、親ページ側は「どこへ、どう表示するか」だけ考えればよいからです。つまり、既存資産を壊さずに使いたいなら、iframe は非常に合理的な方法です。

また、社内でも同じことが言えます。別チームが作って運用しているダッシュボードや、独立した管理ツールの一部を、自分たちのページの中へ見せたいことがあります。このとき、機能を再実装したり、同じフロントエンド基盤へ無理に移植したりするより、iframe で表示したほうが保守責任の境界もはっきりしやすいです。つまり、外部・内部を問わず、既に完成している別文書をそのまま活かしたい場面 では iframe はかなり有力です。

8.1.2 独立性や分離がそのままメリットになる場合

iframe の本質的な強みは、別文書として隔離されることです。これは見た目を分離するというだけでなく、DOM、CSS、JavaScript の世界がある程度分かれていることを意味します。そのため、親ページへ直接混ぜたくない UI、別のリリース単位で管理したい機能、スタイル衝突を避けたい部分などにも向いています。たとえば、社内ツールのプレビューや、外注先が管理するミニアプリの埋め込みなどでは、この分離がかなり助けになります。つまり、「一体化させないこと」がむしろ設計上の利点になるなら、iframe はとても使いやすいです。

さらに、親ページの変更が中身へ影響しにくい、逆に iframe 内の変更が親ページへ影響しにくいというのも実務上は大きなメリットです。共通スタイルやスクリプトの衝突を避けやすく、チーム境界も守りやすいからです。つまり、iframe は単なる表示手段というより、境界を作るための技術 としても価値があります。

8.2 向いていないケース

iframe が向いていないのは、ページの主要な本文や、親ページと密接に一体化した UI を作りたいケースです。たとえば、記事本文、商品詳細ページの主要情報、親ページと完全に同じデザインシステムのもとで細かく制御したいフォームや複雑な UI などは、最初から同じ DOM 内で構築したほうが自然です。iframe に分けてしまうと、高さ調整、見た目の統一、スクロールの流れ、フォーカス移動、状態同期などの面で不便が増えやすいからです。つまり、細かく統制したい UI ほど iframe とは相性が悪くなります。

また、SEO の観点でも、ページの主要コンテンツを iframe の中へ閉じ込める構造は避けたほうがよいことがあります。検索エンジンや共有プレビューの観点では、親ページ側に主要な意味が見えているほうが扱いやすいからです。つまり、iframe は独立した補助的な機能には向いていても、ページの中心そのものを構成する用途 にはあまり向いていません。

8.2.1 親ページと一体化した UI を作りたい場合

親ページと完全に見た目を合わせたい、状態を細かく共有したい、スクロールやフォーカスの流れも自然につなげたい、といった場合には iframe はかなり不便になりやすいです。たとえば、親ページの state に応じてリアルタイムに内容が変わる複雑な UI や、同じコンポーネント群の一部として扱いたいフォームなどでは、別文書として分かれていること自体が足かせになります。つまり、iframe の独立性はメリットになる場面もありますが、一体感が重要な場面では逆にデメリットになります。

また、見た目の統一も簡単ではありません。親ページの CSS をそのまま iframe 内へ適用できるわけではないため、同じデザインにしたい場合は、別途中身側にも同じスタイルを用意しなければなりません。状態管理も DOM 共有もできないため、連携が必要なら postMessage などを挟む必要があります。つまり、親と一体で動く UI を作りたいなら、最初から同じページの中で構築したほうが自然なことが多いです。

8.2.2 主要コンテンツや SEO を重視する本文領域の場合

記事本文、商品紹介の中心、サービス説明の核となる情報など、ページの意味そのものを担うコンテンツを iframe へ入れてしまうのはあまり得策ではありません。なぜなら、親ページから見たときに、その重要な情報が別文書の中へ分離されてしまうからです。見た目上は表示されていても、構造としては別ページであり、共有、管理、検索上の扱いを考えると不便が出やすいです。つまり、主要コンテンツは親ページそのものの HTML として持っていたほうが、多くの場合自然です。

また、アクセシビリティの面でも、本文の流れが iframe をまたぐと、読み上げやキーボード移動の体験が不自然になることがあります。ページの主役になる内容ほど、ユーザーは連続したひとつの体験として読んだり操作したりしたいからです。つまり、iframe は補助的な独立機能には向いていますが、ページの本体そのものを構成する用途 にはあまり向いていません。

9. 実務で使いやすい iframe テンプレート

ここまでの内容を踏まえると、実務で使いやすい iframe は「とりあえず src を入れて終わり」ではなく、最低限のアクセシビリティ、レスポンシブ性、表示速度、安全性を意識した形にしておくとかなり扱いやすくなります。特に、同じような埋め込みを複数ページで使う場合や、社内で共通テンプレートとして扱いたい場合には、「うちでは最低限これを入れる」という形を決めておくとよいです。つまり、iframe は毎回その場しのぎで書くより、ある程度再利用可能な基本形を持っておいたほうが安全です。

また、テンプレート化しておくと、チーム全体での品質もそろえやすくなります。title を付け忘れない、loading="lazy" を検討する、sandbox を必要最小限で書く、レスポンシブなラッパーを用意する、といったルールが自然に守りやすくなるからです。つまり、iframe のテンプレートは単なるコピペ用コードではなく、実務での埋め込み品質を安定させるための小さな設計ルールでもあります。

9.1 基本テンプレート

<div class="iframe-wrap">
 <iframe
   src="./embedded.html"
   title="ダッシュボード埋め込み"
   loading="lazy"
   referrerpolicy="strict-origin-when-cross-origin"
   sandbox="allow-scripts allow-forms"
   allowfullscreen>
 </iframe>
</div>

<style>
 .iframe-wrap {
   width: 100%;
   aspect-ratio: 16 / 9;
   max-width: 960px;
 }

 .iframe-wrap iframe {
   width: 100%;
   height: 100%;
   border: 0;
 }
</style>

このテンプレートでは、レスポンシブなラッパー、titleloading="lazy"sandboxreferrerpolicy といった、実務で最低限意識したい要素をまとめています。もちろん埋め込み先によって比率や許可する権限は変わりますが、「まずこの形を土台にする」と決めておくとかなり安定します。特に title とレスポンシブ対応は省略しないほうがよいです。

9.2 1 ファイルで確認できるテンプレート

以下は、実際にそのまま保存して試せる 1 ファイル完結のテンプレートです。srcdoc を使っているため、外部ファイルなしでも挙動を確認できます。

<!doctype html>
<html lang="ja">
 <head>
   <meta charset="UTF-8" />
   <meta name="viewport" content="width=device-width, initial-scale=1.0" />
   <title>iframe template</title>
   <style>
     body {
       font-family: sans-serif;
       margin: 24px;
     }

     .iframe-wrap {
       width: 100%;
       aspect-ratio: 16 / 9;
       max-width: 900px;
     }

     .iframe-wrap iframe {
       width: 100%;
       height: 100%;
       border: 0;
       border-radius: 12px;
     }
   </style>
 </head>
 <body>
   <h1>iframe テンプレート</h1>

   <div class="iframe-wrap">
     <iframe
       title="デモ埋め込み"
       loading="lazy"
       sandbox="allow-scripts"
       srcdoc='
         <!doctype html>
         <html lang="ja">
           <body style="margin:0;padding:24px;font-family:sans-serif;background:#f3f8ff;">
             <h2>埋め込みデモ</h2>
             <p>この iframe はレスポンシブ対応済みです。</p>
           </body>
         </html>
       '>
     </iframe>
   </div>
 </body>
</html>

この例なら、iframe の基本、レスポンシブ表示、sandbox、lazy loading の雰囲気までまとめて確認できます。つまり、最初に手元で確認するテンプレートとしてはかなり実用的です。

おわりに

iframe は、別ページや別システムを現在のページへ埋め込むための、今でも十分に実用的な HTML 要素です。基本構文は簡単ですが、実務で正しく使うには、title のようなアクセシビリティ対応、loading="lazy" による初期負荷の削減、sandbox による安全性の制御、レスポンシブ対応のためのラッパー設計、そして必要に応じた postMessage による親子連携まで理解しておく必要があります。つまり、iframe は簡単に置ける一方で、ちゃんと置いたほうが圧倒的に扱いやすい要素です。

大切なのは、iframe を何でも入れられる便利箱として考えないことです。向いているのは、独立した別ページや別サービスを、そのままの形で安全に埋め込みたい場面です。逆に、ページの主要コンテンツや親ページと密接に一体化した UI にはあまり向いていません。つまり、iframe は「使うべきか、使わないべきか」という単純な話ではなく、「どんな場面で使うとメリットが大きいか」を見極めることが重要です。そこを理解して使えば、iframe は今でもかなり強力で実用的な選択肢になります。

LINE Chat