Traté de diseñar un fieldset
elemento con display: flex
ydisplay: inline-flex
.
Sin embargo, no funcionó: se flex
comportó como block
y se inline-flex
comportó como inline-block
.
Esto sucede tanto en Firefox como en Chrome, pero extrañamente funciona en IE.
¿Es un error? No pude encontrar que fieldset
debería tener un comportamiento especial, ni en HTML5 ni en las especificaciones de diseño de caja flexible de CSS .
fieldset, div {
display: flex;
border: 1px solid;
}
<fieldset>
<p>foo</p>
<p>bar</p>
</fieldset>
<div>
<p>foo</p>
<p>bar</p>
</div>
Respuestas:
De acuerdo con el error 984869:
display: flex
no funciona para elementos de botón ,Por lo tanto, ese error se marcó como "resuelto no válido".
También hay un error 1047590:
display: flex;
no funciona<fieldset>
, actualmente "sin confirmar".Buenas noticias : Firefox 46+ implementa Flexbox para
<fieldset>
. Ver error 1230207 .fuente
<button> is not implementable (by browsers) in pure CSS
-- eso está mal. Un navegador es libre de implementar lo<button>
que quiera, no está "obligado contractualmente" a representarlo utilizando bibliotecas de widgets del sistema o lo que sea, lo que afecta la capacidad de diseñarlos con CSS u otros comportamientos personalizados. Lo mismo ocurre con cualquier otro elemento, en realidad.Descubrí que esto podría ser un error en Chrome y Firefox donde
legend
yfieldset
son elementos reemplazados .Errores reportados:
Bug Chrome (todavía abierto)
Bug Firefox (corregido desde v46)
Una posible solución alternativa:
Una posible solución sería usar
<div role="group">
HTML y aplicar CSSdiv[role='group']
como selector.ACTUALIZAR
En Chrome versión 83
button
puede funcionar condisplay: inline-grid/grid/inline-flex/flex
, puedes ver la demostración a continuación:fuente
Destaque el error de Chrome para aumentar la prioridad del error
Este es un error en Chrome. Agregue una estrella a este problema para aumentar su prioridad a solucionar: https://bugs.chromium.org/p/chromium/issues/detail?id=375693
Mientras tanto, creé estos tres ejemplos de Code Pen para mostrar cómo solucionar el problema. Se crean utilizando CSS Grid para los ejemplos, pero se pueden usar las mismas técnicas para flexbox.
Usando aria-labelledby en lugar de leyenda
Esta es la forma más adecuada de lidiar con el problema. La desventaja es que tiene que lidiar con la generación de ID únicos aplicados a cada elemento de leyenda falso.
https://codepen.io/daniel-tonon/pen/vaaGzZ
Usando role = "group" y aria-labelledby en lugar de fieldset y legend
Si necesita el contenedor flexible para poder estirarse a la altura de un elemento hermano y luego también pasar ese estiramiento a sus elementos secundarios, deberá usarlo en
role="group"
lugar de<fieldset>
https://codepen.io/daniel-tonon/pen/BayRjGz
Crear una leyenda duplicada falsa para propósitos de estilo
Esta es una forma mucho más hacky de hacerlo. Todavía es igual de accesible, pero no tiene que lidiar con ID cuando lo hace de esta manera. El principal inconveniente es que habrá contenido duplicado entre el elemento de leyenda real y el elemento de leyenda falso.
https://codepen.io/daniel-tonon/pen/zLLqjY
La leyenda DEBE ser un descendiente directo
Cuando intente solucionarlo usted mismo por primera vez, probablemente intente hacerlo:
Descubrirá que funciona, y luego probablemente continuará sin pensarlo dos veces.
El problema es que poner un contenedor div entre el conjunto de campos y la leyenda rompe la relación entre los dos elementos. Esto rompe la semántica del conjunto de campos / leyenda.
Entonces, al hacer esto, has derrotado el propósito de usar el conjunto de campos / leyenda en primer lugar.
Además, no tiene mucho sentido usar un conjunto de campos si no le da una leyenda a ese conjunto de campos.
fuente
En mi experiencia, he descubierto que ni
<fieldset>
, ni<button>
, ni<textarea>
pueden usar adecuadamentedisplay:flex
o heredar propiedades.Como otros ya han mencionado, se han reportado errores. Si desea utilizar flexbox para controlar el orden (p
order:2
. Ej. ), Deberá envolver el elemento en un div. Si desea que flexbox controle el diseño y las dimensiones reales, entonces puede considerar usar un div, en lugar del control de entrada (que apesta, lo sé).fuente
Es posible que necesite usar role-group porque firefox, chrome y creo que Safari tienen un error con los conjuntos de campos aparentemente. Entonces el selector en el CSS simplemente sería
Editar: Aquí hay algunos problemas que otras personas también están experimentando.
Edición 375693
Edición 262679
fuente
puedes poner div adicional
<fieldset>
con los siguientes accesorios:fuente
<legend>
elemento (si se usa) en el nivel superior del<fieldset>
elemento para mantener su uso según lo previsto (Permitted content: An optional <legend> element, followed by flow content.
- vea developer.mozilla.org/en-US/docs/Web/HTML/Element/… )fieldset
sí mismo.<legend>
elemento. Esto anula el propósito de usar el conjunto de campos / leyenda en primer lugar. Vea mi respuesta aquí: stackoverflow.com/a/59425373/1611058Para responder a la pregunta original: sí, es un error, pero no estaba bien definido en el momento en que se hizo la pregunta.
Ahora la representación para el conjunto de campos está mejor definida: https://html.spec.whatwg.org/multipage/rendering.html#the-fieldset-and-legend-elements
En Firefox y Safari,
flexbox
defieldset
ahora trabaja. Todavía no en cromo. (Ver https://bugs.chromium.org/p/chromium/issues/detail?id=375693 )Consulte también https://blog.whatwg.org/the-state-of-fieldset-interoperability para conocer las mejoras realizadas en la especificación en 2018.
fuente