In der Frontend-Entwicklung gibt es oft Zeiten, in denen ich weiß, dass ich etwas nicht weiß. Ich weiß vielleicht genug, um zu wissen, nach welchem CSS ich suchen muss, aber ich habe absolut keine Ahnung, wie ich es benutzen soll oder wie die richtige Syntax lautet. Irgendwie scheint in meinem Kopf ein Aktenschrank zu sein, der komplett leer ist, und wenn ich etwas nachschlagen will, finde ich stattdessen nur eine fast unleserliche Haftnotiz.
Ein solches Thema (ein Bereich, von dem ich irgendwie immer wusste, aber nie wirklich verstanden habe) ist die Interaktion zwischen Auto-Rändern und Flexbox.
Nehmen wir zum Beispiel:
.parent {
display: flex
}
.child {
margin: auto;
}
Was macht das nochmal? Ich glaube mich zu erinnern, dass man damit eine Menge nützlicher Dinge machen kann, und Anfang dieser Woche habe ich sie halbwegs wiedererkannt, nachdem ich einen großartigen Beitrag von Sam Provenza von vor einiger Zeit gelesen hatte, der zeigt, wie Auto-Ränder und Flexbox zusammenarbeiten. Aber ich habe das Konzept auch nach dem Lesen dieses Beitrags noch nicht ganz verstanden, und erst als ich anfing, eigene Demos zu erstellen, begann es zu klick machen.
In diesem Beitrag beschreibt Sam, wie margin: auto Flex-Elemente wie folgt beeinflusst:
Wenn Sie Auto-Ränder auf ein Flex-Element anwenden, erweitert dieses Element automatisch seinen angegebenen Rand, um den zusätzlichen Platz im Flex-Container zu füllen, abhängig von der Richtung, in der der Auto-Rand angewendet wird.
Lassen Sie uns das ein wenig auseinandernehmen und sagen, wir haben eine einfache übergeordnete div mit einer untergeordneten div darin.
<div class="parent">
<div class="child"></div>
</div>
Und nehmen wir an, wir verwenden das folgende CSS, um diese divs zu stylen:
.parent {
display: flex;
height: 400px;
background-color: #222;
}
.child {
background-color: red;
width: 100px;
height: 100px;
}
Das Ergebnis ist etwas wie das:
Siehe den Pen margin-auto: #1 von Robin Rendle (@robinrendle) auf CodePen.
Wenn wir margin-left: auto zum .child-Element hinzufügen, wie hier:
.child {
background-color: red;
width: 100px;
height: 100px;
margin-left: auto;
}
…dann sehen wir stattdessen das hier:
Siehe den Pen margin-auto: #2 von Robin Rendle (@robinrendle) auf CodePen.
Seltsam, oder? Der linke Rand schiebt das übergeordnete Element so, dass das untergeordnete Element in die rechte Ecke gedrängt wird. Aber es wird noch seltsamer, wenn wir alle Ränder auf auto setzen:
.child {
background-color: red;
width: 100px;
height: 100px;
margin: auto;
}
Siehe den Pen margin-auto: #3 von Robin Rendle (@robinrendle) auf CodePen.
Es ist, als würden wir einen beliebten Zentrierungstrick anwenden, indem wir justify-content und align-items auf center setzen, da das untergeordnete Element beschließt, sich horizontal und vertikal in der Mitte des übergeordneten Elements zu positionieren. Ebenso können wir, wenn wir margin-left und margin-top auf auto setzen, das Flex-Element in die untere rechte Ecke des übergeordneten Elements schieben lassen.
Siehe den Pen margin-auto: #4 von Robin Rendle (@robinrendle) auf CodePen.
Wenn Sam sagt: „das Element erweitert automatisch seinen angegebenen Rand, um den zusätzlichen Platz im Flex-Container zu füllen“, interpretiert mein Gehirn mit leerem Aktenschrank das wie folgt:
Das Setzen der
margin-Eigenschaft auf ein Flex-Kind drängt das Kind in diese Richtung. Wenn Siemargin-leftaufautosetzen, drängt das Kind nach rechts. Wenn Siemargin-topaufautosetzen, drängt das Kind nach unten.
Nachdem ich das aufgeschrieben habe, klingt es für mich jetzt so offensichtlich, dass es fast dumm ist, aber manchmal muss es so sein, damit ein neues Konzept in meinem großen, dummen, schwammigen Köpfchen haften bleibt.
Warum ist das nützlich zu wissen? Nun, ich denke, es gibt einige Momente, in denen justify-self oder align-self Ihnen in einem Layout, in dem Auto-Ränder Ihnen die zusätzliche Flexibilität zur Feinabstimmung von Dingen geben, nicht genau das liefern, was Sie wollen. Viele Demos, die ich gesehen habe, einschließlich derjenigen, die Sam für ihren ursprünglichen Beitrag erstellt hat, scheinen hauptsächlich für die Ausrichtung von Navigationsmenüpunkten gedacht zu sein. Das Schieben eines Elements in diesem Menü nach unten oder ganz nach rechts eines Flex-Containers ist in diesen Szenarien sicherlich nützlich.
Wie auch immer, ich denke, es ist wichtig, sich diesen seltsamen Trick zu merken, nur für den Fall.
Der Ort, an dem sich das als wirklich nützlich erwies, war, als ich meinen Inhalt auf der Seite zentrieren wollte, aber auch zulassen wollte, dass der Inhalt größer als das übergeordnete Element wird. Ich begann zu versuchen, das, was ich meine, aufzuschreiben, aber in diesem Fall glaube ich, dass ein Codepen tausend Worte wert ist…
align-items: center drängt das zu hohe Kind vom oberen Bildschirmrand weg, während margin: auto immer noch passende Boxen zentriert, aber das Kind überlaufen lässt, wenn es zu groß wird.
Ich habe bereits verstanden, wie
auto-Ränder in Flexbox funktionieren, aber ich habe nie darüber nachgedacht, was passiert, wenn man *alle* Ränder auf auto setzt.display: flexauf dem übergeordneten Element +margin: autoauf dem untergeordneten Element ist eine wirklich schnelle und einfache Technik für vertikale+horizontale Zentrierung.Ich werde aber trotzdem
display: flex; justify-content: center; align-items: center;als meine Haupttechnik für vertikale+horizontale Ausrichtung verwenden, da sie weniger wahrscheinlich fehlschlägt und alles in derselben CSS-Deklaration platziert werden kann. Diesemargin: auto-Technik ist jedoch eine interessante Alternative.Ich weiß nie, was ich wählen soll – margin:auto oder align/justify:center. Nach einer Phase der puren Freude an „align/justify:center“ entscheide ich mich in letzter Zeit öfter für margin:auto. Weiß nicht genau warum. Vielleicht, weil es kürzer zu schreiben ist.
Ich habe Flexbox erst richtig verstanden, als ich mich mit Flexbox Zombies durchgearbeitet habe. Fragen Sie mich nach meinen Justify-Lasern! (Obwohl dies eine nette Ergänzung ist, wenn ich jemals Probleme mit align-self habe)
Es gibt noch eine weitere Sache hinter Auto-Rändern; falls wir flex-direction auf column in einem Flex-Container setzen, können wir Auto-Ränder in einem Flex-Kind anstelle der vertikalen Aufgabe der
align-self-Eigenschaft verwenden, es wird dieselbe Aufgabe wie diealign-self-Eigenschaft im Standardszenario erfüllen. Zum Beispiel: Das Setzen von margin-top auf auto lässt das Element sich nach unten schieben.Fantastische Erklärung! Ich habe das ein paar Mal auf Stack Overflow gesehen, aber nie vollständig verstanden. Gut zu wissen, dass es eine einfachere Überschreibung gibt, als mit den
-self-Eigenschaften herumzufummeln, besonders wennflex-directionSie schon durcheinander gebracht hat.Genau, ich liebe diese Art von feiner Kontrolle. und margin:auto ist ein bisschen kürzer als item-self und ist freundlich
Was ist mit dem Definieren von Rändern nur für die Abstände? Es ist einfach für horizontale Layouts, aber nicht mit einem überlaufenden Container, der
flex-wrap: wrapverwendet (die vertikalen Ränder).Was für ein verlockend kleines Ding, das man verpasst hat. Danke :D
Auto-Ränder verhalten sich in Flexbox nicht seltsam. Sie verhalten sich ziemlich genauso wie im Block-Fluss (denken Sie daran, Ihren Seiteninhalt mit margin auto links und rechts zu zentrieren...). Nun, die Spezifikation ist hier ziemlich gut, sie hat sogar ein Beispiel:
https://www.w3.org/TR/css-flexbox-1/#auto-margins
Danke für diesen Trick, ich versuche, Flexbox besser zu verstehen, besonders für Dinge wie Header, Menüs usw. Dies ist fast wie eine Abkürzung für die Zentrierung, und ich werde es definitiv ausprobieren!
Toller Artikel, und jetzt verstehe ich diese Funktion viel besser.
Schnelle Korrektur eines Tippfehlers, obwohl: Sie schrieben (4. Absatz von unten)
Dieses letzte "oben" sollte "unten" sein.