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 :checked
seletor 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.