Ich beobachte ein paar verwirrende Verhaltensweisen mit flexbox, insbesondere beim Versuch, align-self: baseline
zu verwenden. Das grundlegende Problem ist, dass es einfach nicht funktioniert; Das folgende Snippet zeigt das Problem:
Hier ist ein Screenshot, wie die Ausgabe aussieht:
Wie Sie sehen, ist die Basislinie der Beschriftung nicht mit den anderen Formularelementen ausgerichtet, obwohl align-self: baseline
gesetzt ist. Wenn ich align-items: baseline
für den übergeordneten Container verwende, erhalte ich jedoch ein anderes Ergebnis:
Ist das das richtige Verhalten gemäß der Spezifikation oder ist es ein Fehler? Wenn ja warum? Gibt es eine Problemumgehung? Als Referenz habe ich auf Chrome 54, Safari 9.1.2 und Firefox 50 auf macOS 10.11.6 getestet, und alle scheinen die gleichen Ergebnisse zu zeigen.
Wenn Sie die Grundlinienausrichtung für alle Elemente festlegen möchten, wenden Sie align-self: baseline
auf jedes oder, einfacher, setzen Sie align-items: baseline
auf den Container.
Eine anfängliche Einstellung eines Flex-Containers ist align-items: stretch
.
Dies bedeutet, dass alle flexiblen Elemente die gesamte Querachsenlänge des Containers erweitern.
Das passiert in Ihrem Layout. EXCEPT Sie haben align-items: stretch
für ein Flex-Element ( label
) überschrieben, indem Sie align-self: baseline
angewendet haben.
Während die anderen Flex-Elemente gedehnt werden, hat das Label eine Anweisung baseline
- aber keinen Bezugspunkt.
Aus der Spezifikation:
8.3. Achsenübergreifende Ausrichtung:
align-items
undalign-self
Eigenschaften
baseline
Wenn die Inline-Achse des Flex-Elements die gleiche ist wie die Cross-Achse, ist dies der Fall Wert ist identisch mit
flex-start
.Ansonsten nimmt es an der Grundlinienausrichtung teil: alle Teilnehmer Flex-Elemente auf der Linie sind so ausgerichtet, dass ihre Grundlinien ausgerichtet sind, und das Objekt mit der größten Entfernung zwischen seiner Grundlinie und seiner Cross-Start-Rand Rand ist bündig gegen die Cross-Start-Kante platziert der Linie.
Okay, lasst uns das kaputt machen:
Die erste Zeile trifft nicht zu. In diesem Fall ist die Inline-Achse des Flex-Elements dieselbe wie die Hauptachse (horizontal), nicht die Querachse (vertikal). Daher wird baseline
nicht in flex-start
aufgelöst.
"... alle beteiligten Flex-Elemente in der Linie sind so ausgerichtet, dass ihre Grundlinien ausgerichtet sind ..." Nun, es gibt nur ein Element mit Grundlinienausrichtung. Es gibt keine andere Basislinie als Referenz. Offenbar fällt der Browser in einem solchen Szenario auf flex-start
zurück (aber ich habe keine offizielle Referenz für dieses Verhalten gesehen).
Der Rest der Spezifikationssprache ist für diese Frage nicht relevant, wird aber in diesem verwandten Beitrag ausführlich behandelt: Was ist? der Unterschied zwischen Flex-Start und Baseline?