Saya mencoba gaya a fieldset
elemen dengan display: flex
dan display: inline-flex
.
Namun, itu tidak berhasil: flex
berperilaku seperti block
, daninline-flex
berperilaku seperti inline-block
.
Ini terjadi pada Firefox dan Chrome, tetapi anehnya itu bekerja pada IE.
Apakah ini bug? Saya tidak dapat menemukan bahwa fieldset
seharusnya memiliki perilaku khusus, baik dalam HTML5 maupun dalam spesifikasi Layout Kotak Fleksibel CSS .
fieldset, div {
display: flex;
border: 1px solid;
}
<fieldset>
<p>foo</p>
<p>bar</p>
</fieldset>
<div>
<p>foo</p>
<p>bar</p>
</div>
Jawaban:
Menurut Bug 984869 -
display: flex
tidak berfungsi untuk elemen tombol ,Karenanya, bug itu ditandai sebagai "diselesaikan tidak valid".
Ada juga Bug 1047590 -
display: flex;
tidak berfungsi<fieldset>
, saat ini "belum dikonfirmasi".Berita baik : Firefox 46+ mengimplementasikan Flexbox for
<fieldset>
. Lihat bug 1230207 .sumber
<button> is not implementable (by browsers) in pure CSS
- itu salah. Sebuah browser bebas untuk mengimplementasikan apa pun yang<button>
mereka inginkan, mereka tidak "diwajibkan secara kontrak" untuk merendernya menggunakan pustaka widget sistem atau apa pun, yang mengganggu kemampuan untuk mendesainnya dengan CSS atau perilaku khusus lainnya. Sama berlaku untuk elemen lain, sungguh.Saya mencari tahu mungkin ini bug pada Chrome dan Firefox mana
legend
danfieldset
yang diganti elemen .Bug yang Dilaporkan:
Bug Chrome (masih terbuka)
Bug Firefox (diperbaiki sejak v46)
Solusi yang mungkin:
Solusi yang mungkin akan digunakan
<div role="group">
dalam HTML, dan menerapkan dalam CSSdiv[role='group']
sebagai pemilih.MEMPERBARUI
Di Chrome versi 83
button
dapat bekerja dengandisplay: inline-grid/grid/inline-flex/flex
, Anda dapat melihat demo di bawah ini:sumber
Beri bintang pada bug Chrome untuk meningkatkan prioritas bug
Ini adalah bug di Chrome. Harap tambahkan bintang pada masalah ini untuk meningkatkan prioritasnya untuk diperbaiki: https://bugs.chromium.org/p/chromium/issues/detail?id=375693
Sementara itu, saya membuat tiga contoh Pena Kode ini untuk menunjukkan cara mengatasi masalah ini. Mereka dibuat menggunakan CSS Grid untuk contoh tetapi teknik yang sama dapat digunakan untuk flexbox.
Menggunakan aria-labelled oleh bukan legenda
Ini adalah cara yang lebih tepat untuk mengatasi masalah tersebut. Kelemahannya adalah Anda harus berurusan dengan menghasilkan ID unik yang diterapkan untuk setiap elemen legenda palsu.
https://codepen.io/daniel-tonon/pen/vaaGzZ
Menggunakan role = "group" dan aria-labelled oleh bukannya fieldset dan legenda
Jika Anda membutuhkan wadah fleksibel untuk dapat meregangkan hingga setinggi elemen saudara dan kemudian juga merentangkannya ke anak-anaknya, Anda harus menggunakan
role="group"
alih-alih<fieldset>
https://codepen.io/daniel-tonon/pen/BayRjGz
Membuat legenda duplikat palsu untuk keperluan penataan
Ini adalah cara yang jauh lebih sulit untuk melakukannya. Itu masih dapat diakses tetapi Anda tidak harus berurusan dengan ID ketika melakukannya dengan cara ini. Sisi bawah utama adalah bahwa akan ada duplikat konten antara elemen legenda nyata dan elemen legenda palsu.
https://codepen.io/daniel-tonon/pen/zLLqjY
Legenda HARUS menjadi keturunan langsung
Ketika Anda pertama kali mencoba untuk memperbaiki ini sendiri, Anda mungkin akan mencoba melakukan ini:
Anda akan menemukan bahwa itu berfungsi, dan kemudian Anda mungkin akan melanjutkan tanpa memikirkannya lagi.
Masalahnya adalah bahwa menempatkan pembungkus div antara fieldset dan legenda memutus hubungan antara dua elemen. Ini mematahkan semantik fieldset / legenda.
Jadi dengan melakukan ini, Anda telah mengalahkan seluruh tujuan menggunakan fieldset / legenda di tempat pertama.
Selain itu, tidak ada gunanya menggunakan fieldset jika Anda tidak memberikan legenda tersebut.
sumber
Dalam pengalaman saya, saya telah menemukan bahwa keduanya
<fieldset>
, atau<button>
, juga tidak<textarea>
dapat menggunakandisplay:flex
atau mewarisi properti dengan benar.Seperti yang telah disebutkan orang lain, bug telah dilaporkan. Jika Anda ingin menggunakan flexbox untuk mengontrol pemesanan (mis.
order:2
), Maka Anda harus membungkus elemen dalam div. Jika Anda ingin flexbox mengontrol tata letak dan dimensi aktual, maka Anda mungkin ingin mempertimbangkan untuk menggunakan div, alih-alih kontrol input (Yang berbau busuk, saya tahu).sumber
Mungkin perlu menggunakan role-group karena firefox, chrome dan saya pikir safari memiliki bug dengan fieldset rupanya. Maka pemilih dalam CSS akan sederhana
Edit: Berikut adalah beberapa masalah yang dialami orang lain juga.
Masalah 375693
Edisi 262679
sumber
Anda dapat menambahkan div tambahan
<fieldset>
dengan properti berikut:sumber
<legend>
elemen (jika digunakan) di tingkat atas<fieldset>
elemen untuk menjaga penggunaannya sebagaimana dimaksud (Permitted content: An optional <legend> element, followed by flow content.
- lihat developer.mozilla.org/en-US/docs/Web/HTML/Element/… )fieldset
itu sendiri.<legend>
elemen. Ini mengalahkan tujuan menggunakan fieldset / legenda di tempat pertama. Lihat jawaban saya di sini: stackoverflow.com/a/59425373/1611058Untuk menjawab pertanyaan awal: ya, ini adalah bug, tetapi tidak didefinisikan dengan baik pada saat pertanyaan itu diajukan.
Sekarang rendering untuk fieldset didefinisikan dengan lebih baik: https://html.spec.whatwg.org/multipage/rendering.html#the-fieldset-and-legend-elements
Di Firefox dan Safari,
flexbox
padafieldset
saat bekerja. Itu belum di Chromium. (Lihat https://bugs.chromium.org/p/chromium/issues/detail?id=375693 )Lihat juga https://blog.whatwg.org/the-state-of-fieldset-interoperability untuk peningkatan yang dibuat dalam spesifikasi pada 2018.
sumber