Eu tentei estilizar um fieldset
elemento com display: flex
e display: inline-flex
.
No entanto, não funcionou: flex
comportou - se como block
, e inline-flex
comportou-se como inline-block
.
Isso acontece no Firefox e no Chrome, mas estranhamente funciona no IE.
Isso é um bug? Não achei que fieldset
devesse ter nenhum comportamento especial, nem no HTML5 nem nas especificações do 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>
Respostas:
De acordo com o Bug 984869 -
display: flex
não funciona para elementos de botão ,Portanto, esse bug foi marcado como "resolvido inválido".
Há também o Bug 1047590 -
display: flex;
não funciona<fieldset>
, atualmente "não confirmado".Boas notícias : o Firefox 46+ implementa o Flexbox for
<fieldset>
. Veja o erro 1230207 .fonte
<button> is not implementable (by browsers) in pure CSS
- isso está errado. Um navegador é livre para implementar o modo<button>
que quiser, não é "contratualmente obrigado" a renderizá-lo usando bibliotecas de widgets do sistema ou qualquer outra coisa, o que prejudica a capacidade de estilizá-las com CSS ou outros comportamentos personalizados. O mesmo vale para qualquer outro elemento, realmente.Eu descobrir isso pode ser um bug no Chrome e Firefox, onde
legend
efieldset
são elementos substituído .Erros relatados:
Bug Chrome (ainda aberto)
Bug Firefox (corrigido desde a v46)
Uma possível solução alternativa:
Uma possível solução alternativa seria usar
<div role="group">
em HTML e aplicar em CSSdiv[role='group']
como seletor.ATUALIZAR
No Chrome, a versão 83
button
pode funcionar com odisplay: inline-grid/grid/inline-flex/flex
, você pode ver a demonstração abaixo:fonte
Marque o bug do Chrome com estrela para aumentar a prioridade do bug
Este é um erro no Chrome. Adicione uma estrela a esse problema para aumentar sua prioridade a ser corrigida: https://bugs.chromium.org/p/chromium/issues/detail?id=375693
Nesse meio tempo, criei esses três exemplos de Code Pen para mostrar como solucionar o problema. Eles são criados usando CSS Grid para os exemplos, mas as mesmas técnicas podem ser usadas para o flexbox.
Usando ária-labelledby em vez de legenda
Essa é a maneira mais adequada de lidar com o problema. A desvantagem é que você precisa lidar com a geração de IDs exclusivos aplicados a todos os elementos de legenda falsos.
https://codepen.io/daniel-tonon/pen/vaaGzZ
Usando role = "group" e ária-labelledby em vez de fieldset e legend
Se você precisar que o contêiner flexível possa se esticar até a altura de um elemento irmão e também passá-lo para seus filhos, será necessário usar em
role="group"
vez de<fieldset>
https://codepen.io/daniel-tonon/pen/BayRjGz
Criando uma legenda duplicada falsa para fins de estilo
Esta é uma maneira muito mais hacky de fazer isso. Ainda é tão acessível, mas você não precisa lidar com IDs ao fazê-lo dessa maneira. A principal desvantagem é que haverá conteúdo duplicado entre o elemento de legenda real e o elemento de legenda falsa.
https://codepen.io/daniel-tonon/pen/zLLqjY
A legenda DEVE ser um decendente direto
Quando você estiver tentando consertar isso sozinho, provavelmente tentará fazer o seguinte:
Você descobrirá que funciona e provavelmente seguirá em frente sem pensar duas vezes.
O problema é que colocar um invólucro div entre o conjunto de campos e a legenda interrompe o relacionamento entre os dois elementos. Isso quebra a semântica do fieldset / legenda.
Então, ao fazer isso, você derrotou todo o propósito de usar fieldset / legend em primeiro lugar.
Além disso, não faz muito sentido usar um conjunto de campos se você não der uma legenda a esse conjunto de campos.
fonte
Na minha experiência, descobri que nem
<fieldset>
, nem<button>
, nem<textarea>
podem usardisplay:flex
ou herdar adequadamente as propriedades.Como outros já mencionaram, foram relatados bugs. Se você quiser usar o flexbox para controlar pedidos (por exemplo
order:2
), precisará envolver o elemento em uma div. Se você deseja que o flexbox controle o layout e as dimensões reais, considere usar uma div, em vez do controle de entrada (o que cheira mal, eu sei).fonte
Talvez precise usar o grupo de funções, porque o Firefox, o Chrome e eu acho que o safari tem um bug com os conjuntos de campos, aparentemente. Então o seletor no CSS seria simplesmente
Edit: Aqui estão alguns problemas que outras pessoas estão enfrentando também.
Edição 375693
Edição 262679
fonte
você pode colocar div adicional
<fieldset>
com os seguintes adereços:fonte
<legend>
elemento (se usado) no nível superior do<fieldset>
elemento para manter seu uso como pretendido (Permitted content: An optional <legend> element, followed by flow content.
- consulte developer.mozilla.org/en-US/docs/Web/HTML/Element/… )fieldset
si mesmo.<legend>
elemento. Isso anula o propósito de usar fieldset / legenda em primeiro lugar. Veja minha resposta aqui: stackoverflow.com/a/59425373/1611058Para responder à pergunta original: sim, é um bug, mas não estava bem definido no momento em que a pergunta foi feita.
Agora, a renderização para o fieldset está melhor definida: https://html.spec.whatwg.org/multipage/rendering.html#the-fieldset-and-legend-elements
No Firefox e no Safari,
flexbox
nofieldset
agora funciona. Ainda não está no Chromium. (Consulte https://bugs.chromium.org/p/chromium/issues/detail?id=375693 )Consulte também https://blog.whatwg.org/the-state-of-fieldset-interoperability para obter as melhorias feitas na especificação em 2018.
fonte