Próbuję wyśrodkować wewnętrzne elementy <button>
-tagu za pomocą flexboxów justify-content: center
. Ale Safari ich nie wyśrodkowuje. Mogę zastosować ten sam styl do innych tagów i działa zgodnie z przeznaczeniem (zobacz <p>
-tag). Tylko przycisk jest wyrównany do lewej.
Wypróbuj Firefox lub Chrome, a zobaczysz różnicę.
Czy istnieje styl klienta użytkownika, który muszę nadpisać? Lub inne rozwiązanie tego problemu?
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>
Oraz jsfiddle: http://jsfiddle.net/z3sfwtn2/2/
Odpowiedzi:
Problem
W niektórych przeglądarkach
<button>
element nie akceptuje zmiandisplay
wartości, poza przełączaniem międzyblock
iinline-block
. Oznacza to, że<button>
element nie może być kontenerem flex ani grid, ani<table>
też.Oprócz
<button>
elementów, może znaleźć zastosowanie do tego ograniczenia<fieldset>
i<legend>
elementy, jak również.Aby uzyskać więcej informacji, zobacz poniższe raporty o błędach.
Uwaga: Chociaż nie mogą to być pojemniki elastyczne,
<button>
elementy mogą być elementami elastycznymi.Rozwiązanie
Istnieje proste i łatwe obejście tego problemu w różnych przeglądarkach:
Zawiń zawartość
button
w aspan
i utwórzspan
pojemnik elastyczny.Dostosowany HTML (
button
zawartość opakowana w aspan
)<div> <button> <span><!-- using a div also works but is not valid HTML --> <span>Test</span> <span>Test</span> </span> </button> <p> <span>Test</span> <span>Test</span> </p> </div>
Dostosowany CSS (docelowy
span
)button > span, p { display: flex; flex-direction: row; justify-content: center; }
Zmienione demo
Referencje / raporty o błędach
Flexbox na
<button>
blokuje zawartość, ale nie ustanawia kontekstu formatowania flexDodaj obsługę wyświetlania: flex / grid i układ kolumn wewnątrz
<button>
elementówZobacz także:
źródło
<button>
s, ale dlaczego, u licha, nie działa też w przypadku<fieldset>
? Czy ten element nie powinien być uważany za zwykły element na poziomie bloku, który jest ważny dla kontenera elastycznego?div
nie może być dzieckiem a,button
ponieważ jeśli pomyślisz o tym w starej szkole HTML, element blokowy nie może być elementem podrzędnym elementu wbudowanego. Ale dziś, z HTML5, technicznie poprawna odpowiedź jest taka, że element może przyjąć tylko frazowania zawartość . A reprezentuje treść wyrażenia , ale nie. A oznacza zawartość przepływu . Więcej szczegółówbutton
span
div
div
Oto mój najprostszy hack.
button::before, button::after { content: ''; flex: 1 0 auto; }
źródło
Począwszy od Chrome 83,
button
teraz działa takinline-grid/grid/inline-flex/flex
, jak możesz dowiedzieć się więcej o tej nowej funkcji tutajOto fragment (dla osób korzystających z Chrome 83 i nowszych)
button { display: inline-flex; height: 2rem; align-items: flex-end; width: 4rem; -webkit-appearance: none; justify-content: flex-end; }
<!-- The align-items keyword should fail in Chrome 81 or earlier, but work in Chrome 83 or later. To see the error, the button needs styles that make it more of an extrinsic container. In other words, it needs a height or width set. --> <button>Hi</button> <input type="button" value="Hi">
źródło