Ich versuche, innere Elemente eines <button>
Tags mit Flexboxen zu zentrieren justify-content: center
. Aber Safari zentriert sie nicht. Ich kann den gleichen Stil auf alle anderen Tags anwenden und er funktioniert wie vorgesehen (siehe <p>
-tag). Nur die Schaltfläche ist linksbündig.
Probieren Sie Firefox oder Chrome aus und Sie können den Unterschied sehen.
Gibt es einen Benutzeragentenstil, den ich überschreiben muss? Oder eine andere Lösung für dieses Problem?
div {
display: flex;
flex-direction: column;
width: 100%;
}
button, p {
display: flex;
flex-direction: row;
justify-content: center;
}
<div>
<button>
<span>Test</span>
<span>Test</span>
</button>
<p>
<span>Test</span>
<span>Test</span>
</p>
</div>
Und eine jsfiddle: http://jsfiddle.net/z3sfwtn2/2/
Antworten:
Das Problem
In einigen Browsern
<button>
akzeptiert das Element keine Änderungen an seinemdisplay
Wert, außer zwischenblock
und zu wechselninline-block
. Dies bedeutet, dass ein<button>
Element kein Flex- oder Gittercontainer oder auch kein sein kann<table>
.Zusätzlich zu
<button>
Elementen gilt diese Einschränkung möglicherweise auch für<fieldset>
und<legend>
Elemente.Weitere Informationen finden Sie in den Fehlerberichten unten.
Hinweis: Obwohl es sich nicht um Flex-Container handeln kann, können
<button>
Elemente Flex-Elemente sein.Die Lösung
Es gibt eine einfache und browserübergreifende Problemumgehung für dieses Problem:
Wickeln Sie den Inhalt des
button
in einspan
und machen Siespan
den Flex-Container.Angepasster HTML-Code (umschlossener
button
Inhalt in aspan
)Angepasstes CSS (gezielt
span
)Überarbeitete Demo
Referenzen / Fehlerberichte
Flexbox auf einem
<button>
blockiert den Inhalt, erstellt jedoch keinen Flex-FormatierungskontextUnterstützung für die Anzeige hinzufügen: Flex / Grid- und Columnset-Layout innerhalb von
<button>
ElementenSiehe auch:
quelle
<button>
s vielleicht nicht funktioniert , aber warum um alles in der Welt funktioniert es auch nicht<fieldset>
? Sollte dieses Element nicht als reguläres Element auf Blockebene betrachtet werden, das für einen Flex-Container gültig ist?div
kann kein Kind von a sein,button
denn wenn Sie es in HTML der alten Schule betrachten, kann ein Element auf Blockebene kein Kind eines Elements auf Inline-Ebene sein. Bei HTML5 lautet die technisch korrekte Antwort heute jedoch, dass einbutton
Element nur Phrasierungsinhalte akzeptieren kann . A stehtspan
für Phrasierungsinhalte , adiv
jedoch nicht. A stehtdiv
für Flow Content . Weitere DetailsHier ist mein einfachster Hack.
quelle
Ab Chrome 83
button
funktioniert das jetzt soinline-grid/grid/inline-flex/flex
. Weitere Informationen zu dieser neuen Funktion finden Sie hierHier ist ein Ausschnitt (für Benutzer von Chrome 83 und höher)
quelle