CSS3: pseudoclasse não verificada


108

Eu sei que existe uma pseudoclasse CSS3 oficial :checked, mas existe uma :uncheckedpseudoclasse e elas têm o mesmo suporte para navegador?

A referência do Sitepoint não menciona nenhum, no entanto, esta especificação whatwg (seja lá o que for) faz.

Eu sei que o mesmo resultado pode ser alcançado quando os :checkede :not()pseudo-classes são combinados, mas eu ainda estou curioso:

input[type="checkbox"]:not(:checked) {
    /* styles */
}

Editar:

O w3c recomenda a mesma técnica

Uma caixa de seleção desmarcada pode ser selecionada usando a pseudoclasse de negação:

:not(:checked)

Respostas:


104

:unchecked não está definido nos Seletores ou nas especificações da IU de CSS de nível 3, nem apareceu no nível 4 dos Seletores.

Na verdade, a citação do W3C foi retirada das especificações do Seletor 4 . Como o Seletor 4 recomenda o uso :not(:checked), é seguro presumir que não há um :uncheckedpseudo correspondente . O suporte do navegador para :not()e :checkedé idêntico, então isso não deve ser um problema.

Isto pode parecer inconsistente com o :enablede :disabledestados, especialmente desde que um elemento pode ser nem habilitado nem desativado (ou seja, a semântica completamente não se aplicam), no entanto não parece haver qualquer explicação para esta inconsistência.

( :indeterminatenão conta, porque um elemento não pode ser desmarcado, verificado nem indeterminado porque a semântica não se aplica)


Apenas para acrescentar a esta resposta que selecionar: não (: verificado) funciona perfeitamente no Chrome, mas não no IE (testado em 9 e 11).
Bruno Finger de

@Bruno Finger:: verificado e: não (: verificado) devem funcionar no IE, exceto que ambos são igualmente afetados por um bug em que a alteração do status verificado não atualiza os estilos dos elementos sendo direcionados em relação ao verificado / desmarcado elemento.
BoltClock

35

Acho que você está tentando complicar as coisas. Uma solução simples é estilizar sua caixa de seleção por padrão com os estilos desmarcados e, em seguida, adicionar os estilos de estado marcados.

input[type="checkbox"] {
  // Unchecked Styles
}
input[type="checkbox"]:checked {
  // Checked Styles
}

Peço desculpas por trazer um tópico antigo, mas senti que poderia ter usado uma resposta melhor.

EDITAR (03/03/2016):

As especificações do W3C afirmam isso :not(:checked)como exemplo para selecionar o estado não verificado. No entanto, este é explicitamente o estado não verificado e só aplicará esses estilos ao estado não verificado. Isso é útil para adicionar um estilo que só é necessário no estado desmarcado e precisaria ser removido do estado marcado se usado no input[type="checkbox"]seletor. Veja o exemplo abaixo para esclarecimentos.

input[type="checkbox"] {
  /* Base Styles aka unchecked */
  font-weight: 300; // Will be overwritten by :checked
  font-size: 16px; // Base styling
}
input[type="checkbox"]:not(:checked) {
  /* Explicit Unchecked Styles */
  border: 1px solid #FF0000; // Only apply border to unchecked state
}
input[type="checkbox"]:checked {
  /* Checked Styles */
  font-weight: 900; // Use a bold font when checked
}

Sem usar :not(:checked)no exemplo acima, o :checkedseletor teria que usar um border: none;para obter o mesmo efeito.

Use o input[type="checkbox"]para o estilo de base para reduzir a duplicação.

Use input[type="checkbox"]:not(:checked)para estilos desmarcados explícitos que você não deseja aplicar ao estado marcado.


Existem outros usos de seletores de css onde é útil / expressivo: javascript, teste automatizado de navegador
nruth

2
Isso nem sempre é possível. Os elementos do formulário em particular são notórios por não permitirem que você os reverta para sua aparência padrão por meio de regras em cascata. (Embora por que alguém iria querer dar apenas entradas marcadas ou não verificadas uma aparência personalizada enquanto deixava a outra casa de moeda está além de mim.)
BoltClock

Outro caso em que isso não é possível: Mais de 2 botões de opção. Por exemplo, você pode querer um estilo quando a opção nº 1 estiver: marcada e outro quando qualquer outra coisa estiver: marcada. A solução é:not(:checked)
Navin

Se você estava querendo apenas que querem aqueles específicos de estilo, por que não usar um :first-child, :last-childou :nth-childseletor em combinação com :checked. :not(:checked)não cobrirá a situação que você especificou, a menos que eu esteja interpretando mal seu comentário.
Michael Stramel

@MichaelStramel colocando a ordem dos htmls no css? não, obrigado
inetphantom

3

Não há pseudoclasse: desmarcada, entretanto, se você usar a pseudoclasse: check e o seletor irmão, poderá diferenciar os dois estados. Acredito que todos os navegadores mais recentes suportam a: pseudo classe marcada, você pode encontrar mais informações neste recurso: http://www.whatstyle.net/articles/18/pretty_form_controls_with_css

Você terá um melhor suporte ao navegador com jquery ... você pode usar uma função de clique para detectar quando o clique acontece e se está marcado ou não, então você pode adicionar uma classe ou remover uma classe conforme necessário ...


-2

A maneira como lidei com isso foi trocando o className de um rótulo com base em uma condição. Desta forma, você só precisa de uma etiqueta e pode ter diferentes classes para diferentes estados ... Espero que ajude!

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.