Estou tentando estilizar uma caixa de seleção usando o seguinte:
<input type="checkbox" style="border:2px dotted #00f;display:block;background:#ff0000;" />
Mas o estilo não é aplicado. A caixa de seleção ainda exibe seu estilo padrão. Como atribuo o estilo especificado?
Respostas:
ATUALIZAR:
A resposta abaixo faz referência ao estado anterior à ampla disponibilidade do CSS 3. Nos navegadores modernos (incluindo o Internet Explorer 9 e posterior), é mais simples criar substituições de caixas de seleção com seu estilo preferido, sem usar JavaScript.
Aqui estão alguns links úteis:
Vale ressaltar que a questão fundamental não mudou. Você ainda não pode aplicar estilos (bordas, etc.) diretamente ao elemento da caixa de seleção e esses estilos afetam a exibição da caixa de seleção HTML. O que mudou, no entanto, é que agora é possível ocultar a caixa de seleção real e substituí-la por um elemento com estilo próprio, usando nada além de CSS. Em particular, como o CSS agora possui um
:checked
seletor amplamente suportado , você pode fazer a sua substituição refletir corretamente o status verificado da caixa.RESPOSTA ANTIGA
Aqui está um artigo útil sobre caixas de seleção de estilo . Basicamente, esse escritor descobriu que ela varia enormemente de navegador para navegador, e que muitos navegadores sempre exibem a caixa de seleção padrão, não importa como você a estilize. Portanto, não há realmente uma maneira fácil.
Não é difícil imaginar uma solução alternativa em que você usaria o JavaScript para sobrepor uma imagem na caixa de seleção e ter cliques nessa imagem para fazer com que a caixa de seleção real seja marcada. Usuários sem JavaScript veriam a caixa de seleção padrão.
Editado para adicionar: aqui está um bom script que faz isso por você ; oculta o elemento real da caixa de seleção, substitui-o por uma extensão estilizada e redireciona os eventos de clique.
fonte
Existe uma maneira de fazer isso usando apenas CSS. Podemos (ab) usar o
label
elemento e estilizar esse elemento. A ressalva é que isso não funcionará para o Internet Explorer 8 e versões inferiores.fonte
input
nunca tenham o foco do teclado, portanto eles são inacessíveis pelo teclado.Você pode obter um efeito de caixa de seleção personalizado bastante bacana usando as novas habilidades que acompanham as classes
:after
e:before
pseudo. A vantagem disso é: você não precisa adicionar mais nada ao DOM, apenas a caixa de seleção padrão.Observe que isso funcionará apenas para navegadores compatíveis. Acredito que isso esteja relacionado ao fato de que alguns navegadores não permitem definir
:after
e:before
inserir elementos de entrada. Infelizmente, no momento, apenas os navegadores WebKit são suportados. O Firefox + Internet Explorer ainda permitirá que as caixas de seleção funcionem, sem estilo, e isso provavelmente mudará no futuro (o código não usa prefixos de fornecedor).Esta é apenas uma solução de navegador WebKit (navegadores Chrome, Safari, Mobile)
Veja o exemplo Violino
Violão de flipswitch estilo Webkit bônus
fonte
Antes de começar (em janeiro de 2015)
A pergunta e resposta originais agora têm ~ 5 anos. Como tal, isso é um pouco de atualização.
Em primeiro lugar, existem várias abordagens quando se trata de caixas de seleção de estilo. o princípio básico é:
Você precisará ocultar o controle da caixa de seleção padrão, estilizado pelo seu navegador, e não pode ser substituído de maneira significativa usando CSS.
Com o controle oculto, você ainda precisará detectar e alternar seu estado verificado
O estado marcado da caixa de seleção precisará ser refletido com o estilo de um novo elemento
A solução (em princípio)
O que foi dito acima pode ser realizado de várias maneiras - e você freqüentemente ouvirá que usar pseudoelementos CSS3 é o caminho certo. Na verdade, não existe um caminho real certo ou errado, depende da abordagem mais adequada ao contexto em que você o usará. Dito isso, eu tenho um preferido.
Quebra sua caixa de seleção em um
label
elemento. Isso significa que, mesmo quando está oculto, você ainda pode alternar seu estado verificado ao clicar em qualquer lugar do rótulo.Ocultar sua caixa de seleção
Adicione um novo elemento após a caixa de seleção que você estilizará de acordo. Ele deve aparecer após a caixa de seleção para poder ser selecionado usando CSS e com estilo dependendo do
:checked
estado. O CSS não pode selecionar 'para trás'.A solução (no código)
Mostrar snippet de código
Refinamento (usando ícones)
Mas ei! Eu ouço você gritar. E se eu quiser mostrar um belo carrapato ou cruz na caixa? E não quero usar imagens de fundo!
Bem, é aqui que os pseudoelementos do CSS3 podem entrar em jogo. Eles suportam a
content
propriedade que permite injetar ícones Unicode representando ambos os estados. Como alternativa, você pode usar uma fonte de ícone de fonte de terceiros, como a fonte awesome (embora certifique-se de definir também o relevantefont-family
, por exemplo, paraFontAwesome
)fonte
display: none
.visibility: hidden;
poropacity: 0 !important;
se você ainda estiver tendo problemas com a tabulação.Eu seguiria o conselho da resposta do SW4 - para ocultar a caixa de seleção e cobri-la com uma extensão personalizada, sugerindo este HTML:
A etiqueta de quebra automática permite clicar no texto sem a necessidade de vincular o atributo "for-id". Contudo,
Não esconda usando
visibility: hidden
oudisplay: none
Funciona clicando ou tocando, mas é uma maneira esfarrapada de usar caixas de seleção. Algumas pessoas ainda usam muito mais eficaz Tabpara mover o foco, Spaceativar e se esconder com esse método o desabilita. Se o formulário for longo, um salvará os pulsos de alguém para uso
tabindex
ouaccesskey
atributos. E se você observar o comportamento da caixa de seleção do sistema, haverá uma sombra decente ao passar o mouse. A caixa de seleção bem estilizada deve seguir esse comportamento.A resposta da cobberboy recomenda Font Awesome, que geralmente é melhor que bitmap, pois as fontes são vetores escalonáveis. Trabalhando com o HTML acima, sugiro estas regras CSS:
Ocultar caixas de seleção
Uso apenas negativo,
z-index
pois meu exemplo usa uma caixa de seleção grande o suficiente para cobri-la completamente. Eu não recomendo,left: -999px
pois não é reutilizável em todos os layouts. A resposta de Bushan wagh fornece uma maneira à prova de balas para ocultá-lo e convencer o navegador a usar tabindex, por isso é uma boa alternativa. Enfim, ambos são apenas um hack. A maneira correta hoje éappearance: none
, veja a resposta de Joost :Rótulo da caixa de seleção Estilo
Adicionar skin da caixa de seleção
\00f096
é o Font Awesomesquare-o
, o preenchimento é ajustado para fornecer um contorno pontilhado no foco (veja abaixo).Adicionar skin marcado na caixa de seleção
\00f046
é o Font Awesomecheck-square-o
, que não tem a mesma largura quesquare-o
, e é o motivo do estilo de largura acima.Adicionar esboço de foco
O Safari não fornece esse recurso (consulte o comentário de @Jason Sankey), você deve
window.navigator
detectar o navegador e ignorá-lo, se for o Safari.Caixa de seleção Definir cor cinza para desativado
Defina sombra suspensa na caixa de seleção não desativada
Demo Fiddle
Tente passar o mouse sobre as caixas de seleção e use Tabe Shift+ Tabpara mover e Spacealternar.
fonte
Você pode estilizar caixas de seleção com um pouco de truque usando o
label
elemento abaixo:E um FIDDLE para o código acima. Observe que alguns CSS não funcionam em versões mais antigas de navegadores, mas tenho certeza de que existem alguns exemplos de JavaScript sofisticados por aí!
fonte
Solução simples de implementar e facilmente personalizável
Depois de muitas pesquisas e testes, obtive esta solução que é simples de implementar e mais fácil de personalizar. Nesta solução :
Simplesmente coloque o CSS corrido no topo da sua página e todo o estilo das caixas de seleção mudará assim:
fonte
Você pode evitar adicionar marcações extras. Isso funciona em qualquer lugar, exceto no IE for Desktop (mas funciona no IE para Windows Phone e Microsoft Edge) através da configuração de CSS
appearance
:fonte
Prefiro usar fontes de ícone (como FontAwesome), pois é fácil modificar suas cores com CSS, e elas são muito bem dimensionadas em dispositivos de alta densidade de pixels. Então, aqui está outra variante CSS pura, usando técnicas semelhantes às acima.
(Abaixo está uma imagem estática para que você possa visualizar o resultado; consulte o JSFiddle para obter uma versão interativa.)
Como em outras soluções, ele usa o
label
elemento Um adjacentespan
contém nosso caractere de caixa de seleção.Aqui está o JSFiddle para isso.
fonte
font-family: FontAwesome;
comfont-family: 'Font Awesome\ 5 Free';
, e atualizar o conteúdo unicode se você quiser fazê-lo funcionar na nova versão.Recentemente eu encontrei uma solução bastante interessante para o problema.
Você pode usar
appearance: none;
para desativar o estilo padrão da caixa de seleção e depois escrever seu próprio estilo, como descrito aqui (Exemplo 4) .Violino de exemplo
Mostrar snippet de código
Infelizmente, o suporte ao navegador é bastante ruim para a
appearance
opção. Nos meus testes pessoais, apenas consegui o Opera e o Chrome funcionando corretamente. Mas esse seria o caminho a seguir para simplificá-lo quando houver melhor suporte ou você desejar apenas usar o Chrome / Opera."Eu posso usar?" ligação
fonte
appearance
é exatamente o que precisamos para isso; apenas lembre-se de que "não é padrão e não está no caminho certo" .Com CSS puro, nada sofisticado
:before
e:after
sem transformações, você pode desativar a aparência padrão e depois estilizá-la com uma imagem de plano de fundo embutida, como no exemplo a seguir. Isso funciona no Chrome, Firefox, Safari e agora Edge (Chromium Edge).fonte
Minha solução
fonte
Você pode simplesmente usar
appearance: none
em navegadores modernos, para que não haja estilo padrão e todos os seus estilos sejam aplicados corretamente:fonte
Deseja JavaScript, bibliotecas externas, conformidade com acessibilidade e caixas de seleção e botões de opção?
Tenho vindo a rolagem e rolagem e toneladas destas respostas simplesmente jogar a acessibilidade fora da porta e violar WCAG em mais de uma maneira. Eu instalei botões de opção, pois na maioria das vezes, quando você usa caixas de seleção personalizadas, também deseja botões de opção.
Fiddles :
Tarde para a festa, mas de alguma forma isso ainda é difícil em
20192020, por isso adicionei minhas três soluções que são acessíveis e fáceis de usar .Tudo isso é livre de JavaScript , livre de bibliotecas externas * e acessível ...
Se você quiser plug-n-play com qualquer um deles, basta copiar a folha de estilos dos violinos, edite os códigos de cores no CSS para atender às suas necessidades e siga seu caminho. Você pode adicionar um ícone de marca de seleção svg personalizado se desejar para as caixas de seleção. Eu adicionei muitos comentários para aqueles que não são CSS'y.
Se você tiver texto longo ou um contêiner pequeno e encontrar quebra automática de texto embaixo da caixa de seleção ou da entrada do botão de opção, basta converter em divs como este .
Explicação mais longa: eu precisava de uma solução que não viole o WCAG, não confie em JavaScript ou em bibliotecas externas, e que não interrompa a navegação do teclado, como tabulação ou barra de espaço para selecionar, que permita eventos de foco, uma solução que permita caixas de seleção desabilitadas que estão marcadas e desmarcadas e, finalmente, uma solução onde eu posso personalizar a aparência da caixa de seleção no entanto eu quero com diferente
background-color
's,border-radius
,svg
fundos, etc.Usei alguma combinação desta resposta de @Jan Turoň para criar minha própria solução, que parece funcionar muito bem. Eu fiz um violino de botão de opção que usa muito do mesmo código nas caixas de seleção para fazer isso funcionar também com os botões de opção.
Ainda estou aprendendo a acessibilidade, por isso, se eu perdi alguma coisa, envie um comentário e tentarei corrigi-lo. Aqui está um exemplo de código das minhas caixas de seleção:
fonte
Aqui está uma solução CSS simples, sem qualquer código jQuery ou JavaScript.
Estou usando ícones FontAwseome, mas você pode usar qualquer imagem
fonte
label
ou adicionaisspan
. Isso simplesmente funciona!No meu blog, essa é a maneira mais fácil de estilizar as caixas de seleção. Basta adicionar
:after
e:checked:after
CSS com base no seu design.fonte
Modifique o estilo da caixa de seleção com CSS3 simples, sem necessidade de manipulação de JS e HTML.
fonte
Um modelo simples e leve também:
https://jsfiddle.net/rvgccn5b/
fonte
input
s são suportados apenas no Chrome, seu código não funciona da mesma maneira em todos os navegadores.Acho que a maneira mais fácil de fazer isso é estilizar
label
e tornar ocheckbox
invisível.HTML
CSS
O
checkbox
mesmo estando oculto, ainda estará acessível e seu valor será enviado quando um formulário for enviado. Para navegadores antigos que você pode ter que mudar a classe dolabel
que verificado usando JavaScript, porque eu não acho que as versões antigas do Internet Explorer entender::checked
sobre acheckbox
.fonte
::checked
está errado - deveria estar:checked
. (b)checkbox
está errado - deveria estar[type=checkbox]
Caramba! Todas essas soluções alternativas me levaram à conclusão de que a caixa de seleção HTML é uma porcaria se você quiser estilizá-la.
Como aviso prévio, essa não é uma implementação de CSS. Eu apenas pensei em compartilhar a solução alternativa que encontrei, caso alguém ache útil.
Eu usei o
canvas
elemento HTML5 .A vantagem disso é que você não precisa usar imagens externas e provavelmente pode economizar largura de banda.
A desvantagem é que, se por algum motivo um navegador não puder renderizá-lo corretamente, não haverá substituto. Embora seja discutível se isso continua sendo um problema em 2017.
Atualizar
Achei o código antigo muito feio, então decidi reescrevê-lo.
Aqui está uma demonstração de trabalho .
A nova versão usa protótipos e herança diferencial para criar um sistema eficiente para a criação de caixas de seleção. Para criar uma caixa de seleção:
Isso adicionará imediatamente a caixa de seleção ao DOM e conectará os eventos. Para consultar se uma caixa de seleção está marcada:
Também é importante notar que eu me livrei do loop.
Atualização 2
Algo que eu esqueci de mencionar na última atualização é que o uso da tela tem mais vantagens do que apenas fazer uma caixa de seleção com a aparência que você deseja. Você também pode criar caixas de seleção de vários estados , se desejar.
Modifiquei um pouco o
Checkbox
usado no último trecho para torná-lo mais genérico, possibilitando "estendê-lo" com uma caixa de seleção que possui 3 estados. Aqui está uma demonstração . Como você pode ver, ele já possui mais funcionalidades do que a caixa de seleção incorporada.Algo a considerar ao escolher entre JavaScript e CSS.
Código antigo mal projetado
Demonstração de trabalho
Primeiro, configure uma tela
Em seguida, crie uma maneira de atualizar a tela.
A última parte é torná-lo interativo. Felizmente, é bem simples:
É aqui que você pode ter problemas no IE, devido ao modelo estranho de manipulação de eventos em JavaScript.
Espero que isso ajude alguém; definitivamente atendeu às minhas necessidades.
fonte
unchecked (e.g. unchecked -> checked -> "kinda" checked -> unchecked
, os estados podem representar "explícito falso", "explícito verdadeiro", "usar padrão", por exemplo). Estou pensando em adicionar um exemplo à resposta.Essa é a maneira mais simples e você pode escolher quais caixas de seleção dar esse estilo.
CSS:
HTML:
fonte
Mude o estilo da caixa de seleção de maneira simples.
Aqui está o link JsFiddle
fonte
Aqui está uma versão somente CSS / HTML, sem necessidade de jQuery ou JavaScript, HTML simples e limpo e CSS realmente simples e curto.
Aqui está o JSFiddle
http://jsfiddle.net/v71kn3pr/
Aqui está o HTML:
Aqui está o CSS
Isso pode ser adaptado para ter caixas de seleção ou opção de rádio, grupos de caixas de seleção e grupos de botões de opção.
Esse html / css permitirá que você capture também o clique no rótulo, para que a caixa de seleção seja marcada e desmarcada, mesmo se você clicar apenas no rótulo.
Este tipo de caixa de seleção / botão de opção funciona perfeitamente com qualquer forma, sem nenhum problema. Também foram testados usando PHP, ASP.NET (.aspx), JavaServer Faces e ColdFusion .
fonte
fonte
fonte
Não, você ainda não pode estilizar a caixa de seleção em si, mas (finalmente) descobri como estilizar uma ilusão, mantendo a funcionalidade de clicar em uma caixa de seleção. Isso significa que você pode alterná-lo mesmo que o cursor não esteja perfeitamente imóvel sem arriscar selecionar texto ou acionar o recurso de arrastar e soltar!
Essa solução provavelmente também se encaixa em botões de opção.
O seguinte funciona no Internet Explorer 9, Firefox 30.0 e Chrome 40.0.2214.91 e é apenas um exemplo básico. Você ainda pode usá-lo em combinação com imagens de fundo e pseudoelementos.
http://jsfiddle.net/o0xo13yL/1/
fonte
Como navegadores como Edge e Firefox não suportam: before: after nas tags de entrada da caixa de seleção, aqui está uma alternativa puramente com HTML e CSS. Claro que você deve editar o CSS de acordo com seus requisitos.
Faça o HTML para a caixa de seleção assim:
Aplique este estilo à caixa de seleção para alterar o rótulo da cor
fonte
Parece que você pode alterar a cor da caixa de seleção em escala de cinza usando apenas CSS.
O seguinte converte as caixas de seleção de preto para cinza (que era exatamente o que eu queria):
fonte
Implementação SCSS / SASS
Uma abordagem mais moderna
Para aqueles que usam SCSS (ou facilmente convertidos em SASS), o seguinte será útil. Efetivamente, crie um elemento ao lado da caixa de seleção, que você estilizará. Quando a caixa de seleção é clicada, o CSS altera o estilo do elemento irmão (para o seu novo estilo verificado). O código está abaixo:
fonte
Aviso : o seguinte era verdade no momento da redação, mas, enquanto isso, as coisas progrediram.
Os navegadores modernos do AFAIK exibem caixas de seleção usando o controle nativo do SO, portanto não há como estilizá-las.
fonte