Ich habe einen Container div
mit zwei Kindern. Das erste Kind hat eine bestimmte Größe. Wie kann ich das zweite Kind dazu bringen, den "freien Platz" des Containers zu belegen, div
ohne eine bestimmte Höhe anzugeben?
Im Beispiel sollte das Rosa div
auch den weißen Raum einnehmen.
Ähnlich wie bei dieser Frage: Wie kann man div dazu bringen, die verbleibende Höhe einzunehmen?
Aber ich möchte keine absolute Position geben .
Antworten:
Das Erweitern des untergeordneten Elements
#down
, um den verbleibenden Speicherplatz zu füllen,#container
kann auf verschiedene Arten erfolgen, je nachdem, welche Browserunterstützung Sie erreichen möchten und ob#up
eine definierte Höhe vorliegt oder nicht .Proben
Code-Snippet anzeigen
Gitter
Das
grid
Layout von CSS bietet eine weitere Option, die jedoch möglicherweise nicht so einfach ist wie das Flexbox-Modell. Es ist jedoch nur das Styling des Containerelements erforderlich:Das
grid-template-rows
definiert die erste Zeile als feste Höhe von 100 Pixel, und die verbleibenden Zeilen werden automatisch gedehnt, um den verbleibenden Platz auszufüllen.Ich bin mir ziemlich sicher, dass IE11
-ms-
Präfixe erfordert. Überprüfen Sie daher die Funktionalität in den Browsern, die Sie unterstützen möchten.Flexbox
Das Flexible Box Layout Module (
flexbox
) von CSS3 wird jetzt gut unterstützt und kann sehr einfach implementiert werden. Da es flexibel ist, funktioniert es auch, wenn#up
keine Höhe definiert ist.Es ist wichtig zu beachten, dass die IE10- und IE11-Unterstützung für einige Flexbox-Eigenschaften fehlerhaft sein kann und IE9 oder niedriger überhaupt keine Unterstützung bietet.
Berechnete Höhe
Eine andere einfache Lösung besteht darin, die CSS3-
calc
Funktionseinheit zu verwenden, wie Alvaro in seiner Antwort hervorhebt. Die Größe des ersten Kindes muss jedoch ein bekannter Wert sein:Es wird ziemlich häufig unterstützt, mit den einzigen bemerkenswerten Ausnahmen <= IE8 oder Safari 5 (keine Unterstützung) und IE9 (teilweise Unterstützung). Einige andere Probleme umfassen die Verwendung von calc in Verbindung mit Transformation oder Box-Shadow. Testen Sie daher unbedingt in mehreren Browsern, ob dies für Sie von Belang ist.
Andere Alternativen
Wenn ältere Unterstützung benötigt wird, können Sie hinzufügen
height:100%;
,#down
dass das rosa Div mit einer Einschränkung die volle Höhe erreicht. Dies führt zu einem Überlauf des Behälters, da#up
dieser nach unten gedrückt wird.Daher können Sie
overflow: hidden;
dem Container etwas hinzufügen, um dies zu beheben.Wenn die Höhe von
#up
festgelegt ist, können Sie sie auch absolut innerhalb des Behälters positionieren und eine Polsterplatte hinzufügen#down
.Eine weitere Option wäre die Verwendung einer Tabellenanzeige:
quelle
position: relative;
positioniert ist und sich relativ zum Container und nicht zum Fenster befindet. Das sollte also eine praktikable Option sein.Es ist fast zwei Jahre her, seit ich diese Frage gestellt habe. Ich habe mir gerade css calc () ausgedacht, das dieses Problem behebt, und dachte, es wäre schön, es hinzuzufügen, falls jemand das gleiche Problem hat. (Übrigens habe ich letztendlich die Position absolut verwendet).
http://jsfiddle.net/S8g4E/955/
Hier ist die CSS
Weitere Informationen dazu finden Sie hier: http://css-tricks.com/a-couple-of-use-cases-for-calc/
Browserunterstützung: http://caniuse.com/#feat=calc
quelle
calc
denen eine breite Browserunterstützung nicht so wichtig ist (IE8 und darunter und Safari 5 unterstützen sie nicht).#up
Höhe Ähnliches zu tun ?Meine Antwort verwendet nur CSS und keinen Überlauf: versteckt oder angezeigt: Tabellenzeile. Es erfordert, dass das erste Kind wirklich eine bestimmte Größe hat, aber in Ihrer Frage geben Sie an, dass nur die Größe des zweiten Kindes nicht angegeben werden muss. Ich glaube, Sie sollten dies für akzeptabel halten.
html
CSS
http://jsfiddle.net/S8g4E/288/
quelle
Überprüfen Sie die Demo - http://jsfiddle.net/S8g4E/6/
benutze CSS -
quelle
height: 1px
,#up
um sicherzustellen, dass die Mindesthöhe erreicht wird. Hier ist die Browser-Unterstützung fürdisplay: table
: caniuse.com/css-tableEs sei denn , ich bin Missverständnis, können Sie einfach hinzufügen
height: 100%;
undoverflow:hidden;
zu#down
.Live DEMO
Bearbeiten: Da Sie nicht verwenden möchten
overflow:hidden;
, können Siedisplay: table;
für dieses Szenario verwenden; Es wird jedoch vor IE 8 nicht unterstützt. (display: table;
Unterstützung )Live DEMO
Hinweis: Sie haben gesagt, dass die
#down
Höhe#container
Höhe minus#up
Höhe sein soll. Diedisplay:table;
Lösung macht genau das und diese jsfiddle wird das ziemlich klar darstellen.quelle
overflow:hidden
, um den zusätzlichen Inhalt auszublenden.Sie können Floats verwenden, um Inhalte nach unten zu verschieben:
http://jsfiddle.net/S8g4E/5/
Sie haben einen Container mit fester Größe:
Der Inhalt darf neben einem Float fließen. Es sei denn, wir stellen den Schwimmer auf volle Breite ein:
Während
#up
und#down
teilen Sie die obere Position,#down
kann der Inhalt erst nach dem unteren Rand des Floats beginnen#up
:quelle
#up
tatsächlich der obere Teil von#down
: jsfiddle.net/thirtydot/S8g4E/9#up
, ist es wahrscheinlich akzeptabel.Abstrakt
Ich fand keine zufriedenstellende Antwort, also musste ich es selbst herausfinden.
Meine Anforderungen:
calc()
sollte nicht verwendet werden, da das verbleibende Element nichts über andere Elementgrößen wissen sollte ;Die Lösung
flex-grow: 1
zu allen direkt Eltern mit berechneter Höhe (falls vorhanden) und das Elemente , so dass sie alle verbleibenden Platz , wenn das Element Inhaltsgröße kleiner wird dauern;flex-shrink: 0
für alle Flex-Elemente mit fester Höhe an , damit sie nicht werden wird kleiner , wenn der Elementinhalt Größe ist größer als die verbleibende Raumgröße;overflow: hidden
an, dass alle direkten Eltern mit berechneter Höhe (falls vorhanden) das Scrollen deaktivieren und die Anzeige von Überlaufinhalten verbieten sollen.overflow: auto
zu dem Element zu ermöglichen , im Inneren zu scrollen.JSFiddle (Element hat direkte Eltern mit berechneter Höhe)
JSFiddle (einfacher Fall: keine direkten Eltern mit berechneter Größe)
quelle
Ich bin mir nicht sicher, ob dies nur mit CSS möglich ist, es sei denn, Sie täuschen es gerne mit Illusionen vor. Verwenden Sie vielleicht die Antwort von Josh Mein und setzen Sie
#container
aufoverflow:hidden
.Für das, was es wert ist, ist hier eine jQuery-Lösung:
quelle