Saya mencoba untuk memusatkan elemen dalam dari <button>
-tag dengan flexbox's justify-content: center
. Tapi Safari tidak memusatkannya. Saya dapat menerapkan gaya yang sama ke tag lain dan berfungsi sebagaimana mestinya (lihat <p>
-tag). Hanya tombol yang rata kiri.
Coba Firefox atau Chrome dan Anda dapat melihat perbedaannya.
Apakah ada gaya agen pengguna yang harus saya timpa? Atau solusi lain untuk masalah ini?
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>
Dan jsfiddle: http://jsfiddle.net/z3sfwtn2/2/
Jawaban:
Masalah
Di beberapa browser,
<button>
elemen tidak menerima perubahan padadisplay
nilainya, selain beralih antarablock
daninline-block
. Ini berarti bahwa<button>
elemen tidak bisa menjadi wadah flex atau grid, atau<table>
keduanya.Selain
<button>
unsur-unsur, Anda mungkin menemukan kendala ini berlaku untuk<fieldset>
dan<legend>
elemen, juga.Lihat laporan bug di bawah untuk lebih jelasnya.
Catatan: Meskipun tidak bisa menjadi wadah fleksibel,
<button>
elemen bisa menjadi item fleksibel.Solusinya
Ada solusi lintas-browser yang sederhana dan mudah untuk masalah ini:
Bungkus isi
button
dalam aspan
, dan buatspan
wadah fleksibel.HTML yang disesuaikan (dibungkus
button
konten dalam 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>
CSS yang disesuaikan (bertarget
span
)button > span, p { display: flex; flex-direction: row; justify-content: center; }
Demo Revisi
Referensi / Laporan Bug
Flexbox pada suatu
<button>
memblokir konten tetapi tidak membuat konteks pemformatan fleksibelTambahkan dukungan untuk tampilan: flex / grid dan tata letak kolom di dalam
<button>
elemenLihat juga:
sumber
<button>
s, tetapi mengapa itu tidak berhasil<fieldset>
juga? Bukankah elemen itu harus dianggap sebagai elemen tingkat blok biasa yang valid untuk wadah fleksibel?div
tidak bisa menjadi anak daributton
karena, jika Anda memikirkannya di HTML jadul, elemen level blok tidak bisa menjadi anak dari elemen level sebaris. Tapi hari ini, dengan HTML5, jawaban yang benar secara teknis adalah bahwa sebuahbutton
elemen hanya dapat menerima ungkapan Konten . Aspan
mewakili Konten Frase , tetapi adiv
tidak. Adiv
mewakili Isi Arus . Detail lebih lanjutIni hack saya yang paling sederhana.
button::before, button::after { content: ''; flex: 1 0 auto; }
sumber
Memulai Chrome 83,
button
sekarang berfungsi sebagaiinline-grid/grid/inline-flex/flex
, Anda dapat melihat lebih banyak tentang fitur baru ini di siniBerikut ini cuplikan (untuk mereka yang menggunakan Chrome 83 dan lebih tinggi)
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">
sumber