Este é um dos pequenos problemas de CSS que me atormenta constantemente. Como as pessoas em torno do Stack Overflow se alinham verticalmente checkboxes
e seus navegadoreslabels
constantemente ? Sempre que eu os alinhar corretamente no Safari (geralmente usando no ), eles estão completamente desativados no Firefox e no IE. Corrija-o no Firefox e o Safari e o IE estão inevitavelmente bagunçados. Eu perco tempo com isso toda vez que codifico um formulário.vertical-align: baseline
input
Aqui está o código padrão com o qual trabalho:
<form>
<div>
<label><input type="checkbox" /> Label text</label>
</div>
</form>
Eu geralmente uso a redefinição de Eric Meyer, portanto, os elementos do formulário são relativamente limpos de substituições. Ansioso por dicas ou truques que você tem para oferecer!
height
eline-height
atributos, dê uma olhada em jsfiddle.net/wepw5o57/3position
etop
resolverá esse problema Exemplo: jsfiddle.net/ynkjc22sRespostas:
Depois de mais de uma hora ajustando, testando e tentando diferentes estilos de marcação, acho que posso ter uma solução decente. Os requisitos para este projeto em particular foram:
Antes de entrar em qualquer explicação, darei o código a você:
Aqui está o exemplo de trabalho no JSFiddle .
Este código pressupõe que você esteja usando uma redefinição como a de Eric Meyer, que não substitua as margens e o preenchimento do formulário (colocando as redefinições de margem e preenchimento no CSS de entrada). Obviamente, em um ambiente ao vivo, você provavelmente estará aninhando / substituindo coisas para apoiar outros elementos de entrada, mas eu queria manter as coisas simples.
Coisas a serem observadas:
*overflow
declaração é um hack do IE em linha (o hack da propriedade em estrela). Tanto o IE 6 quanto o 7 notarão, mas o Safari e o Firefox o ignorarão adequadamente. Eu acho que pode ser CSS válido, mas você ainda está melhor com comentários condicionais; apenas usei por simplicidade.vertical-align
declaração consistente entre os navegadores foivertical-align: bottom
. A configuração e o posicionamento relativamente ascendente se comportaram quase de maneira idêntica no Safari, Firefox e IE, com apenas um ou dois pixels de discrepância.overflow: hidden
por algum motivo, corta o espaço extra e permite que o posicionamento do IE atue de maneira muito semelhante ao Safari e Firefox.Espero que isso ajude alguém! Eu não tentei essa técnica específica em nenhum projeto além daquele em que estava trabalhando hoje de manhã, então, definitivamente, se você encontrar algo que funcione de forma mais consistente.
fonte
Às vezes, o alinhamento vertical precisa de dois elementos em linha (extensão, etiqueta, entrada, etc ...) próximos um do outro para funcionar corretamente. As caixas de seleção a seguir estão centralizadas verticalmente corretamente no IE, Safari, FF e Chrome, mesmo se o tamanho do texto for muito pequeno ou grande.
Todos flutuam um ao lado do outro na mesma linha, mas o agorarap significa que todo o texto do rótulo sempre fica ao lado da caixa de seleção.
A desvantagem são as tags SPAN extras sem sentido.
Agora, se você tivesse um texto de rótulo muito longo que precisasse quebrar sem quebrar sob a caixa de seleção, usaria preenchimento e recuo de texto negativo nos elementos do rótulo:
fonte
display: block; float: left;
parece ser redundanteTrabalhando com a solução de One Crayon , tenho algo que funciona para mim e é mais simples:
Renderiza pixel por pixel o mesmo no Safari (cuja linha de base eu confio) e o Firefox e o IE7 são bons. Também funciona para vários tamanhos de fonte de etiqueta, grandes e pequenos. Agora, para fixar a linha de base do IE nas seleções e entradas ...
Atualização: (Edição de terceiros)
A
bottom
posição correta depende da família e do tamanho da fonte! Descobri que usar elementosbottom: .08em;
de caixa de seleção e rádio é um bom valor geral. Eu testei no Chrome / Firefox / IE11 no Windows com fontes Arial e Calibri usando vários tamanhos de fonte pequenos / médios / grandes.fonte
Uma coisa fácil que parece funcionar bem é aplicar um ajuste na posição vertical da caixa de seleção com alinhamento vertical. Ainda haverá variações entre os navegadores, mas a solução é simples.
Referência
fonte
vertical-align
eposition: relative
porque ele também está trabalhando no IE9 corretamente :)em
tentar
vertical-align: middle
também seu código parece que deveria ser:
fonte
<label for="blah">
só é necessário se você estiver usando algo em que não faz sentido o rótulo quebrar (como uma caixa de texto; geralmente usarei<label for="blah">Foo</label><input id="blah" type="text" />
nesse caso). Nas caixas de seleção, acho que é menos marcação para envolvê-lo.Experimente a minha solução, tentei no IE 6, FF2 e Chrome e renderiza pixel por pixel nos três navegadores.
fonte
A única solução perfeitamente funcional para mim é:
Testado hoje em Chrome, Firefox, Opera, IE 7 e 8. Exemplo: Fiddle
fonte
Eu não testei completamente minha solução, mas parece funcionar muito bem.
Meu HTML é simplesmente:
Em seguida, defino todas as caixas de seleção
24px
para altura e largura. Para tornar o texto alinhado eu faço a etiqueta éline-height
também24px
e atribuirvertical-align: top;
assim:EDIT: Após o teste do IE, adicionei
vertical-align: bottom;
à entrada e alterei o CSS do rótulo. Você pode achar que precisa de um caso condicional do IE css para classificar o preenchimento - mas o texto e a caixa estão alinhados.Se alguém achar que isso não funciona, entre em contato. Aqui está em ação (no Chrome e no IE - desculpas por capturas de tela na retina e usando paralelos no IE):
fonte
Eu costumo usar a altura da linha para ajustar a posição vertical do meu texto estático:
Espero que ajude.
fonte
O truque é usar o alinhamento vertical apenas nas células da tabela ou o bloco embutido se estiver usando a etiqueta label.
fonte
Vamos finalmente dar uma olhada na fonte do problema
As caixas de seleção são renderizadas usando imagens (é possível definir as personalizadas via CSS). Aqui está uma caixa de seleção (desmarcada) no FireFox, destacada com o inspetor DOM:
E aqui está a mesma caixa de seleção não estilizada no Chrome:
Você pode ver a margem (laranja); estofamento não está presente (seria mostrado em verde). Então, qual é essa pseudo-margem à direita e na parte inferior da caixa de seleção? Essas são partes da imagem usada para a caixa de seleção . É por isso que usar simplesmente
vertical-align: middle
não é suficiente e essa é a fonte dos problemas entre navegadores.Então o que podemos fazer sobre isso?
Uma opção óbvia é - substitua as imagens! Felizmente, é possível fazer isso via CSS e substituí-lo por imagens externas, imagens base64 (em CSS), svg em CSS ou apenas pseudoelementos. É uma abordagem robusta (entre navegadores!), E aqui está um exemplo de tal ajuste roubado desta pergunta :
Você pode ler alguns artigos mais detalhados sobre esse estilo, como alguns listados aqui ; está fora do escopo desta resposta.
Ok, ainda e quanto à solução sem imagens personalizadas ou pseudo-elementos?
TL; DR: parece que isso não vai funcionar, use a caixa de seleção personalizada
Primeiro, vamos observar que, em outros navegadores, essas pseudo-margens dentro do ícone da caixa de seleção eram arbitrárias, não havia solução consistente. Para criar uma, precisamos explorar a anatomia de tais imagens nos navegadores existentes.
Então, quais navegadores têm as pseudo-margens nas caixas de seleção? Eu verifiquei o Chrome 75, Vivaldi 2.5 (baseado em cromo), FireFox 54 (não pergunte por que está desatualizado), IE 11, Edge 42, Safari? (emprestou um por um minuto, esqueceu de verificar a versão). Somente o Chrome e o Vivaldi têm essas pseudo-margens (suspeito que todos os navegadores baseados no Chromium também, como o Opera).
Qual é o tamanho dessas pseudo-margens? Para descobrir isso, pode-se usar uma caixa de seleção ampliada:
meu resultado é ~ 7% da largura / altura e, portanto, 0,9-1,0px em unidades absolutas. A precisão pode ser questionada: tente valores diferentes de
zoom
para a caixa de seleção. Nos meus testes no Chrome e no Vivaldi, o tamanho relativo da pseudo-margem é muito diferente noszoom
valores 10, 20 e 11-19 (??):scale
parece ser mais consistente:então provavelmente ~ 14% e 2px são os valores corretos.
Agora que sabemos (?) O tamanho da pseudo-margem, vamos observar que isso não é suficiente. Os tamanhos dos ícones da caixa de seleção são iguais para todos os navegadores? Ai! Aqui está o que o inspetor DOM mostra para caixas de seleção sem estilo:
Agora, antes de discutirmos quaisquer soluções ou truques, vamos perguntar: o que é um correto alinhamento ? O que estamos tentando alcançar? Até certo ponto, é uma questão de gosto, mas basicamente posso pensar nos seguintes aspectos "agradáveis" dos alinhamentos:
texto e caixa de seleção na mesma linha de base (deliberadamente não ajusto o tamanho da caixa de seleção aqui):
ou tem a mesma linha do meio em termos de letras minúsculas:
ou a mesma linha do meio em termos de letras maiúsculas (é mais fácil ver a diferença para diferentes tamanhos de fonte):
e também temos que decidir se o tamanho da caixa de seleção deve ser igual à altura de uma letra minúscula, maiúscula ou outra coisa (maior, menor ou entre minúscula e maiúscula).
Para esta discussão, vamos chamar um alinhamento de bom se a caixa de seleção estiver na mesma linha de base que o texto e tiver o tamanho de uma letra maiúscula (uma escolha altamente discutível):
Agora, quais ferramentas precisamos:
?
Em relação ao ajuste do tamanho caixa : há
width
,height
,size
,zoom
,scale
(eu perdi alguma coisa?).zoom
escale
não permitem definir o tamanho absoluto; portanto, eles podem ajudar apenas no ajuste do tamanho do texto, não no tamanho entre navegadores (a menos que possamos escrever regras específicas do navegador).size
não funciona com o Chrome (funcionou com o IE antigo? de qualquer maneira, não é tão interessante).width
eheight
trabalhar no Chrome e em outros navegadores, para que possamos definir um tamanho comum, mas, novamente, no Chrome, ele define o tamanho de toda a imagem, não a própria caixa de seleção. Nota: é o mínimo (largura, altura) que define o tamanho de uma caixa de seleção (se largura ≠ altura, a área fora do quadrado da caixa de seleção é adicionada à "pseudo-margem").Uma coisa lamentável é que as pseudo-margens na caixa de seleção do Chrome não estão definidas como zero para qualquer largura e altura, tanto quanto eu posso ver.
Receio que não exista um método somente CSS confiável hoje em dia.
Vamos considerar o alinhamento vertical.
vertical-align
Não é possível obter resultados consistentes quando definido comomiddle
oubaseline
por causa da pseudo-margem do Chrome, a única opção real para obter o mesmo "sistema de coordenadas" para todos os navegadores é alinhar o rótulo e a entrada paratop
:(na imagem: alinhamento vertical: superior, inferior e inferior sem sombra de caixa)
Então, que resultado obtemos disso?
O snippet acima funciona com o Chrome (navegadores baseados no Chromium), mas outros navegadores exigem um tamanho menor da caixa de seleção. Parece ser impossível ajustar o tamanho e o alinhamento vertical de maneira a contornar a peculiaridade da imagem da caixa de seleção do Chromium. Minha sugestão final é: use caixas de seleção personalizadas - e você evitará frustrações :)
fonte
Agora que o flexbox é suportado em todos os navegadores modernos, algo assim parece uma abordagem mais fácil para mim.
Aqui está a demonstração completa da versão com prefixo:
Mostrar snippet de código
fonte
Eu acho que essa é a maneira mais fácil
fonte
Eu não gosto de posicionamento relativo porque faz com que o elemento seja renderizado acima de tudo em seu nível (ele pode ficar por cima de algo se você tiver um layout complexo).
Descobri que
vertical-align: sub
as caixas de seleção parecem boas o suficiente alinhadas no Chrome, Firefox e Opera. Não é possível verificar o Safari, pois não tenho o MacOS e o IE10 está um pouco desligado, mas achei que era uma solução boa o suficiente para mim.Outra solução pode ser tentar criar CSS específico para cada navegador e ajustá-lo com algum alinhamento vertical em% / pixels / EMs: http://css-tricks.com/snippets/css/browser-specific-hacks/
fonte
Isto funciona bem para mim:
fonte
A resposta escolhida com mais de 400 upvotes não funcionou para mim no Chrome 28 OSX, provavelmente porque não foi testada no OSX ou porque funcionou no que havia em 2008 quando a pergunta foi respondida.
Os tempos mudaram e novas soluções CSS3 agora são viáveis. Minha solução usa pseudoelementos para criar uma caixa de seleção personalizada . Portanto, as estipulações (prós ou contras, por mais que você as veja) são as seguintes:
Esta solução oculta a caixa de seleção e adiciona e estiliza pseudoelementos ao rótulo para criar a caixa de seleção visível. Como o rótulo está vinculado à caixa de seleção oculta, o campo de entrada ainda será atualizado e o valor será enviado com o formulário.
E se você estiver interessado, aqui está minha opinião sobre os botões de opção: http://jsfiddle.net/DtKrV/2/
Espero que alguém ache isso útil!
fonte
Eu nunca tive um problema em fazer isso assim:
fonte
Se você usa o ASP.NET Web Forms , não precisa se preocupar com DIVs e outros elementos ou tamanhos fixos. Podemos alinhar o
<asp:CheckBoxList>
texto, definindofloat:left
o tipo de entrada CheckboxList em CSS.Verifique o seguinte código de exemplo:
Código .ASPX:
fonte
Se você estiver usando o Twitter Bootstrap, basta usar a
checkbox
classe no<label>
:fonte
Com uma caixa de seleção do tipo de entrada enrolada dentro da etiqueta e flutuada para a esquerda, da seguinte forma:
isso funcionou para mim:
Verifique se a altura do é idêntica à altura da linha do (nível do bloco).
fonte
Codifique a altura e a largura da caixa de seleção, remova seu preenchimento e torne sua altura mais as margens verticais iguais à altura da linha da etiqueta. Se o texto do rótulo estiver embutido, faça flutuar a caixa de seleção. Firefox, Chrome e IE7 + todos processam o seguinte exemplo de forma idêntica: http://www.kornea.com/css-checkbox-align
fonte
fonte
Normalmente, deixo uma caixa de seleção sem rótulo e, em seguida, faço do "rótulo" um elemento separado. É uma dor, mas há tanta diferença entre navegadores entre como as caixas de seleção e seus rótulos são exibidos (como você notou) que é a única maneira de chegar perto de controlar como tudo fica.
Também acabo fazendo isso no desenvolvimento de winforms, pelo mesmo motivo. Penso que o problema fundamental com o controle da caixa de seleção é que são realmente dois controles diferentes: a caixa e o rótulo. Ao usar uma caixa de seleção, você fica a cargo dos implementadores do controle para decidir como esses dois elementos são exibidos próximos um do outro (e eles sempre entendem errado, onde errado = não é o que você deseja).
Eu realmente espero que alguém tenha uma resposta melhor para sua pergunta.
fonte
CSS:
HTML:
O código acima colocará os itens da sua lista em três campos e apenas mudará as larguras para se adequarem.
fonte
A seguir, é apresentada uma consistência perfeita em pixels nos navegadores, mesmo no IE9:
A abordagem é bastante sensata, a ponto de ser óbvia:
Isso resulta em uma regra geral aplicável globalmente:
Com tamanho de fonte adaptável por formulário, conjunto de campos ou elemento.
Testado no Chrome, Safari e Firefox mais recente no Mac, Windows, Iphone e Android. E IE9.
Esse método provavelmente é aplicável a todos os tipos de entrada que não são maiores que uma linha de texto. Aplique uma regra de tipo para se adequar.
fonte
Portanto, sei que isso já foi respondido várias vezes, mas sinto que tenho uma solução muito mais elegante do que as que já foram fornecidas. E não apenas uma solução elegante, mas duas soluções separadas para agradar sua fantasia. Com isso dito, tudo o que você precisa saber e ver está contido em 2 JS Fiddle's, com comentários.
A solução 1 baseia-se na "caixa de seleção" nativa do navegador fornecido, embora com um toque ... Está contida em uma div que é mais fácil de posicionar no navegador cruzado, com um estouro: oculto para cortar o excesso de uma caixa de seleção esticada de 1px (é assim que você não consegue ver as feias fronteiras do FF)
HTML simples: (siga o link para revisar o css com comentários, o bloco de código é para satisfazer o stackoverflow) http://jsfiddle.net/KQghJ/
A solução 2 usa o "Hack de alternância da caixa de seleção" para alternar o estado CSS de um DIV, que foi posicionado corretamente no navegador e configurado com um sprite simples para os estados desmarcados e verificados da caixa de seleção. Tudo o que é necessário é ajustar a posição de fundo com o referido Checkbox Toggle Hack. Esta, na minha opinião, é a solução mais elegante, pois você tem mais controle sobre suas caixas de seleção e rádios e pode garantir que eles tenham a mesma aparência no navegador.
HTML simples: (siga o link para revisar o CSS com comentários, o bloco de código é para satisfazer o StackOverflow) http://jsfiddle.net/Sx5M2/
Se alguém discordar desses métodos, deixe-me um comentário. Gostaria de ouvir alguns comentários sobre por que outras pessoas não se deparam com essas soluções ou, se o fazem, por que não vejo respostas aqui sobre elas? Se alguém vir um desses métodos falhar, seria bom ver isso também, mas eles foram testados nos navegadores mais recentes e dependem de métodos HTML / CSS bastante antigos e universais até onde eu vi.
fonte
Yay obrigado! Isso também tem me deixado louco para sempre.
No meu caso particular, isso funcionou para mim:
Estou usando o reset.css que pode explicar algumas das diferenças, mas isso parece funcionar bem para mim.
fonte
position: relative;
tem alguns problemas no IE com z-index e animações como o slideUp / slideDown do jQuery.CSS:
jQuery:
O estilo provavelmente precisa de ajustes, dependendo do tamanho da fonte usada no
<label>
PS:
Eu uso o ie7js para fazer o css funcionar no IE6.
fonte
Use de forma simples
vertical-align: sub
, como pokrishka já sugeriu.Violino
Código HTML:
Código CSS:
fonte
Solução simples:
Testado no Chrome, Firefox, IE9 +, Safari, iOS 9 ou superior
fonte