Próbowałem stylizować fieldset
element za pomocą display: flex
i display: inline-flex
.
Jednak to nie zadziałało: flex
zachowywał się jak block
i inline-flex
zachowywał się jak inline-block
.
Dzieje się tak zarówno w przeglądarce Firefox, jak i Chrome, ale dziwnie działa w IE.
Czy to błąd? Nie mogłem znaleźć fieldset
żadnego specjalnego zachowania, ani w HTML5, ani w specyfikacjach CSS Flexible Box Layout .
fieldset, div {
display: flex;
border: 1px solid;
}
<fieldset>
<p>foo</p>
<p>bar</p>
</fieldset>
<div>
<p>foo</p>
<p>bar</p>
</div>
Odpowiedzi:
Według błędu 984869 -
display: flex
nie działa w przypadku elementów przycisków ,Dlatego ten błąd został oznaczony jako „rozwiązany nieprawidłowy”.
Istnieje również błąd 1047590 -
display: flex;
nie działa<fieldset>
, obecnie „niepotwierdzony”.Dobra wiadomość : Firefox 46+ implementuje Flexbox dla
<fieldset>
. Zobacz błąd 1230207 .źródło
<button> is not implementable (by browsers) in pure CSS
- to po prostu złe. Przeglądarka może zaimplementować dowolnie<button>
, ale nie jest „umownie zobowiązana” do renderowania jej za pomocą bibliotek widgetów systemowych lub czegokolwiek, co ogranicza zdolność do stylizowania ich za pomocą CSS lub innych niestandardowych zachowań. To samo dotyczy każdego innego elementu.Dowiaduję się, że może to być błąd w Chrome i Firefox, gdzie
legend
ifieldset
są zamieniane elementy .Zgłoszone błędy:
Bug Chrome (wciąż otwarty)
Bug Firefox (naprawiony od wersji 46)
Możliwe obejście:
Możliwym obejściem byłoby użycie
<div role="group">
w HTML i zastosowanie w CSSdiv[role='group']
jako selektorze.AKTUALIZACJA
W Chrome w wersji 83
button
może współpracować zdisplay: inline-grid/grid/inline-flex/flex
, możesz zobaczyć demo poniżej:źródło
Oznacz błąd przeglądarki Chrome, aby zwiększyć priorytet błędu
To jest błąd w Chrome. Dodaj gwiazdkę do tego problemu, aby zwiększyć priorytet, który należy naprawić: https://bugs.chromium.org/p/chromium/issues/detail?id=375693
W międzyczasie stworzyłem te trzy przykłady pióra Code Pen, aby pokazać, jak obejść ten problem. Zostały one zbudowane za pomocą CSS Grid dla przykładów, ale te same techniki mogą być zastosowane dla Flexbox.
Używanie aria-labelledby zamiast legendy
Jest to bardziej odpowiedni sposób na rozwiązanie problemu. Minusem jest to, że musisz poradzić sobie z generowaniem unikalnych identyfikatorów stosowanych do każdego fałszywego elementu legendy.
https://codepen.io/daniel-tonon/pen/vaaGzZ
Użycie role = "group" i aria-labelledby zamiast zestawu pól i legendy
Jeśli potrzebujesz elastycznego pojemnika, aby móc rozciągnąć się na wysokość elementu rodzeństwa, a następnie przekazać ten odcinek swoim dzieciom, musisz użyć
role="group"
zamiast<fieldset>
https://codepen.io/daniel-tonon/pen/BayRjGz
Tworzenie fałszywej duplikaty legendy do celów stylizacji
Jest to o wiele bardziej hackerski sposób na zrobienie tego. Nadal jest tak samo dostępny, ale nie musisz zajmować się identyfikatorami, robiąc to w ten sposób. Główną wadą jest to, że między prawdziwym elementem legendy a fałszywym elementem legendy będzie zduplikowana treść.
https://codepen.io/daniel-tonon/pen/zLLqjY
Legenda MUSI być bezpośrednio przyzwoita
Kiedy po raz pierwszy próbujesz to naprawić, prawdopodobnie spróbujesz to zrobić:
Odkryjesz, że to działa, a następnie prawdopodobnie przejdziesz dalej, nie zastanawiając się dłużej.
Problem polega na tym, że umieszczenie opakowania div między zestawem pól a legendą zrywa związek między dwoma elementami. To łamie semantykę zestawu pól / legend.
Robiąc to, pokonałeś cały cel używania zestawu pól / legend.
Poza tym nie ma sensu używać zestawu pól, jeśli nie nadajesz mu zestawu legend.
źródło
Z mojego doświadczenia wynika, że
<fieldset>
ani<button>
nie<textarea>
mogę , ani nie mogę poprawnie używaćdisplay:flex
ani odziedziczyć właściwości.Jak już wspomnieli inni, zgłoszono błędy. Jeśli chcesz używać Flexboksa do sterowania kolejnością (np.
order:2
), Musisz owinąć element w div. Jeśli chcesz, aby Flexbox kontrolował rzeczywisty układ i wymiary, możesz rozważyć użycie div zamiast kontroli wejścia (Które śmierdzi, wiem).źródło
Może trzeba użyć grupy ról, ponieważ Firefox, Chrome i myślę, że Safari ma błąd z zestawami pól. Wtedy selektor w CSS byłby po prostu
Edycja: Oto niektóre problemy, których doświadczają także inni ludzie.
Wydanie 375693
Numer 262679
źródło
możesz wstawić dodatkowy div
<fieldset>
z następującymi rekwizytami:źródło
<legend>
element (jeśli jest używany) na najwyższym poziomie<fieldset>
elementu, aby zachować jego użycie zgodnie z przeznaczeniem (Permitted content: An optional <legend> element, followed by flow content.
- patrz developer.mozilla.org/en-US/docs/Web/HTML/Element/… )fieldset
samego siebie.<legend>
elementu. To w ogóle nie służy celowi użycia zestawu pól / legend. Zobacz moją odpowiedź tutaj: stackoverflow.com/a/59425373/1611058Aby odpowiedzieć na pierwotne pytanie: tak, jest to błąd, ale w momencie zadawania pytania nie był dobrze zdefiniowany.
Teraz rendering dla zestawu pól jest lepiej zdefiniowany: https://html.spec.whatwg.org/multipage/rendering.html#the-fieldset-and-legend-elements
W przeglądarce Firefox i Safari
flexbox
nafieldset
teraz działa. Nie ma go jeszcze w chromie. (Zobacz https://bugs.chromium.org/p/chromium/issues/detail?id=375693 )Zobacz także https://blog.whatwg.org/the-state-of-fieldset-interoperability, aby uzyskać informacje na temat ulepszeń wprowadzonych w specyfikacji w 2018 r.
źródło