[解決済み】Iframeをコンテナの残り高さの100%にフィットさせる
質問
バナーとiframeを使ったWebページをデザインしたい。iframeが残りのページの高さをすべて埋め、ブラウザのサイズ変更に伴って自動的にサイズ変更されることを希望します。JavaScriptのコードを書かずに、CSSだけで実現することは可能でしょうか?
を設定しようとしました。
height:100%
を含むページ全体の高さを埋め尽くそうとします。
30px
の高さが足りないため、不要な縦スクロールバーが表示されてしまいます。完璧ではありません。
DIVのCSS margin, padding属性で、Webページの残りの高さをすべて占有することに成功しましたが、iframeではこのトリックはうまくいきませんでした。
<body>
<div style="width:100%; height:30px; background-color:#cccccc;">Banner</div>
<iframe src="http: //www.google.com.tw" style="width:100%; height:100%;"></iframe>
</body>
解決方法は?
2019年のアップデートについて
TL;DR。 今日、最良の選択肢は-。 フレックスボックス . すべてのものがうまくサポートしていますし、何年も前からそうでした。もう振り返らないでください。フレックスボックスのコード サンプルを以下に示します。
body, html {width: 100%; height: 100%; margin: 0; padding: 0}
.row-container {display: flex; width: 100%; height: 100%; flex-direction: column; background-color: blue; overflow: hidden;}
.first-row {background-color: lime; }
.second-row { flex-grow: 1; border: none; margin: 0; padding: 0; }
<div class="row-container">
<div class="first-row">
<p>Some text</p>
<p>And some more text</p>
</div>
<iframe src="https://jsfiddle.net/about" class="second-row"></iframe>
</div>
この答えの残りは、学習&歴史的な理由のために残されています。
コツは、100%が何から取られているのかを理解することです。CSSの仕様書を読むと、そこそこ役に立ちます。
長い話を短くすると、quot;containing block"というものがあり、これは必ずしも親要素である必要はないのです。簡単に言うと、position:relativeまたはposition:absoluteを持つ、階層上の最初の要素です。他に何もない場合は、body 要素そのものです。つまり、"width: 100%" と言うと、"containing block" の幅をチェックして、あなたの要素の幅を同じサイズに設定するのです。もし、他に何かがあった場合、自分よりも大きなブロックの内容が表示されるかもしれません(つまり、オーバーフローします)。
高さも同じように動作します。 ただし、1つだけ例外があります。ブラウザウィンドウの100%まで高さを確保することはできません。100%を計算できる最上位の要素はbody(またはhtml?)要素で、この要素はそのコンテンツを含むのに十分な大きさになります。この要素にheight:100%を指定しても、100%を計算するための親要素がないため、何の効果もありません。ウィンドウ自体はカウントされません。)
何かをウィンドウのちょうど100%に引き伸ばすには、2つの選択肢があります。
- JavaScriptを使用する
- DOCTYPEは使わないでください。これは良い習慣ではありませんが、ブラウザをquot;quirksモードにし、要素にheight="100%"を指定すると、ウィンドウサイズに合わせてそれらを引き伸ばすことができるようになります。DOCTYPEの変更に対応するために、おそらくページの残りの部分も変更しなければならないことに注意してください。
アップデート
これを投稿した時点で既に間違っていなかったのかどうかは分かりませんが、確かにこれはもう時代遅れですね。今日、あなたはスタイルシートでこれを行うことができます。
html, body { height: 100% }
で、実際にビューポート全体に引き伸ばされます。DOCTYPEを使っても
min-height: 100%
も、状況によっては有効でしょう。
そして、私
Quirks-modeのドキュメントを作ることは誰にも勧めません。
なぜなら、解決するよりも頭痛の種になることの方がずっと多いからです。ブラウザごとにquirks-modeが異なるので、ブラウザ間で一貫してページを表示させることは、2桁以上難しくなります。DOCTYPEを使いましょう。常に。できればHTML5のものを
<!DOCTYPE html>
. 覚えやすいし、10年前のブラウザでも、すべてのブラウザで魅力的に機能します。
例外は、IE5とかに対応しなければならないときだけです。そこそこなら、とにかく自己責任で。それらの古いブラウザーは、今日のブラウザーとは全く違っていて、ここに書かれているようなアドバイスはほとんど役に立ちません。明るい面では、もしあなたがそこにいるのなら、おそらく1種類のブラウザをサポートすればよく、互換性の問題は解消されるでしょう。
がんばってください
アップデート2 やあ、お久しぶりです! 6年後、新たな選択肢が登場。ちょうど下のコメントで議論していたところです。ここでは、今日のブラウザで動作するさらなるトリックを紹介します。
オプション1 - 絶対位置決め。最初の部分の正確な高さがわかっている場合に便利な、すっきりとしたデザインです。
body, html {width: 100%; height: 100%; margin: 0; padding: 0}
.first-row {position: absolute;top: 0; left: 0; right: 0; height: 100px; background-color: lime;}
.second-row {position: absolute; top: 100px; left: 0; right: 0; bottom: 0; background-color: red }
.second-row iframe {display: block; width: 100%; height: 100%; border: none;}
<div class="first-row">
<p>Some text</p>
<p>And some more text</p>
</div>
<div class="second-row">
<iframe src="https://jsfiddle.net/about"></iframe>
</div>
いくつかの注意点
second-row
コンテナが必要なのは
bottom: 0
と
right: 0
は、なぜかiframeでは動作しません。inが"replaced"要素であることと関係があるようです。しかし
width: 100%
と
height: 100%
は正常に動作します。
display: block
が必要なのは、それが
inline
要素で、空白があると奇妙なオーバーフローが発生します。
オプション2
- テーブルを使用します。最初の部分の高さがわからない場合に有効。実際の
<table>
タグを使うか、あるいは
display: table
. 最近は後者が流行っているようなので、後者でいこうと思います。
body, html {width: 100%; height: 100%; margin: 0; padding: 0}
.row-container {display: table; empty-cells: show; border-collapse: collapse; width: 100%; height: 100%;}
.first-row {display: table-row; overflow: auto; background-color: lime;}
.second-row {display: table-row; height: 100%; background-color: red; overflow: hidden }
.second-row iframe {width: 100%; height: 100%; border: none; margin: 0; padding: 0; display: block;}
<div class="row-container">
<div class="first-row">
<p>Some text</p>
<p>And some more text</p>
</div>
<div class="second-row">
<iframe src="https://jsfiddle.net/about"></iframe>
</div>
</div>
いくつかの注意点
overflow: auto
は、行が常にその内容をすべて含むようにします。そうしないと、フローティング要素が時々オーバーフローすることがあります。また
height: 100%
は、2行目の行ができるだけ拡張され、1行目ができるだけ小さくなるようにするためです。
おすすめです。オプション3 - flexbox - この中で最もクリーンなものです。
body, html {width: 100%; height: 100%; margin: 0; padding: 0}
.row-container {display: flex; width: 100%; height: 100%; flex-direction: column; background-color: blue; overflow: hidden;}
.first-row {background-color: lime; }
.second-row { flex-grow: 1; border: none; margin: 0; padding: 0; }
<div class="row-container">
<div class="first-row">
<p>Some text</p>
<p>And some more text</p>
</div>
<iframe src="https://jsfiddle.net/about" class="second-row"></iframe>
</div>
いくつかの注意点
overflow: hidden
を使用しても、iframe は何らかのオーバーフローを発生させるからです。
display: block
この場合 フルスクリーン表示やスニペットエディタでは見えませんが、小さなプレビューウィンドウには余分なスクロールバーが表示されます。これが何なのかは分かりませんが、iframeは奇妙です。
関連
-
[解決済み】divの高さを画面の残りスペースで埋めるようにする
-
[解決済み] 迷子の終了タグ "head"
-
[解決済み] ChromeのデベロッパーツールでHTML Bodyにcz-shortcut-listen="true "が表示される?
-
[解決済み] ボディの高さをブラウザの高さの100%にする
-
[解決済み] CSS 100% height と padding/margin の関係
-
[解決済み] 残りの幅を埋めるためにdivを展開する
-
[解決済み] CSSで背景画像を幅に合わせ、高さは比例して自動縮小する
-
[解決済み】Divの高さが100%で、コンテンツに合わせて拡大される。
-
[解決済み】display:flexを使って残りの縦幅をCSSで埋める。
-
[解決済み] Twitter Bootstrap: コンテナ内のdivを100%の高さにする
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】iframeを水平方向にセンタリングする方法は?
-
[解決済み】このインラインブロックのdiv要素の間に説明のつかない隙間があるのはなぜですか?[重複]
-
[解決済み】ローカルの実行ファイルへのハイパーリンクを作成する方法は?
-
[解決済み] 絶対位置が機能しない
-
[解決済み] ボディの背景色が表示されない?
-
[解決済み] カーソルを指ポインタに変更
-
[解決済み] 以下のHTMLフォームの例で、「mailto:[email protected]」とは何ですか?
-
[解決済み] ionic 4でion-buttonをセンタリングする方法は?[重複しています]
-
[解決済み] 送信ボタンが機能しない
-
[解決済み] HTMLボタンのテキストを固定幅で折り返すには?