Ich habe versucht, ein fieldset
Element mit display: flex
und zu stylen display: inline-flex
.
Es hat jedoch nicht funktioniert: flex
benahm sich wie block
und inline-flex
benahm sich wie inline-block
.
Dies geschieht sowohl unter Firefox als auch unter Chrome, funktioniert aber seltsamerweise unter IE.
Ist es ein Fehler? Ich konnte nicht feststellen, dass fieldset
dies ein spezielles Verhalten haben sollte, weder in HTML5 noch in CSS Flexible Box Layout- Spezifikationen.
fieldset, div {
display: flex;
border: 1px solid;
}
<fieldset>
<p>foo</p>
<p>bar</p>
</fieldset>
<div>
<p>foo</p>
<p>bar</p>
</div>
Antworten:
Laut Bug 984869 -
display: flex
funktioniert nicht für Schaltflächenelemente ,Daher wurde dieser Fehler als "ungültig behoben" markiert.
Es gibt auch Bug 1047590 -
display: flex;
funktioniert nicht<fieldset>
, derzeit "unbestätigt".Gute Nachrichten : Firefox 46+ implementiert Flexbox für
<fieldset>
. Siehe Fehler 1230207 .quelle
<button> is not implementable (by browsers) in pure CSS
-- Das ist einfach falsch. Es steht einem Browser frei, eine zu implementieren, wie er<button>
möchte. Sie sind nicht "vertraglich verpflichtet", sie mithilfe von System-Widget-Bibliotheken oder was auch immer zu rendern, was die Fähigkeit beeinträchtigt, diese mit CSS oder anderen benutzerdefinierten Verhaltensweisen zu formatieren. Gleiches gilt für jedes andere Element.Ich finde heraus , dies könnte ein Fehler in Chrome und Firefox, wo
legend
undfieldset
sind Elemente ersetzt .Gemeldete Fehler:
Bug Chrome (noch offen)
Bug Firefox (behoben seit v46)
Eine mögliche Problemumgehung:
Eine mögliche Problemumgehung wäre die Verwendung
<div role="group">
in HTML und die Anwendung in CSSdiv[role='group']
als Selektor.AKTUALISIEREN
In Chrome kann Version 83
button
mit dem arbeitendisplay: inline-grid/grid/inline-flex/flex
, Sie können die Demo unten sehen:quelle
Bitte markieren Sie den Chrome-Fehler, um die Fehlerpriorität zu erhöhen
Dies ist ein Fehler in Chrome. Bitte fügen Sie diesem Problem einen Stern hinzu, um die zu behebende Priorität zu erhöhen: https://bugs.chromium.org/p/chromium/issues/detail?id=375693
In der Zwischenzeit habe ich diese drei Code Pen-Beispiele erstellt, um zu zeigen, wie das Problem umgangen werden kann. Sie werden für die Beispiele mit CSS Grid erstellt, aber für Flexbox können dieselben Techniken verwendet werden.
Verwenden von Aria-Labelledby anstelle von Legende
Dies ist der bessere Weg, um mit dem Problem umzugehen. Der Nachteil ist, dass Sie sich mit der Generierung eindeutiger IDs befassen müssen, die auf jedes gefälschte Legendenelement angewendet werden.
https://codepen.io/daniel-tonon/pen/vaaGzZ
Verwenden Sie role = "group" und aria-labelledby anstelle von fieldset und legend
Wenn Sie den Flex-Container benötigen, um sich auf die Höhe eines Geschwisterelements dehnen zu können, und diese Dehnung dann auch an seine Kinder weitergeben, müssen Sie
role="group"
stattdessen verwenden<fieldset>
https://codepen.io/daniel-tonon/pen/BayRjGz
Erstellen einer gefälschten doppelten Legende für Stylingzwecke
Dies ist ein weitaus hackigerer Weg, dies zu tun. Es ist immer noch genauso zugänglich, aber Sie müssen sich auf diese Weise nicht mit IDs befassen. Der Hauptnachteil ist, dass zwischen dem realen Legendenelement und dem gefälschten Legendenelement doppelter Inhalt vorhanden sein wird.
https://codepen.io/daniel-tonon/pen/zLLqjY
Die Legende MUSS ein direkter Nachkomme sein
Wenn Sie zum ersten Mal versuchen, dies selbst zu beheben, werden Sie wahrscheinlich Folgendes versuchen:
Sie werden feststellen, dass es funktioniert, und dann werden Sie wahrscheinlich weitermachen, ohne darüber nachzudenken.
Das Problem besteht darin, dass durch das Einfügen eines Div-Wrappers zwischen dem Feldsatz und der Legende die Beziehung zwischen den beiden Elementen unterbrochen wird. Dies bricht die Semantik von Feldmenge / Legende.
Auf diese Weise haben Sie den gesamten Zweck der Verwendung von Feldsatz / Legende besiegt.
Es macht auch nicht viel Sinn, ein Feldset zu verwenden, wenn Sie diesem Feldset keine Legende geben.
quelle
Nach meiner Erfahrung habe ich festgestellt, dass weder
<fieldset>
noch<button>
noch Eigenschaften<textarea>
ordnungsgemäß verwendetdisplay:flex
oder geerbt werden können.Wie andere bereits erwähnt haben, wurden Fehler gemeldet. Wenn Sie Flexbox verwenden möchten, um die Reihenfolge zu steuern (z. B.
order:2
), müssen Sie das Element in ein div einschließen. Wenn Sie möchten, dass die Flexbox das tatsächliche Layout und die Abmessungen steuert, sollten Sie anstelle der Eingabesteuerung ein div verwenden (was stinkt, weiß ich).quelle
Möglicherweise muss eine Rollengruppe verwendet werden, da Firefox, Chrome und ich denke, dass Safari anscheinend einen Fehler mit Feldsätzen hat. Dann wäre der Selektor im CSS einfach
Bearbeiten: Hier sind einige Probleme, die auch andere Leute haben.
Ausgabe 375693
Ausgabe 262679
quelle
<fieldset>
Mit den folgenden Requisiten können Sie zusätzliche Divs hinzufügen:quelle
<legend>
Element (falls verwendet) in der obersten Ebene des<fieldset>
Elements zuPermitted content: An optional <legend> element, followed by flow content.
fieldset
Selbst.<legend>
Elements zu brechen . Dies macht den Zweck der Verwendung von Feldsatz / Legende in erster Linie zunichte. Siehe meine Antwort hier: stackoverflow.com/a/59425373/1611058Um die ursprüngliche Frage zu beantworten: Ja, es ist ein Fehler, aber er war zum Zeitpunkt der Frage nicht genau definiert.
Jetzt ist das Rendering für Fieldset besser definiert: https://html.spec.whatwg.org/multipage/rendering.html#the-fieldset-and-legend-elements
In Firefox und Safari funktioniert
flexbox
onfieldset
jetzt. Es ist noch nicht in Chrom. (Siehe https://bugs.chromium.org/p/chromium/issues/detail?id=375693 )Unter https://blog.whatwg.org/the-state-of-fieldset-interoperability finden Sie auch Verbesserungen in der Spezifikation von 2018.
quelle