Zuerst gab es Flexboxen (die Kinder eines display: flex Containers). Wenn man sie visuell trennen wollte, musste man Inhaltsbegründung (d.h. justify-content: space-between), margin-Tricksereien oder manchmal beides verwenden. Dann kamen Grids (ein display: grid Container), und Grids konnten dank grid-gap nicht mit Margins behaftete, nicht trickreiche Mindestabstände zwischen den Grid-Zellen haben. Flexboxen hatten keine Abstände.
Jetzt können sie es, dank der wachsenden Unterstützung für gap, dem Nachfolger von grid-gap, der nicht auf Grids beschränkt ist. Mit gap können Sie Ihre Grids, Ihre Flexboxen und sogar Ihre Mehrspaltensätze mit Abständen versehen. Es ist lückenhaft!
Abstand mit Grid
Beginnen wir dort, wo gap am robustesten ist: CSS Grid. Hier ist ein grundlegendes Grid-Setup in HTML und CSS
<section>
<div>div</div>
<div>div</div>
<div>div</div>
<div>div</div>
<div>div</div>
<div>div</div>
<div>div</div>
</section>
section {
display: grid;
grid-template-rows: repeat(2,auto);
grid-template-columns: repeat(4,auto);
gap: 1em;
}
section div {
width: 2em;
}
Das platziert die Grid-Zellen mindestens 1em voneinander entfernt. Der Trennungsabstand kann größer sein, abhängig von anderen Bedingungen, die außerhalb des Rahmens dieses Beitrags liegen, aber mindestens sollten sie durch 1em getrennt sein. (OK, machen wir ein Beispiel: gap-Abstände kommen zu allen Margins auf den Grid-Zellen hinzu, also wenn alle Grid-Elemente margin: 2px; haben, wäre der visuelle Abstand zwischen den Grid-Zellen mindestens 1em plus 4px.) Standardmäßig verursachen Änderungen der Abstandsgröße eine Größenänderung der Grid-Elemente, sodass sie ihre Zellen ausfüllen.
Dies alles funktioniert, weil gap eigentlich ein Kurzschreibweise für die Eigenschaften row-gap und column-gap ist. gap: 1em wird als gap: 1em 1em interpretiert, was eine Kurzschreibweise für row-gap: 1em; column-gap: 1em; ist. Wenn Sie unterschiedliche Zeilen- und Spaltenabstände wünschen, dann ist etwas wie gap: 0.5em 1em gut geeignet.
Abstand mit Flexbox
Das Gleiche in einem Flexbox-Kontext zu tun, ergibt Abstände, aber nicht ganz auf die gleiche Weise, wie sie in Grids vorkommen. Gehen Sie vom selben HTML wie oben aus, aber mit diesem CSS stattdessen
section {
display: flex;
flex-wrap: wrap;
gap: 1em;
}
Die Flexboxen werden durch mindestens den Wert von gap hier auseinandergedrückt und (dank flex-wrap) umbrechen auf neue Flex-Zeilen, wenn ihnen der Platz in ihrem Flex-Container ausgeht. Eine Änderung des Abstands kann zu einer Änderung des Umbruchs der Flex-Elemente führen, aber im Gegensatz zu Grid ändern Abstände zwischen Flex-Elementen nicht die Größen der Flex-Elemente. Abstandsänderungen können dazu führen, dass der Flex-Umbruch an verschiedenen Stellen stattfindet, was bedeutet, dass sich die Anzahl der Flex-Elemente pro Zeile ändert, aber die Breiten gleich bleiben (es sei denn, Sie haben sie über flex zum Wachsen oder Schrumpfen gebracht).
Abstand mit Mehrspaltigkeit
Im Fall von Mehrspaltigkeit gibt es eine kleine Einschränkung für gap: Es werden nur Spaltenabstände verwendet. Sie können Zeilenabstände für Mehrspaltigkeit deklarieren, wenn Sie möchten, aber sie werden ignoriert.
section {
columns: 2;
gap: 1em;
}
Unterstützung
Unterstützung für gap, row-gap und column-gap ist überraschend weit verbreitet. Mozilla hat sie seit Version 61, Chromium seit Version 66, und dank der Arbeit von Igalia's Sergio Villar kommen sie bald auch für Safari und Mobile Safari (sie sind bereits in den Technology Preview Builds). Wenn Ihr Grid-, Flex- oder Mehrspaltigkeitsinhalt also etwas mehr Platz zum Atmen benötigt, machen Sie sich bereit, in die Lücke zu fallen!
Abstände im Grid-Layout werden großartig sein, aber sie lösen nicht vollständig das grundlegende Problem, nämlich dass CSS keine gute Möglichkeit zur Verwaltung von Margin-Kollaps bietet. Was wir wirklich brauchen, ist die
margin-trimEigenschaft.Ich denke,
gaplöst dieses Problem, da Margins gewissermaßen zur Erzeugung dieses Abstands herangezogen werden, aber das Abstands-Konzept geht viel weiter, da es bei der Berechnung des verfügbaren Platzes für Elemente berücksichtigt wird.Das Erstellen von Abständen mit Margins bedeutet zwangsläufig, dass der zusätzliche Platz von der Breite eines einzelnen Elements abgezogen werden muss, es sei denn, Sie akzeptieren die Tatsache, dass sie in Flex-Kontexten, in denen die Anzahl der Elemente die Anzahl der vorhandenen Spalten übersteigt, nicht exakt sein werden. Ja, in diesem Fall wäre das Zuschneiden von Margins schön, anstatt schwer lesbare
:nth-child(3n+3)schreiben zu müssen, um Margins auf diesem Element zurückzusetzen.Aber mit
gapin Flex muss viel Code nicht mehr geschrieben werden. Das bedeutet nicht, dassmargin-trimkeine benötigte Eigenschaft ist. Es bedeutet lediglich, dass ich denke, dass die Verwendung vongapin Layout-Kontexten diesen Anwendungsfall obsolet macht.Ich habe Schwierigkeiten,
gapprogressiv in Flex-Kontexten zu verwenden, da ich es nicht@supporten kann.Lobenswerte Dissertation, Eric. Und sehr zeitgemäß, da ich dem Entwicklungsteam erkläre, dass
– wir heute CSS Grid verwenden können
– es Möglichkeiten gibt, es im Internet Explorer zum Laufen zu bringen
– und manchmal CSS Grid sinnvoller ist als CSS Flexbox
Ich kann es kaum erwarten, bis
gapunterschiedliche Abmessungen für jeden Abstand unterstützt.So etwas wie
row-gap: 1em repeat(5, .5em) 1em;