HTML: HTML iframe
<iframe>(インラインフレーム)を使うと、現在のページ内に別のHTMLページを埋め込めます。動画、地図、他のウェブページなど、iframeはウェブ開発に欠かせないツールです。
1. iframeの基本
<iframe src="URL"></iframe> で別のウェブページを現在のページに埋め込めます。width と height 属性で表示サイズを制御します。
▶ サンプル
<!-- シンプルなページを埋め込み、幅600px、高さ400px -->
<iframe src="https://example.com" width="600" height="400">
お使いのブラウザはiframeをサポートしていません。
</iframe>
2. iframeの属性解説
iframeには埋め込み動作を制御するいくつかの属性があります。
src― 埋め込むページのURLアドレスwidth/height― iframeのピクセルサイズを設定title― iframeの説明を提供。スクリーンリーダーにとって非常に重要name― iframeに名前を付け、リンク(<a>)のtargetとして使用可能
name 属性と target を組み合わせると、リンクをiframe内で開くことができます。
▶ サンプル
<!-- 名前付きiframe -->
<iframe src="about:blank" name="content-frame"
width="100%" height="300"></iframe>
<!-- targetを使ってリンクをiframe内で開く -->
<a href="https://www.wikipedia.org" target="content-frame">
Wikipediaをiframeで開く
</a>
<a href="https://www.example.com" target="content-frame">
Exampleをiframeで開く
</a>
title 属性は必須です ― スクリーンリーダーがこれを読み上げ、視覚障害のあるユーザーが埋め込みコンテンツを理解するのに役立ちます。ページ上に表示されなくても、すべてのiframeに意味のある title を必ず追加してください。
3. iframeのセキュリティ ― sandbox属性
sandbox 属性はiframe内のコンテンツに追加の制限を課し、重要なセキュリティ対策です。フォーム送信、ポップアップ、スクリプト実行などの動作を制限できます。
sandbox=""(空)― すべての制限を有効にする。最も厳格な形式sandbox="allow-scripts"― スクリプト実行を許可するが、他の動作はブロックsandbox="allow-scripts allow-forms"― スクリプトとフォーム送信を許可
<!-- 最も厳格なsandbox:すべての高度な機能を無効化 -->
<iframe src="https://example.com" sandbox=""></iframe>
<!-- スクリプトを許可するが、フォーム送信とポップアップをブロック -->
<iframe src="https://example.com" sandbox="allow-scripts"></iframe>
<!-- スクリプトとフォームを許可するが、ポップアップやナビゲーションなどはブロック -->
<iframe src="https://example.com"
sandbox="allow-scripts allow-forms"></iframe>
4. サードパーティコンテンツの埋め込み
実際の現場で最も一般的なiframeの使用法は、YouTube動画やGoogleマップなどのサードパーティサービスのコンテンツを埋め込むことです。
▶ サンプル
<!-- YouTube動画を埋め込む -->
<iframe width="560" height="315"
src="https://www.youtube.com/embed/VIDEO_ID"
title="YouTube動画プレーヤー"
allow="accelerometer; autoplay; clipboard-write;
encrypted-media; gyroscope; picture-in-picture"
allowfullscreen></iframe>
<!-- Googleマップを埋め込む -->
<iframe width="600" height="450"
src="https://www.google.com/maps/embed?pb=..."
title="Googleマップ"
allowfullscreen
loading="lazy"></iframe>
サードパーティコンテンツを埋め込む際、プラットフォームは通常、共有/埋め込みオプションで既製のiframeコードを提供しています ― コピー&ペーストするだけです。title 属性と loading="lazy" を必ず含めて、読み込みパフォーマンスを最適化してください。
5. iframeと親ページの通信の概要
iframeと親ページが同じオリジン(同じプロトコル、ドメイン、ポート)の場合、JavaScriptを介して互いのDOMに直接アクセスできます。クロスオリジンの場合は、HTML5が提供する postMessage API を使って安全に通信します。
<!-- 親ページがメッセージを送信 -->
<iframe src="https://other-domain.com/page"
id="myFrame" title="クロスオリジンページ"></iframe>
<script>
var frame = document.getElementById('myFrame');
frame.contentWindow.postMessage('こんにちは、iframe!', 'https://other-domain.com');
</script>
<!-- iframe内部でメッセージを受信(埋め込みページに記述する必要あり) -->
<script>
window.addEventListener('message', function(event) {
// 常にオリジンを検証!
if (event.origin !== 'https://parent-domain.com') return;
console.log('受信しました:', event.data);
});
</script>
🔒 セキュリティヒント:
postMessageを使用する際は、event.origin以外のものを決して信頼しないでください。常にメッセージの発信元を検証し、信頼できないドメインに機密データを送信しないようにしてください。
❓ よくある質問
sandboxで機能を制限し、allowで精密な権限制御を行い、X-Frame-Optionsヘッダーで埋め込みを防止します。sandbox属性とは何ですか?sandboxはiframeに「サンドボックス」を作成し、デフォルトですべての危険な操作(スクリプト、フォーム、ポップアップなど)を無効にします。権限を段階的に有効にできます:sandbox="allow-scripts"はJavaScriptを許可し、sandbox="allow-forms"はフォーム送信を許可し、sandbox="allow-same-origin"はCookieへのアクセスを許可します。複数の権限はスペースで区切ります。推奨事項:常にsandboxを使用し、実際に必要な権限のみを有効にします。<embed>/<object>の違いは何ですか?<iframe>はHTMLページの埋め込み専用で、完全な機能サポート(サンドボックス、postMessageなど)があります。<embed>と<object>は非HTMLコンテンツ(PDF、Flash、SVGなど)を埋め込みます。HTML5では、<embed>は空タグで、<object>はフォールバックコンテンツ(<param>とフォールバック)を含めることができます。推奨事項:ウェブページには<iframe>を使い、PDFには<embed>または<object>を使います。📖 まとめ
<iframe>は現在のページ内に別のHTMLページを埋め込むsrcで埋め込み先アドレスを指定。width/heightでサイズを制御titleはアクセシビリティの説明。nameはtarget属性と連携sandboxはiframe内の機能を制限し、セキュリティを強化- YouTube、Googleマップなどのサードパーティコンテンツはiframeで埋め込むのが一般的
postMessageはクロスオリジンの親子ページ間通信を可能にする
📝 練習問題
- 最初の動画を埋め込む: YouTube動画を見つけ、その埋め込みコードをコピーしてHTMLファイルに貼り付けてください。
title属性とloading="lazy"を必ず追加してください。 - Sandbox実験: iframeを作成し、まず
sandbox=""(最も厳格なモード)から始めて、徐々にallow-scriptsやallow-formsを有効にし、動作がどのように変化するか観察してください。