Eu gostaria de ter uma alternativa a uma caixa de seleção padrão - basicamente eu gostaria de usar imagens e, quando o usuário clicar na imagem, esmaecer e sobrepor uma caixa de seleção.
Em essência, quero fazer algo como o Recaptcha 2 faz quando você clica nas imagens que atendem a um determinado critério. Você pode ver uma demonstração do Recaptcha aqui, mas às vezes você pode resolver questões de texto, em oposição à seleção de imagens. Então, aqui está uma captura de tela:
Quando você clica em uma das imagens (nesse caso, contendo uma foto de bife), a imagem em que você clica diminui de tamanho e o tique azul aparece, indicando que você o marcou.
Digamos que eu queira reproduzir este exemplo exato.
Sei que posso ter 9 caixas de seleção ocultas e anexar alguns jQuery para que, quando clico na imagem, ela marque / desmarque a caixa de seleção oculta. Mas e quanto à redução da imagem / sobreposição do tiquetaque?
fonte
:before
mágica para a imagem do tick?Respostas:
Solução HTML / CSS semântica pura
É fácil de implementar por conta própria, não é necessária uma solução pré-fabricada. Também lhe ensinará muito, pois você não parece muito fácil com CSS.
Isso é o que você precisa fazer:
Suas caixas de seleção precisam ter
id
atributos distintos . Isso permite conectar um<label>
a ele, usando ofor
atributo- label .Exemplo:
Anexar o rótulo à caixa de seleção acionará o comportamento do navegador: sempre que alguém clicar no rótulo (ou na imagem dentro dele), a caixa de seleção será alternada.
Em seguida, oculte a caixa de seleção aplicando, por exemplo,
display: none;
a ela.Agora, basta definir o estilo desejado para o seu
label::before
pseudo elemento (que será usado como elemento de substituição visual da caixa de seleção):Em uma última etapa complicada, você usa o
:checked
pseudo-seletor do CSS para alterar a imagem quando a caixa de seleção está marcada:O
+
( seletor de irmão adjacente ) garante que você altere apenas os rótulos que seguem diretamente a caixa de seleção oculta na marcação.Você pode otimizar isso colocando as duas imagens em um spritemap e aplicando apenas uma alteração em
background-position
vez de trocar a imagem.Obviamente, você precisa posicionar o rótulo corretamente, aplicar
display: block;
e definir o corretowidth
eheight
.Editar:
O exemplo e o snippet do codepen, que criei após essas instruções, usam a mesma técnica, mas , em vez de usar imagens para as caixas de seleção, as substituições das caixas de seleção são feitas exclusivamente com CSS , criando um
::before
no rótulo que, uma vez marcado, possuicontent: "✓";
. Adicione algumas bordas arredondadas e transições doces e o resultado é realmente agradável!Aqui está um código de trabalho que mostra a técnica e não requer imagens para a caixa de seleção:
Aqui está o mesmo código em um trecho:
fonte
:hover
:)Solução CSS pura
Existem três dispositivos puros invocados:
:checked
seletor::before
pseudo-seletorcontent
propriedade css .fonte
<input type="radio" name="myRadio" id="myRadio1" />
também altera seu css para ocultar a bala:input[type=radio]{display: none;}
Veja este plugin jQuery: imgCheckbox (em npm e bower )
Isenção de responsabilidade: Não é necessário javascript para resolver este problema. A tensão está entre a manutenção e a eficiência do código. Embora não seja necessário um plug-in (ou qualquer javascript), ele certamente torna mais rápido a criação e muitas vezes mais fácil a alteração.
Solução Barebones:
Com HTML muito simples (nada de bagunça com caixas de seleção, rótulos etc.):
Você pode usar jQuery toggleClass para ligar / desligar um
selected
ouchecked
classe noclick
evento:Os itens marcados são buscados com
Mais Frieza:
Você pode estilizar as imagens com base nisso, mas um grande problema é que, sem outros elementos DOM, você não pode nem usar
::before
e::after
adicionar itens como marcas de seleção. A solução é agrupar suas imagens com outro elemento (e faz sentido anexar o ouvinte de clique ao elemento agrupado).Isso deixa seu html realmente limpo e seu js incrivelmente legível. Dê uma olhada no trecho ...
Mostrar snippet de código
Usando o plug-in jQuery imgCheckbox :
Inspirado na solução acima, criei um plugin que pode ser usado tão facilmente quanto:
Veja em ação (e veja a fonte )
fonte
Eu acrescentaria uma div extra com
position: relative;
eclass="checked"
que tenha a mesma largura / altura da imagem e que a posição queleft: 0; top: 0;
contém o ícone. Começa comdisplay: none;
.Agora você pode ouvir o
click
-event:Dessa forma, você pode obter o ícone e também redimensionar a imagem para uma maneira menor.
Aviso: Só queria mostrar a "lógica" por trás dos meus pensamentos, este exemplo pode não funcionar ou tem alguns erros.
fonte
Percebi que outras respostas não usam
<label>
(por que não?) Ou exigem correspondênciafor
eid
atributos. Isso significa que, se você tiver IDs conflitantes, seu código não funcionará e lembre-se de criar IDs únicos a cada vez.Além disso, se você ocultar o
input
comdisplay:none
ouvisibility:hidden
, o navegador não focará nele.Uma caixa de seleção e seu texto (ou, neste caso, imagem) podem ser agrupados em um rótulo:
fonte
Aqui está um exemplo rápido de como selecionar uma imagem como uma caixa de seleção
Exemplo atualizado usando o Knockout.js:
fonte
Expandir a resposta aceita para quem usa WordPress e GravityForms para gerar seus formulários e deseja preencher automaticamente os campos das caixas de seleção com uma lista de postagens e a Miniatura em destaque associada
E o CSS:
fonte