In CSS Flexbox, warum gibt es keine "rechtfertigen-Elemente" und "rechtfertigen-selbst" - Eigenschaften?
Betrachten die Hauptachse und die Querachse von einem flex-container:
Source: W3C
Ausrichten flex-Elemente entlang der Hauptachse gibt es eine Eigenschaft:
Ausrichten flex-Elemente entlang der Querachse gibt es drei Eigenschaften:
In dem Bild oben, die Hauptachse ist horizontal-und quer-Achse ist vertikal. Dies sind die Standard-Richtungen eines flex-container.
Jedoch diese Richtungen können leicht ausgetauscht werden mit der flex-direction
Eigenschaft.
/* main axis is horizontal, cross axis is vertical */
flex-direction: row;
flex-direction: row-reverse;
/* main axis is vertical, cross axis is horizontal */
flex-direction: column;
flex-direction: column-reverse;
(Kreuz-Achse immer senkrecht zur Hauptachse.)
Meiner Sicht beschreiben, wie die Achsen' Arbeit ist, dass es scheint nicht zu sein, nichts besonderes entweder Richtung. Hochachse, Querachse, Sie sind beide gleich in Bezug auf die Bedeutung und flex-direction
macht es leicht hin und her zu wechseln.
Also, warum tut der Kreuz-Achse, erhalten Sie zwei zusätzliche Ausrichtung Eigenschaften?
Warum sind align-content
und align-items
konsolidiert in einer Eigenschaft für die Haupt-Achse?
Warum die Hauptachse nicht bekommen justify-self
Eigenschaft?
Szenarien, in denen diese Eigenschaften nützlich wäre:
-
platzieren Sie einen flex-Punkt in der Ecke des flex-container
#box3 { align-self: flex-end; justify-self: flex-end; }
-
dass eine Gruppe von flex-Elemente ausrichten-rechts (
justify-content: flex-end
), aber das erste Element Links ausrichten (justify-self: flex-start
)Betrachten einen Abschnitt mit einer Gruppe von nav-Elementen und ein logo. Mit
justify-self
dem logo angeglichen werden könnten, während Links der nav-Elemente bleiben weit rechts, und die ganze Sache passt reibungslos ("beugt") an verschiedene Bildschirmgrößen an. -
in einer Reihe von drei flex-Elemente, befestigen Sie den mittleren Punkt auf der Mitte der container (
justify-content: center
) und richten Sie die benachbarten Elemente der container-Kanten (justify-self: flex-start
undjustify-self: flex-end
).Beachten Sie, dass die Werte
space-around
undspace-between
auf
justify-content
Eigenschaft wird nicht halten Sie die mittlere Element zentriert in Bezug auf die Behälter, wenn die benachbarten Elemente haben unterschiedliche breiten.
CSS:
#container {
display: flex;
justify-content: space-between;
background-color: lightyellow;
}
.box {
height: 50px;
width: 75px;
background-color: springgreen;
}
.box1 {
width: 100px;
}
.box3 {
width: 200px;
}
#center {
text-align: center;
margin-bottom: 5px;
}
#center > span {
background-color: aqua;
padding: 2px;
}
HTML:
<div id="center">
<span>TRUE CENTER</span>
</div>
<div id="container">
<div class="box box1"></div>
<div class="box box2"></div>
<div class="box box3"></div>
</div>
<p>note that the middle box will only be truly centered if adjacent boxes are equal width</p>
Als dies geschrieben wurde, gibt es keine Erwähnung von justify-self
oder justify-items
im flexbox-spec.
Jedoch in der CSS Box-Alignment-Modul, die der W3C unfertigen Vorschlag zur Einrichtung einer gemeinsamen Reihe von alignment-Eigenschaften für die Verwendung in alle box-Modelle, gibt es diese:
Quelle: W3C
Werden Sie feststellen, dass justify-self
und justify-items
angedacht... aber nicht für flexbox.
Werde ich Ende mit der Wiederholung der wichtigsten Frage:
Warum gibt es keine "rechtfertigen-Elemente" und "rechtfertigen-selbst" - Eigenschaften?
- Wie würden Sie erwarten, dass
justify-self
arbeiten für ein flex-Element? Angenommen, Sie haben Elemente a,b,c,d mit extra Raum zu verteilen um Sie herum, und die flex-container hatjustify-content: space-between
, so dass Sie am Ende wie |a, b, c, d|. Was würde es bedeuten, z.B. diejustify-self: center
oder 'rechtfertigen-self: flex-end", nur um item 'b' es? Wo würden Sie erwarten, dass es zu gehen? (Ich sehe einige demos in einer der Antworten hier, aber ich sehe nicht, eine klare Weise, dass es funktionieren würde, im Allgemeinen.) - (Alternativ: nehmen wir an, wir haben
justify-content: flex-start
, also die Elemente, die überfüllt sind am Anfang wie |abcd |. Was würde Sie erwarten, es zu tun, wenn Siejustify-self: [anything]
auf Position 'b' es?) - Sie schrieb: "Wie würden Sie erwarten, dass
justify-self
arbeiten für ein flex-Element? Ich würde sagen, nicht so anders alsauto
Margen arbeiten bereits auf flex-Elemente. In Ihrem zweiten Beispieljustify-self: flex-end
auf Position d bewegen würde, es auf die andere Seite. Das an sich wäre eine tolle Funktion, dieauto
Margen kann das schon tun. Ich stellte eine Antwort mit einer demonstration. - Ich bin meistens sehen mehr use-cases hier, und use-cases sind toll-aber das knifflige bit ist, wie Schuhlöffel diese in die tatsächliche Art und Weise, dass
justify-content
undjustify-self
angegeben sind, so dass Fälle mit Konflikten (wie die Szenarien, die ich fragte) sind klar & vernünftig definiert. Wie ich bereits in meiner Antwort hier{justify|align}-self
sind über das ausrichten von Elementen innerhalb einer größeren box, die Größe ist unabhängig von der{justify|align}-self
Wert-und es gibt keine solche box, in der Haupt-Achse für flex-Element ausgerichtet werden, in. - RE "nicht anders als auto-Ränder" - ich war tatsächlich zu Fragen, wie man Sie sich vorstellen
justify-self
undjustify-content
interagieren würde, in Fällen, in denen Sie in Konflikt (wie die Szenarien, die ich angelegt). Auto-Margen einfach nicht die Interaktion mitjustify-content
an - Sie stehlen alles von der Verpackung Platz vorjustify-content
bekommt eine chance, es zu benutzen. So, auto Ränder sind nicht wirklich eine gute analog, wie dies funktionieren würde.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Methoden für die Ausrichtung von Flex-Elemente entlang der Hauptachse
Wie gesagt in der Frage:
Dann die Frage stellt:
Einer Antwort kann sein: , Weil Sie nicht notwendig.
Den flexbox-Spezifikationen bietet zwei Methoden für die Ausrichtung von flex-Elemente entlang der Hauptachse:
justify-content
keyword-Eigenschaft, undauto
Ränderrechtfertigen-content
Den
rechtfertigen-content
Eigenschaft richtet flex-Elemente entlang der Hauptachse der flex-container.Es wird angewendet, um die flex-container, sondern wirkt sich nur auf flex-Elemente.
Gibt es fünf alignment-Optionen:
flex-start
~ Flex-Artikel sind verpackt in Richtung des Startpunktes der Linie.flex-end
~ Flex-Elemente sind verpackt, die gegen das Ende der Zeile.center
~ Flex-Artikel sind verpackt in Richtung der Mitte der Linie.space-between
~ Flex-items gleichmäßig verteilt sind, wird mit dem ersten Element ausgerichtet sind, um eine Kante des Containers und der Letzte Punkt ausgerichtet, um die gegenüberliegende Kante. Die Kanten, die durch die ersten und letzten Elemente hängt davon ab,flex-direction
und schreiben Modus (ltr
oderrtl
).space-around
~ Gleiche wiespace-between
außer mit half-size Leerzeichen an beiden enden.Auto Ränder
Mit
auto
Ränder, flex-Elemente werden zentriert, Abstand oder verpackt in sub-Gruppen.Im Gegensatz zu
justify-content
, die angewendet wird, um die flex-container,auto
Margen gehen auf flex-Elemente.Arbeiten Sie durch den Verzehr von allen freien Raum in die angegebene Richtung.
Auszurichten Gruppe von flex-Elemente auf der rechten Seite, aber erste Element auf der linken Seite
Szenario von der Frage:
Andere nützliche Szenarien:
Ort ein flex-Element in der Ecke
Szenario von der Frage:
Center ein flex-Element vertikal und horizontal
margin: auto
ist eine alternative zujustify-content: center
undalign-items: center
.Statt diesen code auf der flex-container:
Können Sie diese über die flex-Element:
Diese alternative ist besonders nützlich, wenn Zentrierung ein flex-Element, das überläuft den container.
- Center, einem flex-Element, und in der Mitte eine zweite flex-Element zwischen dem ersten und dem edge -
Einem flex-container richtet flex-Elementen durch die Verteilung von freien Speicherplatz.
Daher, um zu erstellen Gleichgewicht, so dass eine mittlere Position kann zentriert im container mit nur einem Element neben, ein Gegengewicht muss eingeführt werden.
In den Beispielen unten unsichtbare Dritte flex-items (Felder 61 & 68) eingeführt werden, um das Gleichgewicht der "echten" items (Feld 63 & 66).
Natürlich, diese Methode ist nichts großartiges in Bezug auf Semantik.
Alternativ können Sie mit einem pseudo-element anstelle der eigentlichen DOM-element. Oder Sie können absolute Positionierung. Alle drei Methoden werden hier behandelt: Mitte und unten-Ausrichtung der flex-Elemente
HINWEIS: in Den Beispielen oben wird nur funktionieren – im Sinne einer echten Zentrierung – wenn die äußersten Elemente gleich sind Höhe/Breite. Bei der flex-Elemente sind in unterschiedlichen Längen, siehe Nächstes Beispiel.
- Center, einem flex-Element, wenn benachbarte Elemente in der Größe variieren
Szenario von der Frage:
Als angegeben, es sei denn, alle flex-items sind von gleicher Breite oder Höhe (je nach
flex-direction
), das mittlere Element kann nicht wirklich zentriert. Dieses problem macht sich stark für einejustify-self
Eigenschaft (entworfen, diese Aufgabe zu bewältigen, natürlich).CSS:
HTML:
Hier sind zwei Methoden für die Lösung dieses Problems:
Lösung #1: Absolute Positionierung
Des flexbox-Spezifikation erlaubt für absolute Positionierung der flex-Elemente. Dies ermöglicht die für den mittleren Punkt, um perfekt zentriert, unabhängig von der Größe seiner Geschwister.
Nur im Kopf behalten, dass, wie alle absolut positionierten Elementen, die Elemente, die entfernt von der Belegfluss. Dies bedeutet, dass Sie nicht nehmen viel Platz im container und können sich überschneiden, Ihre Geschwister.
In den Beispielen unten, das mittlere Element wird zentriert mit absoluter Positionierung und die äußeren Gegenstände bleiben im Fluss. Aber das gleiche layout erreicht werden kann im reverse Mode: Center-mitten-Element mit
justify-content: center
- und absolut-position der äußeren Elemente.Lösung #2: Geschachtelte Flex-Containern (keine absolute Positionierung)
CSS:
HTML:
Hier ist, wie es funktioniert:
.container
) ist ein flex-container..box
) ist jetzt ein flex-Element..box
Element ist gegebenflex: 1
verteilen, um container-Raum gleichermaßen.justify-content: center
.span
element ist zentriert flex-Element.auto
Margen Verschiebung der äußerenspan
s Links und rechts.Könnte man auch verzichten
justify-content
und verwendenauto
Margen ausschließlich.Aber
justify-content
können hier arbeiten, weilauto
Margen haben immer Priorität. Aus der spec:justify-content: space-gleichen (Konzept)
Zurück zu
rechtfertigen-content
für eine minute, hier ist eine Idee für eine weitere option.space-same
~ Ein hybrid ausspace-between
undspace-around
. Flex-items gleichmäßig verteilt sind (wiespace-between
), nur dass statt der halben Größe Leerzeichen an beiden enden (wiespace-around
), es gibt full-size-Räume an beiden enden.Dieser Anordnung kann erreicht werden, mit
::vor dem
und::after
pseudo-Elemente auf der flex-container.(credit: @oriol für den code, und @crl für das label)
UPDATE: Browser haben mit der Umsetzung begonnen
space-evenly
, die erfüllt die oben aufgeführten. Siehe diesen post für weitere details: Gleich viel Raum zwischen den flex-itemsSPIELPLATZ (enthält den code für alle Beispiele oben)
justify-content
undauto
Margen. Für die andere Seite der Medaille -- das Kreuz-Achsealign-items
,align-self
undalign-content
-- siehe auch dieser Beitrag: stackoverflow.com/q/42613359/3597276justify-self
Eigenschaft...auto
Margen sind hilfreich, aberjustify-self: center
wäre ideal. Die Lösung für das problem Sie vorgestellt werden würde, zu erstellen unsichtbare Elemente duplizieren auf der gegenüberliegenden Seite. Siehe meine Antwort hier: stackoverflow.com/q/38948102/3597276space-same
Konzept ist eine Reale Sache jetzt. Es heißtspace-evenly
, aber es ist nur von Firefox unterstützt im moment: developer.mozilla.org/en-US/docs/Web/CSS/justify-contentspace-evenly
in anderen Antworten: stackoverflow.com/q/45134400/3597276space-evenly
war unterstützt in Chrome, 57-60, aber nur für das Grid-layout. Es war ein Fehler, wurde behoben, und da Chrom 61 es unterstützt wird gibt es für die Flexbox sowie. Auch, es ist die Art und Weise zu emulieren, die es ohne pseudo-Elemente:.item { margin-right: auto } .item:first-child { margin-left: auto }
.flex-start
explizite Staaten ...die Ausrichtung der container je nach " flex container main-start oder Kreuz-start-SeiteIch weiß, das ist nicht die Antwort, aber ich würde gerne dazu beitragen, diese Sache für was es Wert ist. Es wäre toll, wenn könnten Sie release
justify-self
für flexbox, um es wirklich flexibel ist.Es ist meine überzeugung, dass wenn mehrere Artikel auf der Achse, der logischste Weg für
justify-self
Verhalten in Einklang zu bringen ist, sich an seinen nächsten Nachbarn (oder edge), wie unten gezeigt.Ich hoffe wirklich, W3C nimmt Notiz von diesem und wird zumindest in Betracht ziehen. =)
Diese Weise können Sie ein Element, das ist wirklich zentriert, unabhängig von der Größe der linken und rechten box. Wenn eine der Kisten die Stelle erreicht, von der center-box wird dann einfach schieben Sie es, bis es keinen Platz mehr zu verteilen.
Die einfache Herstellung genial-layouts sind endlos, werfen Sie einen Blick auf diese "komplexe" - Beispiel.
justify-self
undjustify-items
.auto
Margen sind nicht eine vollständige Ersatz fürjustify-self
. Ich war vorsichtig, um Wort zu meinem vorherigen Kommentar sagenauto
Margen einige der use-cases. Wie Sie bemerkt, kann es nicht center ein Element vorhanden ist, wenn benachbarte Elemente sind in verschiedenen Größen. Aber, es bietet mehr Optionen für die Ausrichtung von flex-Elementen. Als ich begann das lernen über flexbox ich dachtejustify-content
unsichtbare Abstandhalter Elemente waren der einzige Weg.Dieser wurde gebeten, auf der www-Liste "Stil" und Tab Atkins (spec-editor) eine Antwort, die erklärt, warum. Ich werde nochmal ein bisschen hier.
Beginnen, lassen Sie uns zunächst davon ausgehen, unsere flex-container ist single-line (
flex-wrap: nowrap
). In diesem Fall, es ist eindeutig eine Ausrichtung Unterschied zwischen der Hauptachse und die Querachse-es gibt mehrere Elemente übereinander gestapelt in der Hauptachse, sondern nur ein Element gestapelt in der Querachse. Es macht also Sinn, um ein customizeable-pro-Element "align-self" in der Querachse (da jedes Element ausgerichtet ist separat, auf eigene), in der Erwägung, dass es nicht sinnvoll ist, in der main-Achse (da die Elemente ausgerichtet sind, Kollektiv).Für multi-line flexbox, die gleiche Logik gilt für jeden "flex line". In einer bestimmten Zeile, die Elemente sind individuell ausgerichtet, in der Querachse (da gibt es nur ein Element pro Zeile, in der Kreuz-Achse) vs. Kollektiv in der Hauptachse.
Hier ist ein weiterer Weg der Wahrheit zu formulieren: so, alle der
*-self
und*-content
Eigenschaften sind etwa wie die Verteilung von extra-Raum um Dinge. Aber der entscheidende Unterschied ist, dass die*-self
Versionen sind für die Fälle wo es nur eine einzige Sache in dieser Achse, und die*-content
Versionen sind für, wenn es potenziell viele Dinge in dieser Achse. Die ein-Ding vs. die viele-Dinge, die Szenarien sind verschiedene Arten von Problemen, und so haben Sie unterschiedliche Arten von Optionen zur Verfügung-zum Beispiel diespace-around
/space-between
Werte sinnvoll für*-content
, aber nicht für*-self
.SO: In einem flexbox-Haupt-Achse, es gibt viele Dinge zu verteilen, die den Raum um sich herum. So ein
*-content
Eigenschaft macht es Sinn, aber nicht ein*-self
Eigenschaft.Im Gegensatz, in der Querachse, wir haben beide eine
*-self
und ein*-content
Eigenschaft. Man bestimmt, wie wir verteilen den Raum um sich herum die viele flex-Linien (align-content
), während die andere (align-self
) bestimmt, wie die Verteilung von Freiraum um einzelnen flex-Elemente in der Querachse, in einem bestimmten flex-line.(Ich Ignoriere
*-items
Eigenschaften hier, da Sie einfach einrichten von Standardwerten für die*-self
.)justify-self
könnte ein problem werden, die auf eine Achse mit mehreren Elementen, im Gegensatz zu einem Element. Aber ich hoffe wirklich, Sie schauen es weiter, in einem mehrere Elemente der situation, wie würdejustify-self
Verhalten, denn es gibt einige Situationen, in denen dies könnte wirklich sinnvoll sein. Zum Beispiel (stackoverflow.com/questions/32378953/...).justify-self
.*-self
ist über die Fälle, wo wir nur ein Sache zu richten, während*-content
ist über Fälle, in denen viele, die Dinge zu richten. Das macht es ein bisschen klarer?auto
Margen, auch Teil der Spezifikation, aktivieren *self-alignment mit mehreren Elementen in der Zeile. Keine klaren Grund, warum keyword-Eigenschaften können nicht, wie gut.Es ist
justify-self
, aber in Chrome Canary, nicht in Chrome stable-version. Es gibt sogarjustify-items
:Aber soweit ich sagen kann, das diese Eigenschaften nicht funktionieren. Also wahrscheinlich Google gespeichert im Voraus für zukünftige CSS-Versionen. Kann nur hoffen, dass Sie die Eigenschaften hinzufügen bald.