Ein Blockformatierungskontext ist Teil des visuellen CSS -Renderings einer Webseite, auf der Blockboxen angelegt werden. Das Positionierungsschema, zu dem es gehört, ist ein normaler Fluss. Nach W3C:
Schwimmkörper, absolut positionierte Elemente, Inline-Blocks, Tabellenzellen, Tabellenkapitionen und Elemente mit einem anderen "Überlauf" als "sichtbar" (außer wenn dieser Wert an das Ansichtsfenster ausgegeben wurde) leiten neue Blockformatierungskontexte fest.
Das obige Zitat fasst ziemlich genau zusammen, wie ein Blockformatierungskontext gebildet wird. Aber können wir es so definieren, dass es leichter zu verstehen ist. Ein Blockformatierungskontext ist ein HTML -Box, das mindestens eine der folgenden Bedingungen erfüllt:
Ein Blockformatierungskontext kann explizit ausgelöst werden. Wenn wir also einen neuen Kontext des Blockformaters erstellen möchten, müssen wir ihm nur eine der oben genannten CSS -Bedingungen hinzufügen.
Sehen Sie sich zum Beispiel die folgenden HTML an:
<span><span><span><div</span> class<span>="container"</span>></span> </span> Some Content here <span><span><span></div</span>></span></span>
Ein neuer Blockformatierungskontext kann erstellt werden, indem eine der erforderlichen CSS -Bedingungen wie Überlauf hinzugefügt wird: Scrollen, Überlauf: Hidden, Anzeige: Flex, Float: Links oder Anzeige: Tabelle zum Container. Obwohl eine der oben genannten Bedingungen einen Blockformatierungskontext erstellen kann, wird es auch einige andere Effekte wie:
gebenWenn wir also einen neuen Kontext der Blockformatierung erstellen, wählen wir den besten Zustand basierend auf unseren Anforderungen. Für die Gleichmäßigkeit habe ich Überlauf verwendet: In allen in diesem Artikel angegebenen Beispiele versteckt.
<span><span><span><div</span> class<span>="container"</span>></span> </span> Some Content here <span><span><span></div</span>></span></span>
Sie können frei mit anderen Erklärungen als Überlauf spielen: versteckt.
Die W3C -Spezifikationszustände:
In einem Blockformatierungskontext berührt die linke Außenkante jeder Box die linke Kante des Blocks (für die Formatierung von rechts nach links, rechte Kanten Touch). Dies gilt auch in Gegenwart von Schwimmern (obwohl die Zeilenboxen einer Box aufgrund der Schwimmer schrumpfen können), es sei denn, das Box legt einen neuen Blockformatierungskontext fest (in diesem Fall kann das Box selbst kann
wegen der Schwimmer schmaler werden.
In einfacheren Worten, wie wir im obigen Diagramm sehen können Block. In der letzten Box können wir sehen, dass das andere Element (grün), obwohl sich links ein schwebendes Element (braun) befindet, immer noch den linken Rand des enthaltenen Blocks berührt. Die Prinzipien darüber, warum dies geschieht
Im normalen Fluss werden die Boxen nacheinander vertikal an die Oberseite des Blocks gelegt. Der vertikale Abstand zwischen zwei Geschwisterkästen wird durch die einzelnen Ränder beider Geschwister bestimmt, aber es ist nicht die Summe der beiden Ränder.
Betrachten wir ein Beispiel, um dies zu verstehen.
Im obigen Diagramm betrachten wir einen Blockformatierungskontext, der erstellt wurde, in dem die rote Box (a Div) die beiden grünen Geschwister (p -Elemente) enthält.
<span><span>.container</span> { </span> <span>overflow: hidden; </span><span>}</span>
und das entsprechende CSS ist:
<span><span><span><div</span> class<span>="container"</span>></span> </span> <span><span><span><p</span>></span>Sibling 1<span><span></p</span>></span> </span> <span><span><span><p</span>></span>Sibling 2<span><span></p</span>></span> </span><span><span><span></div</span>></span></span>
Idealerweise sollte der Rand zwischen den beiden Geschwistern die Summe der Ränder beider Elemente (20px) sein, aber es ist tatsächlich 10px. Dies ist als zusammenkassende Ränder bekannt. In einem Fall, in dem die Ränder der Geschwister unterschiedlich sind, wird die höhere Marge vorherrschen.
Siehe den Stift Ovzrer von sitepoint (@sitepoint) auf CodePen.
Dies mag zunächst ein bisschen verwirrend klingen, da wir oben über diese Blockformatierungskontexte diskutiert haben, verursachen den Randkollaps. Aber eine Sache, die wir beachten müssen, ist, dass vertikale Ränder zwischen benachbarten Blockboxen (Geschwister) nur dann zusammenbrechen, wenn sie sich im selben Blockformatierungskontext befinden. Wenn sie zu verschiedenen Blockformatierungskontexten gehören, kollabieren die Ränder zwischen ihnen nicht. Wenn wir also einen neuen Kontext des Blockformatierungskontexts erstellen
Fügen wir im früheren Beispiel ein drittes Geschwister hinzu, sodass das HTML:wird
<span><span><span><div</span> class<span>="container"</span>></span> </span> Some Content here <span><span><span></div</span>></span></span>
lautet
<span><span>.container</span> { </span> <span>overflow: hidden; </span><span>}</span>
Wir können nun das dritte Geschwister so ändern, dass es Teil eines neuen Blockformatierungskontexts ist. Dann wird das HTML:
<span><span><span><div</span> class<span>="container"</span>></span> </span> <span><span><span><p</span>></span>Sibling 1<span><span></p</span>></span> </span> <span><span><span><p</span>></span>Sibling 2<span><span></p</span>></span> </span><span><span><span></div</span>></span></span>
<span><span>.container</span> { </span> <span>background-color: red; </span> <span>overflow: hidden; /* creates a block formatting context */ </span><span>} </span> <span>p { </span> <span>background-color: lightgreen; </span> <span>margin: 10px 0; </span><span>}</span>
Siehe den Stift XBVOXP von SitePoint (@sitepoint) auf CodePen.
Verwenden Sie einen Blockformatierungskontext, um Floats
<span><span><span><div</span> class<span>="container"</span>></span> </span> <span><span><span><p</span>></span>Sibling 1<span><span></p</span>></span> </span> <span><span><span><p</span>></span>Sibling 2<span><span></p</span>></span> </span> <span><span><span><p</span>></span>Sibling 3<span><span></p</span>></span> </span><span><span><span></div</span>></span></span>
<span><span>.container</span> { </span> <span>background-color: red; </span> <span>overflow: hidden; /* creates a block formatting context */ </span><span>} </span> <span>p { </span> <span>background-color: lightgreen; </span> <span>margin: 10px 0; </span><span>}</span>
<span><span><span><div</span> class<span>="container"</span>></span> </span> <span><span><span><p</span>></span>Sibling 1<span><span></p</span>></span> </span> <span><span><span><p</span>></span>Sibling 2<span><span></p</span>></span> </span> <span><span><span><div</span> class<span>="newBFC"</span>></span> </span> <span><span><span><p</span>></span>Sibling 3<span><span></p</span>></span> </span> <span><span><span></div</span>></span> </span><span><span><span></div</span>></span></span>
Siehe den Stift schwimmt mit und ohne Blockformatierungskontext von SitePoint (@sinepoint) auf CodePen.
Manchmal wickelt sich der Text um ein gefährtes Div um sie (wie in Abbildung 1 im Bild unten). In einigen Fällen ist dies jedoch nicht wünschenswert und wir möchten wie in Abbildung 2. Um dies zu lösen, verwenden wir möglicherweise Ränder, und wir könnten Ränder verwenden, und wir verwenden möglicherweise Ränder, und wir verwenden, dass wir Ränder verwenden könnten, Wir können dies aber auch mit einem Blockformatierungskontext lösen.
Lassen Sie uns zunächst verstehen, warum sich der Text umhüllt. Dafür müssen wir verstehen, wie das Box -Modell funktioniert, wenn ein Element schwebt. Dies ist der Teil, den ich früher verlassen habe, als ich die Ausrichtung in einem Blockformatierungskontext diskutierte. Lassen Sie uns verstehen, was in Abbildung 1 im folgenden Diagramm passiert:
Das HTML für das Diagramm könnte angenommen werden als:
<span><span><span><div</span> class<span>="container"</span>></span> </span> Some Content here <span><span><span></div</span>></span></span>
Der gesamte schwarze Bereich im obigen Diagramm bezeichnet das P -Element. Wie wir sehen können, verschiebt sich das P -Element nicht, sondern geht unter das schwebende Element. Die Zeilenfelder des P -Elements (in Bezug auf die Textzeilen) unterziehen sich. Daher eng die Linienboxen horizontal, um Platz für das schwimmende Element zu schaffen.
Wenn der Text zunimmt, wird er schließlich unter das schwebende Element einwickelt, da die Linienfelder nicht mehr verschieben müssen und daher eine Bedingung wie Abbildung 1 erscheint. Dies erklärt, wie die Absätze die linke Kante des enthaltenden Boxs berühren, auch wenn ein schwebendes Element vorhanden ist und wie sich die Linienboxen eng machen, um das schwebende Element aufzunehmen.
Wenn wir das gesamte P -Element verschieben können, wird dieses Wickelproblem gelöst.
Bevor wir zur Lösung gehen, erinnern wir uns noch einmal, was die W3C -Spezifikation sagt:
In einem Blockformatierungskontext berührt die linke Außenkante jeder Box die linke Kante des Blocks (für die Formatierung von rechts nach links, rechte Kanten Touch). Dies gilt auch in Gegenwart von Schwimmern (obwohl die Zeilenboxen einer Box aufgrund der Schwimmer schrumpfen können), es sei denn, das Box legt einen neuen Blockformatierungskontext fest (in diesem Fall kann das Box selbst kann wegen der Schwimmer schmaler werden.
Aus diesem Grund berührt es nicht mehr die linke Kante des Containerblocks. Dies kann erreicht werden, indem einfach Überlauf hinzugefügt wird: dem P -Element versteckt. Auf diese Weise löst das Erstellen eines neuen Blockformatierungskontextes das Problem des Textes, das sich um ein schwebendes Objekt umwickelt.
Siehe den Stift Ein Blockformatierungskontext, der Textverpackung durch SitePoint (@sinepoint) auf CodePen verhindert.
Wenn wir ein Multi-Säulen-Layout erstellen, das sich über die volle Breite des Containers erstreckt, fällt die letzte Spalte manchmal in einigen Browsern zur nächsten Zeile. Dies kann passieren, weil der Browser die Breite der Säule abrundt und die Gesamtbreite mehr als die des Behälters wird. Wenn wir jedoch in einer Spalte des Layouts einen neuen Kontext des Blockformaters herstellen, wird der verbleibende Raum nach dem Füllen der vorherigen Spalten immer benötigt.
Verwenden wir ein Beispiel für ein Multi-Säulen-Layout mit 3 Spalten:
Hier ist das HTML:
<span><span><span><div</span> class<span>="container"</span>></span> </span> Some Content here <span><span><span></div</span>></span></span>
und das CSS:
<span><span>.container</span> { </span> <span>overflow: hidden; </span><span>}</span>
Das Ergebnis liegt in der Codepen -Demo:
Siehe den Stift mit einem Blockformatierungskontext, um eine endgültige Spalte "Anpassung" von SitePoint (@sinepoint) auf CodePen zu erstellen.
Auch wenn sich die Breite des Containers geringfügig ändert, wird das Layout nicht brechen. Dies ist natürlich nicht unbedingt eine gute Option für mehrspaltige Layouts, aber es ist eine Möglichkeit, das Problem der Ablöser der letzten Spalte zu verhindern. Flexbox wäre wahrscheinlich eine bessere Lösung in einem Fall wie diesem, aber dies sollte dazu dienen, zu veranschaulichen, wie sich Elemente unter diesen Umständen verhalten.
Ich hoffe, dieser Beitrag hat Ihnen die Relevanz von Kontexten der Blockformatierung gezeigt und wie sie die visuelle Positionierung von Elementen auf einer Seite beeinflussen. Die Beispiele, die ihre Verwendung in praktischen Fällen zeigen, sollten sie etwas klarer machen.
Wenn Sie etwas hinzufügen haben, teilen Sie uns dies bitte in den Kommentaren mit. Stellen Sie sicher
häufig gestellte Fragen (FAQs) zu Blockformatierungskontexten in CSSDas obige ist der detaillierte Inhalt vonVerstehen von Blockformatierungskontexten in CSS. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!