Update im Jahr 2019
TL; DR: Heute ist die beste Option die letzte in dieser Antwort - Flexbox. Alles unterstützt es gut und hat seit Jahren. Mach das und schau nicht zurück. Der Rest dieser Antwort bleibt aus historischen Gründen.
Der Trick besteht darin, zu verstehen, woraus die 100% bestehen. Das Lesen von CSS-Spezifikationen kann Ihnen dabei helfen.
Um es kurz zu machen - es gibt so etwas wie "Block enthalten" - was für das übergeordnete Element nicht erforderlich ist. Einfach gesagt, es ist das erste Element in der Hierarchie, das Position: relativ oder Position: absolut hat. Oder das Körperelement selbst, wenn es nichts anderes gibt. Wenn Sie also "width: 100%" sagen, wird die Breite des "enthaltenden Blocks" überprüft und die Breite Ihres Elements auf dieselbe Größe festgelegt. Wenn dort noch etwas anderes wäre, könnten Sie Inhalte eines "enthaltenden Blocks" erhalten, der größer als er selbst ist (also "überläuft").
Die Höhe funktioniert genauso. Mit einer Ausnahme. Sie können die Höhe des Browserfensters nicht auf 100% bringen. Das Element der obersten Ebene, anhand dessen 100% berechnet werden können, ist das Element body (oder html? Nicht sicher), das sich gerade so weit erstreckt, dass es seinen Inhalt enthält. Festlegen der Höhe: 100% haben keine Auswirkung, da es kein "übergeordnetes Element" gibt, an dem 100% gemessen werden können. Fenster selbst zählt nicht. ;)
Damit sich etwas genau 100% des Fensters ausdehnt, haben Sie zwei Möglichkeiten:
- Verwenden Sie JavaScript
- Verwenden Sie nicht DOCTYPE. Dies ist keine gute Vorgehensweise, versetzt die Browser jedoch in den "Mackenmodus", in dem Sie für Elemente height = "100%" ausführen können, und streckt sie auf die Fenstergröße. Beachten Sie, dass der Rest Ihrer Seite wahrscheinlich ebenfalls geändert werden muss, um die DOCTYPE-Änderungen zu berücksichtigen.
Update: Ich bin mir nicht sicher, ob ich mich nicht schon geirrt habe, als ich das gepostet habe, aber das ist jetzt sicherlich veraltet. Heute können Sie dies in Ihrem Stylesheet tun: html, body { height: 100% }
und es wird sich tatsächlich auf Ihr gesamtes Ansichtsfenster erstrecken. Auch mit einem DOCTYPE. min-height: 100%
könnte auch nützlich sein, abhängig von Ihrer Situation.
Und ich würde niemandem mehr raten, ein Dokument im Mackenmodus zu erstellen, da es weitaus mehr Kopfschmerzen verursacht als löst. Jeder Browser hat einen anderen Mackenmodus, sodass es zwei Größenordnungen schwieriger wird, Ihre Seite konsistent über Browser hinweg anzuzeigen. Verwenden Sie einen DOCTYPE. Immer. Am liebsten das HTML5 - <!DOCTYPE html>
. Es ist leicht zu merken und wirkt wie ein Zauber in allen Browsern, auch in den 10-jährigen.
Die einzige Ausnahme ist, wenn Sie etwas wie IE5 oder etwas unterstützen müssen. Wenn du da bist, bist du sowieso alleine. Diese alten Browser sind nichts anderes als die heutigen Browser, und nur wenige Ratschläge, die hier gegeben werden, helfen Ihnen dabei. Auf der positiven Seite, wenn Sie dort sind, müssen Sie wahrscheinlich nur EINE Art von Browser unterstützen, wodurch die Kompatibilitätsprobleme beseitigt werden.
Viel Glück!
Update 2: Hey, es ist lange her! 6 Jahre später sind neue Optionen auf der Bühne. Ich hatte gerade eine Diskussion in den Kommentaren unten, hier sind weitere Tricks für Sie, die in den heutigen Browsern funktionieren.
Option 1 - absolute Positionierung. Schön und sauber, wenn Sie die genaue Höhe des ersten Teils kennen.
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>
Einige Hinweise - das second-row
ist Container benötigt , da bottom: 0
und right: 0
funktioniert nicht auf Iframes aus irgendeinem Grund. Etwas damit zu tun, ein "ersetztes" Element zu sein. Aber width: 100%
und height: 100%
funktioniert gut. display: block
wird benötigt, weil es eininline
standardmäßig Element ist und Leerzeichen ansonsten seltsame Überläufe verursachen.
Option 2 - Tabellen. Funktioniert, wenn Sie die Höhe des ersten Teils nicht kennen. Sie können entweder tatsächliche <table>
Tags verwenden oder dies auf ausgefallene Weise tun display: table
. Ich werde mich für Letzteres entscheiden, weil es heutzutage in Mode zu sein scheint.
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>
Einige Hinweise - das overflow: auto
stellt sicher, dass die Zeile immer den gesamten Inhalt enthält. Andernfalls können schwimmende Elemente manchmal überlaufen. Dasheight: 100%
in der zweiten Reihe stellt sicher, dass es sich so weit wie möglich ausdehnt und die erste Reihe so klein wie möglich drückt.
Option 3 - Flexbox. Der sauberste von allen, aber mit einer weniger als hervorragenden Browser-Unterstützung. IE10 benötigt -ms-
Präfixe für die Flexbox-Eigenschaften, und alles andere unterstützt dies überhaupt nicht.
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>
Einige Hinweise - das overflow: hidden
liegt daran, dass der Iframe auch display: block
in diesem Fall immer noch einen Überlauf erzeugt . Es ist in der Vollbildansicht oder im Snippet-Editor nicht sichtbar, aber das kleine Vorschaufenster erhält eine zusätzliche Bildlaufleiste. Keine Ahnung was das ist, iframes sind komisch.
Wir verwenden ein JavaScript, um dieses Problem zu lösen. Hier ist die Quelle.
Hinweis:
ifm
ist die Iframe-IDpageY()
wurde von John Resig (dem Autor von jQuery) erstelltquelle
Eine andere Möglichkeit, dies zu tun, wäre die Verwendung des
position: fixed;
übergeordneten Knotens.Wenn ich mich nicht irre,
position: fixed;
bindet das Element an das Ansichtsfenster. Sobald Sie diesen Knotenwidth: 100%;
und dieseheight: 100%;
Eigenschaften angegeben haben, erstreckt es sich über den gesamten Bildschirm. Ab diesem Zeitpunkt können Sie das<iframe>
Tag einfach darin platzieren und über den verbleibenden Platz (sowohl in der Breite als auch in der Höhe) verteilenwidth: 100%; height: 100%;
CSS-Anweisung verteilen.Beispielcode
quelle
position: fixed
dem Iframe auch etwas hinzufügen müssen .Hier einige moderne Ansätze:
Ansatz 1 - Kombination der relativen Einheiten des Ansichtsfensters /
calc()
.Der Ausdruck
calc(100vh - 30px)
repräsentiert die verbleibende Höhe. Wo100vh
ist die Höhe des Browsers und die Verwendung von verschiebtcalc()
effektiv die Höhe des anderen Elements.Beispiel hier
Unterstützung für
calc()
hier ; Unterstützung für Viewport-relative Einheiten hier .Ansatz 2 - Flexbox-Ansatz
Beispiel hier
Setzen Sie das
display
des gemeinsamen übergeordneten Elements aufflex
zusammen mitflex-direction: column
(vorausgesetzt, Sie möchten, dass die Elemente übereinander gestapelt werden). Setzen Sie dannflex-grow: 1
das untergeordneteiframe
Element, damit es den verbleibenden Platz ausfüllt.Da dieser Ansatz weniger Unterstützung bietet 1 , würde ich empfehlen, den oben genannten Ansatz zu wählen.
1 Obwohl es in Chrome / FF zu funktionieren scheint, funktioniert es nicht im IE (die erste Methode funktioniert in allen aktuellen Browsern).
quelle
flexbox
Option, weilcalc
Sie mit wissen müssen, wie viel Platz von der abziehen sollvh
. Mitflexbox
einem einfachenflex-grow:1
macht es.Sie können es mit tun
DOCTYPE
, aber Sie müssen verwendentable
. Überprüfen Sie dies heraus:quelle
Vielleicht wurde dies bereits beantwortet (einige der obigen Antworten sind "richtige" Methoden, um dies zu tun), aber ich dachte, ich würde auch nur meine Lösung hinzufügen.
Unser iFrame ist in einem Div geladen, daher brauchte ich etwas anderes als window.height. Da unser Projekt bereits stark von jQuery abhängt, finde ich dies die eleganteste Lösung:
Wo natürlich "#middle" die ID des Div ist. Das einzige zusätzliche, was Sie tun müssen, ist, diese Größenänderung abzurufen, wenn der Benutzer die Größe des Fensters ändert.
quelle
Folgendes habe ich getan. Ich hatte das gleiche Problem und suchte stundenlang im Internet nach Ressourcen.
Ich habe dies dem Hauptteil hinzugefügt.
Bitte beachten Sie, dass sich mein Iframe in der mittleren Zelle einer Tabelle mit 3 Zeilen und 1 Spalte befindet.
quelle
MichAdel-Code funktioniert für mich, aber ich habe einige geringfügige Änderungen vorgenommen, damit er ordnungsgemäß funktioniert.
quelle
Es ist richtig, Sie zeigen einen Iframe mit 100% Höhe in Bezug auf seinen Container: den Körper.
Versuche dies:
Ändern Sie natürlich die Höhe des zweiten Div auf die gewünschte Höhe.
quelle
Versuche Folgendes:
es hat bei mir funktioniert
quelle
Sie können dies mit HTML / CSS wie folgt tun:
quelle
Neu in HTML5: Verwenden Sie calc (auf Höhe)
quelle
Ich habe display: table verwendet, um ein ähnliches Problem zu beheben. Es funktioniert fast dafür und hinterlässt eine kleine vertikale Bildlaufleiste. Wenn Sie versuchen, diese flexible Spalte mit etwas anderem als einem Iframe zu füllen, funktioniert dies einwandfrei (nicht
Nehmen Sie den folgenden HTML-Code
Ändern Sie das äußere Div, um display: table zu verwenden, und stellen Sie sicher, dass Breite und Höhe festgelegt sind.
Machen Sie das Banner zu einer Tischreihe und stellen Sie die Höhe auf Ihre Vorlieben ein:
Fügen Sie einen zusätzlichen Div um Ihren Iframe (oder den gewünschten Inhalt) hinzu und machen Sie ihn zu einer Tabellenzeile mit einer Höhe von 100% (das Festlegen der Höhe ist wichtig, wenn Sie einen Iframe einbetten möchten, um die Höhe zu füllen).
Unten ist eine jsfiddle, die es bei der Arbeit zeigt (ohne Iframe, weil das in der Geige nicht zu funktionieren scheint).
https://jsfiddle.net/yufceynk/1/
quelle
Ich denke, Sie haben hier ein konzeptionelles Problem. Zu sagen "Ich habe versucht, die Höhe einzustellen: 100% auf dem Iframe, das Ergebnis ist ziemlich nahe, aber der Iframe hat versucht, die gesamte Seite zu füllen." . Nun, wann war "100%" nicht gleich "ganz"?
Sie haben den Iframe gebeten, die gesamte Höhe seines Containers (der der Körper ist) zu füllen, aber leider hat er ein Block-Level-Geschwister im <div>, über dem Sie 30px groß sein möchten. Die übergeordnete Containersumme wird nun aufgefordert, eine Größe von 100% + 30px> 100% festzulegen! Daher Bildlaufleisten.
Was Sie damit meinen, ist, dass Sie möchten, dass der Iframe das verbraucht, was wie Frames und Tabellenzellen übrig bleibt , dh height = "*". IIRC existiert nicht.
Leider gibt es nach meinem besten Wissen auch keine Möglichkeit, absolute und relative Einheiten effektiv zu mischen / zu berechnen / zu subtrahieren. Ich denke, Sie haben zwei Möglichkeiten:
Positionieren Sie Ihr Div unbedingt so, dass es aus dem Container genommen wird, sodass der Iframe allein die Containerhöhe verbraucht. Dies lässt Sie zwar mit allen möglichen anderen Problemen zurück, aber vielleicht wäre es für das, was Sie tun, Deckkraft oder Ausrichtung in Ordnung.
Alternativ müssen Sie eine% -Höhe für das Div angeben und die Höhe des Iframes um diesen Betrag reduzieren. Wenn die absolute Höhe wirklich so wichtig ist, müssen Sie diese stattdessen auf ein untergeordnetes Element des div anwenden.
quelle
Nachdem ich eine Weile die CSS-Route ausprobiert hatte, schrieb ich etwas ziemlich Grundlegendes in jQuery, das den Job für mich erledigte:
Getestet in IE8, Chrome, Firefox 3.6
quelle
Es wird mit dem unten genannten Code funktionieren
quelle
Ähnliche Antwort von @MichAdel, aber ich benutze JQuery und eleganter.
iframe_id
ist die ID des iframe-Tagsquelle
Sie können dies tun, indem Sie die Körpergröße bei Lade- / Größenänderungsereignissen messen und die Höhe auf (volle Höhe - Bannerhöhe) einstellen.
Beachten Sie, dass Sie diese Größe derzeit in IE8 Beta2 nicht ändern können, da dieses Ereignis derzeit in IE8 Beta2 unterbrochen ist.
quelle
oder du kannst in die alte Schule gehen und vielleicht ein Frameset verwenden :
quelle
Obwohl ich der Meinung bin, dass JS eine bessere Option ist, habe ich eine Lösung, die nur mit CSS funktioniert. Der Nachteil dabei ist, dass Sie, wenn Sie Ihrem iframe-HTML-Dokument häufig Inhalte hinzufügen müssen, einen Prozentsatz der Zeit anpassen müssen.
Lösung:
Versuchen Sie , für BEIDE HTML-Dokumente keine Höhe anzugeben.
dann nur noch codieren:
Hinweis: Das Div sollte Ihr Hauptteil sein.
Dies sollte relativ funktionieren. Der Iframe berechnet genau 300% der sichtbaren Fensterhöhe. Wenn Sie HTML-Inhalte aus dem 2. Dokument (im Iframe) kleiner als das Dreifache Ihrer Browserhöhe haben, funktioniert dies. Wenn Sie diesem Dokument nicht häufig Inhalte hinzufügen müssen, ist dies eine dauerhafte Lösung, und Sie können einfach Ihren eigenen Prozentsatz finden, der entsprechend Ihrer Inhaltshöhe benötigt wird.
Dies funktioniert, weil verhindert wird, dass das 2. HTML-Dokument (das eingebettete) seine Höhe vom übergeordneten HTML-Dokument erbt. Dies wird verhindert, da für beide keine Höhe angegeben wurde. Wenn wir dem Kind ein% geben, sucht es nach seinem Elternteil. Wenn nicht, nimmt es seine Inhaltshöhe an. Und nur, wenn die anderen Container keine Höhen haben, wie ich es versucht habe.
quelle
Das Attribut " nahtlos " ist ein neuer Standard, mit dem dieses Problem gelöst werden soll:
http://www.w3schools.com/tags/att_iframe_seamless.asp
Wenn Sie dieses Attribut zuweisen, werden Rahmen und Bildlaufleisten entfernt und der Iframe auf seine Inhaltsgröße angepasst. Es wird jedoch nur in Chrome und der neuesten Version von Safari unterstützt
Mehr dazu hier: HTML5 iFrame Seamless Attribute
quelle
Eine einfache jQuery-Lösung
Verwenden Sie dies in einem Skript auf der iframed-Seite
quelle
Sie können die Iframe-Höhe nicht in% festlegen, da die Körpergröße Ihres Elternteils nicht 100% beträgt. Stellen Sie daher die Höhe des Elternteils auf 100% ein und wenden Sie dann die Iframe-Höhe auf 100% an
quelle
Wenn Sie Zugriff auf den Inhalt des zu ladenden Iframes haben, können Sie dessen übergeordnetem Element anweisen, die Größe bei jeder Größenänderung zu ändern.
Wenn Sie mehr als einen Iframe auf der Seite haben, müssen Sie möglicherweise IDs oder andere clevere Methoden verwenden, um .find ("Iframe") zu verbessern, damit Sie den richtigen auswählen.
quelle
Ich denke, der beste Weg, um dieses Szenario mit CSS-Position zu erreichen. Stellen Sie die Position relativ zu Ihrem übergeordneten Div und die Position ein: absolut zu Ihrem Iframe.
Für andere Padding- und Margin-Probleme ist css3 calc () seit Tagen sehr weit fortgeschritten und größtenteils auch mit allen Browsern kompatibel.
check calc ()
quelle
Warum nicht (mit geringfügigen Anpassungen für Körperpolster / Ränder)?
quelle
-0
mit+'px'
am Ende. Funktioniert es auf dem Handy?