Wie kann ich mit HTML / CSS ein Element erstellen, dessen Breite und / oder Höhe 100% des übergeordneten Elements beträgt und das dennoch über die richtigen Auffüllungen oder Ränder verfügt?
Durch die „richtigen“ Ich meine , dass , wenn meine Eltern - Element ist 200px
groß und ich angeben , height = 100%
mit padding = 5px
ich würde erwarten , dass ich einen bekommen soll 190px
mit hohem Elemente border = 5px
auf allen Seiten, schön im Elternelement zentrierte.
Jetzt weiß ich, dass das Standard-Box-Modell nicht vorschreibt, dass es funktionieren soll (obwohl ich genau wissen möchte, warum ...), daher funktioniert die offensichtliche Antwort nicht:
#myDiv {
width: 100%
height: 100%;
padding: 5px;
}
Aber es scheint mir, dass es EINIGE Möglichkeiten geben muss, diesen Effekt für einen Elternteil beliebiger Größe zuverlässig zu erzeugen. Kennt jemand einen Weg, um diese (scheinbar einfache) Aufgabe zu erfüllen?
Oh, und fürs Protokoll, ich bin nicht sonderlich an IE-Kompatibilität interessiert, so dass (hoffentlich) die Dinge ein bisschen einfacher werden sollten.
EDIT: Da nach einem Beispiel gefragt wurde, ist hier das einfachste, das ich mir vorstellen kann:
<html style="height: 100%">
<body style="height: 100%">
<div style="background-color: black; height: 100%; padding: 25px"></div>
</body>
</html>
Die Herausforderung besteht dann darin, die Black Box mit einem 25-Pixel-Abstand an allen Kanten anzuzeigen, ohne dass die Seite groß genug wird, um Bildlaufleisten zu erfordern.
Antworten:
Ich habe gelernt, wie man solche Dinge macht, indem ich " PRO HTML und CSS Design Patterns " lese . Das
display:block
ist der Standardanzeigewert fürdiv
, aber ich möchte es explizit machen. Der Container muss vom richtigen Typ sein;position
Attribut istfixed
,relative
oderabsolute
.Geige nach Nooshus Kommentar
quelle
top:0
,bottom:0
im wesentlichen "Stretch" aus dem Elemente. Ich kann es aber nur zumposition:absolute
Laufen bringentop:20px;bottom:20px;left:20px;right:20px;
anstatt überhaupt Ränder zu verwenden?In CSS3 gibt es eine neue Eigenschaft , mit der Sie die Art und Weise ändern können, wie das Box-Modell Breite / Höhe berechnet. Diese wird als Box-Größe bezeichnet.
Wenn Sie diese Eigenschaft mit dem Wert "border-box" festlegen, wird das Element, auf das Sie es anwenden, beim Hinzufügen eines Auffüllers oder Rahmens nicht gedehnt. Wenn Sie etwas mit einer Breite von 100 Pixel und einer Polsterung von 10 Pixel definieren, ist es immer noch 100 Pixel breit.
Hier finden Sie Informationen zur Browserunterstützung . Es funktioniert nicht für IE7 und niedriger, aber ich glaube, dass Dean Edwards IE7.js Unterstützung dafür hinzufügt. Genießen :)
quelle
border-box
ist jeder Held :)Die Lösung besteht darin, Höhe und Breite NICHT zu verwenden! Befestigen Sie die innere Box oben, links, rechts, unten und fügen Sie dann einen Rand hinzu.
quelle
Der bessere Weg ist mit der Eigenschaft calc (). Ihr Fall würde also so aussehen:
Einfach, sauber, keine Problemumgehungen. Stellen Sie nur sicher, dass Sie den Abstand zwischen den Werten und dem Operator nicht vergessen (z. B.
(100%-5px)
wird dadurch die Syntax verletzt. Viel Spaß!quelle
Gemäß der w3c-Spezifikation bezieht sich die Höhe auf die Höhe des sichtbaren Bereichs, z. B. auf einem Monitor mit einer Auflösung von 1280 x 1024 Pixel, 100% Höhe = 1024 Pixel.
Die Mindesthöhe bezieht sich auf die Gesamthöhe der Seite einschließlich des Inhalts auf einer Seite, auf der der Inhalt größer als 1024 Pixel ist. Mindesthöhe: 100% werden gedehnt, um den gesamten Inhalt einzuschließen.
Das andere Problem ist dann, dass in den meisten modernen Browsern mit Ausnahme von ie6 Polsterung und Rahmen zur Höhe und Breite hinzugefügt werden (ie6 ist eigentlich ziemlich logisch, entspricht aber nicht der Spezifikation). Dies wird als Box-Modell bezeichnet. Also, wenn Sie angeben
Es gibt Ihnen tatsächlich 100% + 5px + 5px für die Höhe. Um dies zu umgehen, benötigen Sie einen Wrapper-Container.
quelle
1. Volle Höhe mit
padding
2. Volle Höhe mit
margin
3. Volle Höhe mit
border
quelle
Dies ist eine der absoluten Idiokien von CSS - ich habe die Argumentation noch nicht verstanden (wenn jemand weiß, bitte erklären).
100% bedeutet 100% der Behälterhöhe - zu der alle Ränder, Ränder und Polsterungen hinzugefügt werden. Es ist also praktisch unmöglich, einen Container zu erhalten, der das übergeordnete Element ausfüllt und einen Rand, einen Rand oder eine Polsterung aufweist.
Beachten Sie auch, dass das Einstellen der Höhe auch zwischen Browsern notorisch inkonsistent ist.
Eine andere Sache, die ich gelernt habe, seit ich dies gepostet habe, ist, dass der Prozentsatz relativ zur Länge des Containers ist ist, dh zur Breite, was einen Prozentsatz für die Höhe noch wertloser macht.
Heutzutage sind die Ansichtsfenstereinheiten vh und vw nützlicher, aber für nichts anderes als die Container der obersten Ebene immer noch nicht besonders nützlich.
quelle
Eine andere Lösung ist die Verwendung von display: table, die ein anderes Verhalten des Boxmodells aufweist.
Sie können dem übergeordneten Element eine Höhe und Breite festlegen und Polster hinzufügen, ohne es zu erweitern. Das Kind hat 100% Größe und Breite abzüglich der Polster.
JSBIN
Eine andere Möglichkeit wäre die Verwendung der Box-Sizing-Eigenschaft. Das einzige Problem mit beiden wäre, dass sie in IE7 nicht funktionieren.
quelle
Eine andere Lösung: Sie können prozentuale Einheiten sowohl für Ränder als auch für Größen verwenden. Zum Beispiel:
Das Hauptproblem hierbei ist, dass die Ränder mit der Größe des übergeordneten Elements leicht zunehmen / abnehmen. Vermutlich möchten Sie, dass die Ränder konstant bleiben und das untergeordnete Element wächst / schrumpft, um Änderungen im Abstand auszugleichen. Je nachdem, wie eng Ihr Display sein muss, kann dies problematisch sein. (Ich würde auch eine kleinere Marge anstreben, wie 0,3%).
quelle
Eine Lösung mit Flexbox (arbeitet an IE11): ( oder Ansicht auf jsfiddle )
(Das Zurücksetzen des CSS ist für das eigentliche Problem nicht unbedingt wichtig.)
Der wichtige Teil ist
flex: 1
(in Kombination mitdisplay: flex
beim Elternteil). Witzigerweise stammt die plausibelste Erklärung, die ich für die Funktionsweise der Flex-Eigenschaft kenne, aus einer reaktionsnativen Dokumentation, daher verweise ich trotzdem darauf :quelle
Franks Beispiel hat mich ein wenig verwirrt - es hat in meinem Fall nicht funktioniert, weil ich die Positionierung noch nicht gut genug verstanden habe. Es ist wichtig zu beachten, dass das übergeordnete Containerelement eine nicht statische Position haben muss (er erwähnte dies, aber ich habe es übersehen, und es war nicht in seinem Beispiel).
Hier ist ein Beispiel, in dem das Kind - mit einer Polsterung und einem Rand - die absolute Position verwendet, um das Elternteil zu 100% zu füllen. Der Elternteil verwendet die relative Positionierung, um einen Bezugspunkt für die Position des Kindes bereitzustellen, während er im normalen Fluss bleibt - das nächste Element "mehr Inhalt" ist nicht betroffen:
Ein nützlicher Link zum schnellen Erlernen der CSS-Positionierung
quelle
Rand um div und nicht um den Seitenkörperrand
Eine andere Lösung - Ich wollte nur einen einfachen Rand um den Rand meiner Seite und ich wollte 100% Höhe, wenn der Inhalt kleiner als dieser war.
Border-Box funktionierte nicht und die feste Positionierung schien für ein so einfaches Bedürfnis falsch zu sein.
Am Ende habe ich meinem Container einen Rahmen hinzugefügt, anstatt mich auf den Rand des Seitenkörpers zu verlassen - es sieht so aus:
quelle
Dies ist das Standardverhalten von.
display: block
Der schnellste Weg, dies im Jahr 2020 zu beheben, besteht darin, dasdisplay: 'flex'
übergeordnete Element und die Polsterung festzulegen, z. B. 20 Pixel. Dann haben alle untergeordneten Elemente eine Höhe von 100% im Verhältnis zu ihrer Höhe.quelle
Das Hinzufügen von -webkit und -moz wäre angemessener
quelle
quelle