<iframe>: インラインフレーム要素
Baseline
Widely available
*
This feature is well established and works across many devices and browser versions. It’s been available across browsers since 2015年7月.
* Some parts of this feature may have varying levels of support.
<iframe> は HTML の要素で、入れ子になった閲覧コンテキストを表現し、現在の HTML ページに別のページを埋め込むことができます。
試してみましょう
<iframe
id="inlineFrameExample"
title="Inline Frame Example"
width="300"
height="200"
src="https://www.openstreetmap.org/export/embed.html?bbox=-0.004017949104309083%2C51.47612752641776%2C0.00030577182769775396%2C51.478569861898606&layer=mapnik">
</iframe>
iframe {
border: 1px solid black;
width: 100%; /* HTML の width 属性で設定された幅よりも優先する */
}
それぞれの閲覧コンテキストにはそれぞれの文書があり、URL でナビゲーションができます。それぞれの埋め込み閲覧コンテキストのナビゲーションは、最上位の閲覧コンテキストのセッション履歴で直線化されます。他の閲覧コンテキストを埋め込んでいる閲覧コンテキストは、親閲覧コンテキスト と呼ばれます。最上位 の閲覧コンテキスト(親を持たないもの)は、通常はブラウザーのウィンドウで、 Window オブジェクトで表されます。
警告:
それぞれの閲覧コンテキストは完全な文書環境であるため、ページの中で <iframe> を使用するごとに、必要となるメモリーやその他の計算リソースが増加します。理論的には好きなだけ <iframe> を使用することができますが、パフォーマンスの問題を確認してください。
属性
この要素にはグローバル属性があります。
allow-
権限ポリシーを
<iframe>に指定します。このポリシーは、<iframe>が利用可能な機能(例:マイク、カメラ、バッテリー、ウェブ共有 API へのアクセスなど)をリクエストのオリジンに基づいて定義します。例については、
Permissions-Policyのトピックの iframes を参照してください。メモ:
allow属性で指定され権限ポリシーはPermissions-Policyヘッダーで指定されたポリシーの上に、さらに制限を実装するものです。置き換えるものではありません。 allowfullscreen-
この
<iframe>がrequestFullscreen()を呼び出して全画面モードにすることができる場合は、trueに設定します。メモ: この属性は古い属性とみなされており、
allow="fullscreen"として再定義されました。 allowpaymentrequest非推奨; 非標準-
異なるオリジンの
<iframe>で 決済リクエスト API の実行を許可する場合はtrueに設定します。メモ: この属性は古い属性とみなされており、
allow="payment"として再定義されました。 browsingtopicsExperimental 非標準-
論理属性で、表示されている場合、現在のユーザーの選択されたトピックを
<iframe>のソースのリクエストと共に送信することを指定します。詳細は、トピック API の使用を参照してください。 credentiallessExperimental-
trueに設定すると<iframe>を無信頼であることを示します。 つまり、そのコンテンツは新しい、一時的なコンテキストで読み込まれることになります。これはそのオリジンに関連するネットワーク、クッキー、ストレージデータへのアクセス権がありません。最上位の文書の存続期間に依存する新しいコンテキストを使用します。その代わりにCross-Origin-Embedder-Policy(COEP) 埋め込みルールは解除され、COEP を設定した文書はそうでない第三者の文書を埋め込むことができるようになります。詳しくは無信頼の iframe を参照してください。 cspExperimental-
埋め込みリソースを制限するコンテンツセキュリティポリシーです。詳しくは
HTMLIFrameElement.cspをご覧ください。 height-
フレームの高さを CSS ピクセル数で示します。既定値は
150です。 loading-
ブラウザーが iframe をどのように読み込むかを示します。
eager-
ページ読み込み時に、直ちに iframe を読み込みます(これが既定値です)。
lazy-
ブラウザーで定義された視覚的ビューポートからの計算された距離に達するまで iframe の読み込みを延期します。 その目的は、ブラウザーがフレームを使用すると合理的に確信できるまで、フレームの取得に必要なネットワークとストレージの帯域幅を使用しないようにすることです。 これにより、ほとんどの典型的な使用用途において、特に初期ページの読み込み時点が縮小され、パフォーマンスとコストが改善されます。
メモ: JavaScript が有効な場合のみ、読み込みが遅延されます。 これはトラッキング対策です。
name-
埋め込み閲覧コンテキストのターゲットの名前です。
<a>,<form>,<base>要素におけるtarget属性の値、<input>や<button>要素におけるformtarget属性の値、window.open()メソッドのwindowName引数の値として使用することができます。さらに、この名前はWindowおよびDocumentプロパティとなり、埋め込まれたウィンドウや要素自身への参照が入ります。 referrerpolicy-
フレームのリソースにアクセスする際にどのリファラーを送信するかを示します。
no-referrer-
Refererヘッダーを送信しません。 no-referrer-when-downgradeoriginorigin-when-cross-origin-
他のオリジンへ送信されるリファラーは、スキーム、ホスト名、ポート番号のみにします。同じオリジンへの移動では、パスも含めます。
same-origin-
リファラーは同じオリジンには送信しますが、異なるオリジンへのリクエストにはリファラー情報を送信しません。
strict-origin-
プロトコルのセキュリティ水準が同じ (HTTPS→HTTPS) である場合は、文書のオリジンのみをリファラーとして送信しますが、宛先の安全性が劣る場合 (HTTPS→HTTP) には送信しません。
strict-origin-when-cross-origin(既定値)-
同じオリジンへのリクエストには URL 全体を送信し、プロトコルのセキュリティ水準が同じ (HTTPS→HTTPS) である場合は、文書のオリジンのみをリファラーとして送信し、宛先の安全性が劣る場合 (HTTPS→HTTP) にはヘッダーを送信しません。
unsafe-url-
リファラーにオリジンおよびパスを含めます(ただし、フラグメント、パスワード、ユーザー名は含めません)。オリジンやパスの情報が TLS で保護されたリソースから安全性の劣るオリジンへ漏えいしますので、これは安全ではありません。
sandbox-
<iframe>に埋め込まれたコンテンツに適用される制限を制御します。フレーム内のコンテンツに追加の制約を適用します。この属性の値は、空にするとすべての制約を適用し、空白区切りのトークンにすると特定の制約を外します。allow-downloads-
download 属性を持つ
<a>または<area>要素を通して、またファイルのダウンロードにつながるナビゲーションを通してファイルのダウンロードを可能にします。これは、ユーザーがリンクをクリックしたか、JS コードがユーザーとの対話なしに開始したかに関係なく、動作します。 allow-forms-
ページがフォームを送信することを許可します。このキーワードを使用しない場合、フォームは通常通り表示されますが、フォームを送信しても入力の検証、ウェブサーバーへのデータ送信、ダイアログの終了が行われません。
allow-modals-
ページが
Window.alert(),Window.confirm(),Window.print(),Window.prompt()によってモーダルウィンドウを開くことができるようにしますが、<dialog>は、このキーワードに関わらず開くことが可能です。また、ページがBeforeUnloadEventイベントを受信することができるようにもします。 allow-orientation-lock-
リソースが画面の向きをロックすることができるようにします。
allow-pointer-lock-
リソースがポインターロック API を使用できるようにします。
allow-popups-
ポップアップ(
Window.open()、target="_blank"などで作成されたもの)を許可します。このキーワードが使用されていない場合、その機能は静かに失敗します。 allow-popups-to-escape-sandbox-
サンドボックス化された文書が、サンドボックス化フラグを強制することなく、新しい閲覧コンテキストを開くことができるようにします。これにより、例えばサードパーティ広告を、その広告がリンクしているページに同じ制限を強いることなく、安全にサンドボックス化することができます。このフラグが記載されていない場合、リダイレクトされたページ、ポップアップウィンドウ、新しいタブは元の
<iframe>と同じサンドボックスの制限を受けることになります。 allow-presentation-
埋め込み側が、 iframe がプレゼンテーションセッションを開始できるかどうかを制御することを許可します。
allow-same-origin-
このトークンが使用されていない場合、リソースは同一オリジンポリシーに常に失敗する特別なオリジンからのものとして扱われます(潜在的にデータストレージやクッキーへのアクセスや一部の JavaScript API の使用を阻止することがあります)。
allow-scripts-
ページがスクリプトを実行することを許可します(ただし、ポップアップウィンドウは作成しません)。このキーワードが使用されない場合、この操作は許可されません。
allow-storage-access-by-user-activationExperimental-
<iframe>で読み込んだ文書がストレージアクセス API を使用して、分離されていないクッキーへのアクセスをリクエストできるようにします。 -
リソースが最上位の閲覧コンテキスト(
_topという名前のもの)に移動できるようにします。 -
リソースが最上位の閲覧コンテキストに移動できるようにしますが、ユーザーの操作によって開始されたものに限ります。
-
ブラウザーに組み込まれている、またはウェブサイトによって登録された
http以外のプロトコルへのナビゲーションを可能にします。この機能はallow-popupsやallow-top-navigationキーワードでも有効になります。
メモ:
- 埋め込まれた文書のオリジンが埋め込み先のページと同じである場合、
allow-scriptsとallow-same-originを同時に使用すると、埋め込まれた文書からsandbox属性を削除することができるようになるため、絶対に避けるべきです。sandbox属性をまったく使用しないよりも安全性が低下します。 - 攻撃者がサンドボックス化した
iframeの外側にコンテンツを表示することができる場合、サンドボックス化は無意味です。例えば、閲覧者がフレームを新しいタブで開く場合などです。潜在的なダメージを抑えるため、そうしたコンテンツは別のオリジンから提供するようにもしてください。
メモ: ユーザーをリダイレクトするとき、ポップアップウィンドウを開くとき、または
sandbox属性を持つ<iframe>内に埋め込まれたページから新しいタブを開くとき、新しい閲覧コンテキストは同じsandboxの制限に従います。例えば、sandbox="allow-forms"またはsandbox="allow-popups-to-escape-sandbox"属性が設定されていない<iframe>内に埋め込まれたページが別個のタブで新しいサイトを開いた場合、その新しい閲覧コンテキストでのフォーム送信は静かに失敗します。 src-
埋め込むページの URL です。同一オリジンポリシーに従う空白ページを埋め込む場合は、
about:blankの値を使用してください。また、プログラムから<iframe>の src 属性を削除すると (例えばElement.removeAttribute()などで)、 Firefox (バージョン 65 以降)、 Chromium ベースのブラウザー、 Safari/iOS ではabout:blankが読み込まれます。メモ:
about:blankページは、アンカーリンクなどの相対 URL を解決するときに、埋め込み文書の URL をベース URL として使用します。 srcdoc-
埋め込むインライン HTML で、
src属性を上書きします。そのコンテンツは完全な HTML 文書の構文に従う必要があります。この構文には doctype ディレクティブ、<html>、<body>タグなどが含まれますが、そのほとんどは省略して body のコンテンツだけにすることができます。この文書は位置がabout:srcdocとなります。ブラウザーがsrcdoc属性に対応していない場合は、src属性の URL で代替されます。メモ:
about:srcdocページは、アンカーリンクなどの相対 URL を解決するときに、埋め込み文書の URL をベース URL として使用します。 width-
フレームの幅を CSS ピクセル数で示します。既定値は
300です。
非推奨の属性
以下の属性は非推奨であり、すべてのユーザーエージェントが対応しているとは限りません。新しいコンテンツでは使用せず、既存のコンテンツから削除するようにしましょう。
align非推奨;-
フレームを含むコンテキストに対する、フレームの整列方法を指定します。
frameborder非推奨;-
値が
1(既定) ならば、このフレームの周りに境界線を描きます。値が0ならば、このフレームの周りの境界線を削除しますが、代わりに CSS のborderプロパティを使用して<iframe>の境界線を制御してください。 longdesc非推奨;-
フレームの内容についての長い説明の URL です。誤用が広がっているため、非視覚ブラウザーでは有用ではありません。
marginheight非推奨;-
フレームの内容と上下の境界との間における、ピクセル単位の余白の量です。
marginwidth非推奨;-
フレームの内容と左右の境界との間における、ピクセル単位の余白の量です。
scrolling非推奨;-
ブラウザーがフレームにスクロールバーを表示することを示します。
スクリプト操作
インラインフレームは、<frame> 要素のように window.frames 擬似配列に入ります。
DOM の HTMLIFrameElement オブジェクトでは、スクリプトはフレーム化されたリソースの window オブジェクトに contentWindow プロパティを使ってアクセスすることができます。 contentDocument プロパティは iframe の内側の document 要素を参照します (contentWindow.document と等価です)。
スクリプトは、フレームの内側からは window.parent で親ウィンドウを参照できます。
フレームの内容にアクセスするスクリプトは、同一オリジンポリシーに従います。別なオリジンから読み込まれたスクリプトは、フレーム内のスクリプトがフレームの親にアクセスする場合を含め、他の window オブジェクトのほとんどのプロパティにアクセスできません。オリジンをまたいだやりとりは Window.postMessage() を使用して実現できます。
位置指定と表示倍率
置換要素であるため、 <iframe> 要素のボックス内における埋め込み文書の位置は、 object-position プロパティで設定することができます。
メモ:
object-fit プロパティは、<iframe> 要素には効果がありません。
error および load イベントの動作
<iframe> で発生する error イベントと load イベントを使用すると、ローカルネットワークの HTTP サーバーの URL 空間を推測することができる可能性があります。そのため、セキュリティ対策として、ユーザーエージェントは <iframe> に対して error イベントを発生させず、<iframe> のコンテンツの読み込みに失敗しても、常に load イベントが発生します。
アクセシビリティ
読み上げソフトのような支援技術を利用して操作している人は、 <iframe> 上の title 属性を使用して内容をラベル付けします。 title の値で埋め込みコンテンツを正確に説明してください。
<iframe
title="Wikipedia page for Avocados"
src="https://en.wikipedia.org/wiki/Avocado"></iframe>
この title がないと、埋め込みコンテンツが何であるかを特定するために <iframe> の内容に移動しなければならなくなります。このコンテキストの移動は、特に複数の <iframe> が存在するページや、動画や音楽などの対話型コンテンツが埋め込まれているページでは、混乱を招き、時間のかかる作業になる可能性があります。
例
>基本的な <iframe>
この例では、https://example.org のページを <iframe> で埋め込みます。これは iframe の一般的な用途で、他のサイトのコンテンツを埋め込むことです。例えば、ライブサンプル自体も、一番上の試してみましょうの例も、他の MDN サイトのコンテンツを <iframe> で埋め込んでいます。
HTML
<iframe
src="https://example.org"
title="iframe Example 1"
width="400"
height="300">
</iframe>
結果
<iframe> 内へのソースコードの埋め込み
この例では、iframe 内のソースコードを直接レンダリングしています。これは sandbox 属性と組み合わせることで、ユーザー生成コンテンツを表示する際にスクリプトインジェクションを防ぐテクニックとして使用することができます。
srcdoc を使用する場合、埋め込みコンテンツ内の相対 URL は埋め込みページの URL からの相対 URL で解決することに注意してください。埋め込みコンテンツ内の場所を指すアンカーリンクを使用したい場合は、ベース URL として about:srcdoc を明示的に指定する必要があります。
HTML
<article>
<footer>9 分前の <i>jc</i> の投稿</footer>
<iframe
sandbox
srcdoc="<p><code>iframe</code> 要素を使用する方法は 2 つあります。</p>
<ol>
<li><a href="about:srcdoc#embed_another">他のページからコンテンツを埋め込む</a></li>
<li><a href="about:srcdoc#embed_user">ユーザーが生成したコンテンツを埋め込む</a></li>
</ol>
<h2 id="embed_another">他のページからコンテンツを埋め込む</h2>
<p><code>src</code> 属性を使用して、埋め込むページの URL を指定します。</p>
<pre><code>&lt;iframe src="https://example.org"&gt;&lt;/iframe&gt;</code></pre>
<h2 id="embed_user">ユーザーが生成したコンテンツを埋め込む</h2>
<p><code>srcdoc</code> 属性を使用して、埋め込むコンテンツを指定します。この投稿がすでにその例です。</p>
"
width="500"
height="250"
></iframe>
</article>
srcdoc を使用する際のエスケープシーケンスの書き方を説明します。
- 最初に、通常の HTML 文書内でエスケープするようなもの(
<、>、&など)をエスケープして HTML を書き出します。 srcdoc属性では<と<は全く同じ文字を表します。したがって、HTML 文書内の実際のエスケープシーケンスにするには、アンパサンド (&) を&に置き換えます。例えば、<は&lt;になり、&は&amp;になります。- 二重引用符 (
") を"に置き換えてsrcdoc属性が早期に終了しないようにします('を使用する場合は'を'に置き換えてください)。この段階は前回の後に行われるので、この段階で生成された"は&quot;にはなりません。
結果
技術的概要
| コンテンツカテゴリー | フローコンテンツ, 記述コンテンツ, 埋め込みコンテンツ, 対話型コンテンツ, 知覚可能コンテンツ |
|---|---|
| 許可されている内容 | なし。 |
| タグの省略 | なし。開始タグと終了タグの両方が必須です。 |
| 許可されている親要素 | 埋め込みコンテンツを受け入れるすべての要素。 |
| 暗黙の ARIA ロール | 対応するロールなし |
| 許可されている ARIA ロール |
application, document,
img, none,
presentation
|
| DOM インターフェイス | HTMLIFrameElement |
仕様書
| Specification |
|---|
| HTML> # the-iframe-element> |
ブラウザーの互換性
Loading…