質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
iframe

HTMLのタグ<iframe>です。<iframe>は、ドキュメント内に""inline frame""を作るHTML要素で、同じページでセパレートしているドキュメントが表示されるようにします。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

2回答

16536閲覧

インラインフレーム(iframe)の理解できない現象…

退会済みユーザー

退会済みユーザー

総合スコア0

iframe

HTMLのタグ<iframe>です。<iframe>は、ドキュメント内に""inline frame""を作るHTML要素で、同じページでセパレートしているドキュメントが表示されるようにします。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

2クリップ

投稿2017/03/14 14:07

理解不足によるものと承知でタイトルにしましたが、本当に理解に苦しんでいます。
0. iframeのサイズをsytleで指定してもサイズが小さく表示される
0. iframeに被せるようにdivを配置してもiframeの方が上に表示される
0. iframeに被せたdivにopacityを1未満で指定すると上に表示される

Mac safari,chrome,opera にて動作を確認しました
firefoxは「1.サイズが小さく表示される」は発生しませんでした

イメージ説明

index.html

html

1<!DOCTYPE html> 2<html> 3<head> 4 <style> 5 body {padding:0;margin:0} 6 .overpanel { 7 background-color: pink; 8 border: 1px solid red; 9 box-sizing: border-box; 10 width: 600px; 11 height: 200px; 12 margin: auto; 13 margin-top : -200px; 14 } 15 .frame { 16 width: 600px; 17 height: 200px; 18 display: block; 19 margin: auto; 20 float: none; 21 } 22 .contents { 23 border: 20px solid skyblue; 24 box-sizing: border-box; 25 background-color: lightgreen; 26 width: 600px; 27 height: 200px; 28 margin: auto; 29 } 30 </style> 31</head> 32<body> 33<div style="height:50px;"></div> 34<!-- --> 35<iframe class="frame" src="iframe-content.html" marginheight="0" frameborder="0" scrolling="yes"></iframe> 36<div class="overpanel"></div> 37<!-- --> 38<div class="contents"></div> 39<div class="overpanel"></div> 40 41</body> 42</html>

iframe-content.html

html

1<html> 2<head> 3 <style> 4 .contents { 5 border: 20px solid skyblue; 6 box-sizing: border-box; 7 background-color: lightgreen; 8 width: 100%; 9 height:500px; 10 } 11 </style> 12</head> 13<body> 14 <div class="contents"></div> 15</body> 16</html>

iframeのサイズをsytleで指定してもサイズが小さく表示される
iframeのサイズを幅600pxにしていますが、実際には584pxで表示されています。
styleではなくiframe要素widthでwidth="600"にしても結果は同じでした。

iframeに被せるようにdivを配置してもiframeの方が上に表示される
iframeの次に配置したdivをマイナスマージンすることで上に重ねていいます。
通常、後から指定されたものが上に重なると理解しているのですが、そうなりません。

iframeに被せたdivにopacityを1未満で指定すると上に表示される
なんらかの理由でiframeの優先度が強いのかと思ったのですが…
opacity:0.99を指定すると上に表示されます。opacity:1だと下になります。
とても不可解な挙動に思えます。

1番の目的は「iframeの上にdivを重ねる」ということなのですが、サイズが小さくなることもデザイン上困っています。
原因と対策をご存知でしたら教えていただけるとうれしいです。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

iframeのサイズをsytleで指定してもサイズが小さく表示される

iframe-content.html で body { margin: 0; } にしてください。

iframeに被せるようにdivを配置してもiframeの方が上に表示される

iframeに限らずimgやただのテキストでも、divが後ろに表示されます。試してみてください。
また、<div class="overpanel">ほげほげ</div> のように文字を書くと、それはiframeの前に表示されます。試してみてください。
つまり、

  • 奥から順に .overpanelの背景 → iframe/img → .overpanelのテキスト

ということになります。

なぜこのようになるか、仕様書で事細かに決まっています。
次のリストが、ページの描画順番です。数字が大きいほど後に描画されます(つまり、最前面に来ます)。
9 Visual formatting model

  1. the background and borders of the element forming the stacking context.
  2. the child stacking contexts with negative stack levels (most negative first).
  3. the in-flow, non-inline-level, non-positioned descendants.
  4. the non-positioned floats.
  5. the in-flow, inline-level, non-positioned descendants, including inline tables and inline blocks.
  6. the child stacking contexts with stack level 0 and the positioned descendants with stack level 0.
  7. the child stacking contexts with positive stack levels (least positive first).

英語でわかりにくいかと思いますが、ざっくりいうと、

  1. スタックコンテキスト(今回は<html>のみ)の背景とボーダー
  2. スタックレベルが負である子スタックコンテキストとその子孫
  3. インラインレベル以外の要素(ただし2, 6, 7は除外)
  4. フロートしている要素(ただし2, 6, 7は除外)
  5. インラインレベルの要素(ただし2, 6, 7は除外)
  6. スタックレベルが0である子スタックコンテキストとその子孫、あるいはポジショニングされている要素
  7. スタックレベルが正である子スタックコンテキストとその子孫

です。これに今回のHTMLを当てはめると、

  1. (該当なし)
  2. (該当なし)
  3. .overpanelの背景(ただし、.overpanelの中身のインラインレベルのものは描画されない)
  4. (該当なし)
  5. iframe、img、テキストなど(.overpanelの中身のものも含む)
  6. (該当なし)
  7. (該当なし)

同じ数字に分類されているものは、HTMLの順番に描画されます。
(iframe がインラインレベルの要素に分類されています。たしかに display: block; が指定されていますが、iframeは置換インライン要素なので本体部分はインライン要素と見なされるためです。)

ここから分かる通り、

  • 奥から順に .overpanelの背景 → iframe/img → .overpanelのテキスト

のように描画される訳です。
「iframeの優先度が強い」というよりかは、**「.overpanelの背景色の優先度が低い」**のです。


上の解説は細かなことまで書いており分かりにくくなりましたが、要するに一般的なHTMLでは、下の順で描画されます。

  1. ブロックレベル要素の背景色(ソース順)
  2. 他のすべてのインラインレベル要素とテキスト(ソース順)

iframeに被せたdivにopacityを1未満で指定すると上に表示される

先程のリストで 「スタックコンテキスト」 という聞きなれない単語が出てきたかと思います。
実は、opacityを1未満で指定すると、その要素がスタックコンテキストになる のです。
MDN スタック文脈

1 未満の opacity 値を持つ要素

この場合、先程の描画順のリストはこうなります。

  1. (該当なし)
  2. (該当なし)
  3. (該当なし)
  4. (該当なし)
  5. iframe、img、テキストなど
  6. .overpanel
  7. (該当なし)

ゆえに、opacity:0.99 を指定するとiframeの上に表示されるのです。

なぜこういう挙動になっているかというと、透過処理の複雑化を避けるためです。
ある要素が スタックコンテキスト になると、背景色とインライン要素の描画順が分離することがなくなります。
つまり、その要素の子孫要素すべてを描画してから、全体の透過を一気にできるのです。

対策

.overpanel が描画順の5, 6, 7に来てくれれば、iframeの上に描画されることがわかりました。
ですので、一番簡素な方法は、

css

1.overpanel { 2 position: relative; 3}

として、.overpanelの描画順を6にすることです。

投稿2017/03/14 16:14

編集2017/03/14 16:26
kura

総合スコア368

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/03/14 16:47

回答ありがとうございます。 なるほど!とても良くわかりました。 iframeがfloatがデフォルトで指定されいたりとdivとは違うなと感じてはいましたが、表示順位も違っていたわけですね。 問題の解決だけではなくhtmlの理解に大変勉強になりました。 ありがとうございます。
guest

0

iframe-content.html のほうに

body { margin: 0px; padding: 0px; }

を追加してみて。

重ね表示の順番はz-indexっていうCSSがありますよ。

投稿2017/03/14 15:45

mnnEditor

総合スコア162

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/03/14 16:45

回答ありがとうございます。 iframeで呼び出される側のmarginが影響するとは思いもよりませんでした。 勉強になりました。 z-indexだとうまくいきました。htmlが少々複雑になりますがこれもありですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問