J'ai essayé de styliser un fieldset
élément avec display: flex
et display: inline-flex
.
Cependant, cela n'a pas fonctionné: flex
s'est comporté comme block
, et inline-flex
s'est comporté comme inline-block
.
Cela se produit à la fois sur Firefox et Chrome, mais étrangement, cela fonctionne sur IE.
Est-ce un bug? Je n'ai pas trouvé que cela fieldset
devrait avoir un comportement spécial, ni en HTML5 ni dans les spécifications de disposition de boîte flexible CSS .
fieldset, div {
display: flex;
border: 1px solid;
}
<fieldset>
<p>foo</p>
<p>bar</p>
</fieldset>
<div>
<p>foo</p>
<p>bar</p>
</div>
Réponses:
Selon le bug 984869 -
display: flex
ne fonctionne pas pour les éléments de bouton ,Par conséquent, ce bogue a été marqué comme "résolu non valide".
Il existe également le bogue 1047590 -
display: flex;
ne fonctionne pas<fieldset>
, actuellement "non confirmé".Bonne nouvelle : Firefox 46+ implémente Flexbox pour
<fieldset>
. Voir bug 1230207 .la source
<button> is not implementable (by browsers) in pure CSS
- c'est juste faux. Un navigateur est libre d'implémenter<button>
ce qu'il veut, il n'est pas "contractuellement obligé" de le rendre en utilisant des bibliothèques de widgets système ou autre, ce qui nuit à la possibilité de les styliser avec CSS ou d'autres comportements personnalisés. Il en va de même pour tout autre élément, vraiment.Je découvre que cela pourrait être un bug sur Chrome et Firefox où
legend
etfieldset
sont des éléments remplacés .Bogues signalés:
Bug Chrome (toujours ouvert)
Bug Firefox (corrigé depuis la v46)
Une solution possible:
Une solution de contournement possible serait d'utiliser
<div role="group">
en HTML et d'appliquer en CSSdiv[role='group']
comme sélecteur.METTRE À JOUR
Dans Chrome, la version 83
button
peut fonctionner avecdisplay: inline-grid/grid/inline-flex/flex
, vous pouvez voir la démo ci-dessous:la source
Veuillez suivre le bogue Chrome pour augmenter la priorité des bogues
Il s'agit d'un bogue dans Chrome. Veuillez ajouter une étoile à ce problème pour augmenter sa priorité à corriger: https://bugs.chromium.org/p/chromium/issues/detail?id=375693
En attendant, j'ai créé ces trois exemples de stylo code pour montrer comment contourner le problème. Ils sont construits en utilisant CSS Grid pour les exemples mais les mêmes techniques peuvent être utilisées pour flexbox.
Utiliser aria-labelledby au lieu de légende
C'est la manière la plus appropriée de résoudre le problème. L'inconvénient est que vous devez gérer la génération d'ID uniques appliqués à chaque faux élément de légende.
https://codepen.io/daniel-tonon/pen/vaaGzZ
Utilisation de role = "group" et aria-labelledby au lieu de fieldset et legend
Si vous avez besoin que le conteneur flexible soit capable de s'étirer à la hauteur d'un élément frère et de passer ensuite cet étirement sur ses enfants, vous devrez utiliser à la
role="group"
place de<fieldset>
https://codepen.io/daniel-tonon/pen/BayRjGz
Création d'une fausse légende en double à des fins de style
C'est une façon beaucoup plus hacky de le faire. Il est toujours aussi accessible, mais vous n'avez pas à gérer les identifiants lorsque vous le faites de cette façon. Le principal inconvénient est qu'il va y avoir du contenu en double entre le véritable élément de légende et le faux élément de légende.
https://codepen.io/daniel-tonon/pen/zLLqjY
La légende DOIT être directement décente
Lorsque vous essayez pour la première fois de résoudre ce problème vous-même, vous essayez probablement de le faire:
Vous découvrirez que cela fonctionne, puis vous avancerez probablement sans y réfléchir.
Le problème est que mettre un wrapper div entre le fieldset et la légende rompt la relation entre les deux éléments. Cela rompt la sémantique de fieldset / legend.
Donc, en faisant cela, vous avez déjoué tout le but d'utiliser fieldset / legend en premier lieu.
En outre, il est inutile d'utiliser un jeu de champs si vous ne donnez pas à ce jeu de champs une légende.
la source
D'après mon expérience, j'ai constaté que ni
<fieldset>
, ni<button>
, ni<textarea>
ne peuvent correctement utiliserdisplay:flex
ou hériter des propriétés.Comme d'autres l'ont déjà mentionné, des bugs ont été signalés. Si vous souhaitez utiliser flexbox pour contrôler l'ordre (par exemple
order:2
), vous devez alors envelopper l'élément dans une div. Si vous souhaitez que Flexbox contrôle la disposition et les dimensions réelles, vous pouvez envisager d'utiliser un div, au lieu du contrôle d'entrée (qui pue, je sais).la source
Pourrait avoir besoin d'utiliser le groupe de rôles parce que Firefox, Chrome et je pense que Safari ont apparemment un bug avec les ensembles de champs. Ensuite, le sélecteur dans le CSS serait simplement
Edit: Voici quelques problèmes que d'autres personnes rencontrent également.
Numéro 375693
Numéro 262679
la source
vous pouvez ajouter des div supplémentaires
<fieldset>
avec les accessoires suivants:la source
<legend>
élément (s'il est utilisé) au niveau supérieur de l'<fieldset>
élément pour conserver son utilisation comme prévu (Permitted content: An optional <legend> element, followed by flow content.
- voir developer.mozilla.org/en-US/docs/Web/HTML/Element/… )fieldset
lui - même.<legend>
élément. Cela va à l'encontre du but d'utiliser fieldset / legend en premier lieu. Voir ma réponse ici: stackoverflow.com/a/59425373/1611058Pour répondre à la question d'origine: oui, c'est un bug, mais il n'était pas bien défini au moment où la question a été posée.
Maintenant, le rendu pour fieldset est mieux défini: https://html.spec.whatwg.org/multipage/rendering.html#the-fieldset-and-legend-elements
Dans Firefox et Safari,
flexbox
surfieldset
fonctionne maintenant. Ce n'est pas encore le cas dans Chrome. (Voir https://bugs.chromium.org/p/chromium/issues/detail?id=375693 )Voir également https://blog.whatwg.org/the-state-of-fieldset-interoperability pour les améliorations apportées à la spécification en 2018.
la source