Me gustaría tener una alternativa a una casilla de verificación estándar, básicamente me gustaría usar imágenes y cuando el usuario hace clic en la imagen, la desvanece y superpone una casilla de verificación.
En esencia, quiero hacer algo como lo hace Recaptcha 2 cuando hace que hagas clic en imágenes que cumplen con ciertos criterios. Puede ver una demostración de Recaptcha aquí, pero a veces puede hacer que resuelva preguntas de texto, en lugar de la selección de imágenes. Así que aquí hay una captura de pantalla:
Cuando hace clic en una de las imágenes (en este caso, que contiene una imagen de filete), la imagen en la que hace clic se reduce de tamaño y aparece la marca azul, lo que indica que la ha marcado.
Digamos que quiero reproducir este ejemplo exacto.
Me doy cuenta de que puedo tener 9 casillas de verificación ocultas y adjunto algunos jQuery para que cuando haga clic en la imagen, seleccione / deseleccione la casilla de verificación oculta. Pero, ¿qué pasa con la reducción de la imagen / superposición de la marca?
fuente
:before
magia para la imagen de marca?Respuestas:
Solución semántica pura de HTML / CSS
Esto es fácil de implementar por su cuenta, no se necesita una solución prefabricada. También te enseñará mucho, ya que no pareces demasiado fácil con CSS.
Esto es lo que necesitas hacer:
Sus casillas de verificación deben tener
id
atributos distintos . Esto le permite conectar un<label>
a, utilizando elfor
atributo de la etiqueta .Ejemplo:
Al adjuntar la etiqueta a la casilla de verificación, se activará el comportamiento del navegador: cada vez que alguien haga clic en la etiqueta (o en la imagen que contiene), se activará la casilla de verificación.
A continuación, oculta la casilla de verificación aplicándola, por ejemplo
display: none;
.Ahora todo lo que queda por hacer es establecer el estilo que desea para su
label::before
pseudo elemento (que se utilizará como elementos de reemplazo de la casilla de verificación visual):En un último paso complicado, utiliza el
:checked
pseudo selector de CSS para cambiar la imagen cuando la casilla de verificación está marcada:El
+
( selector de hermanos adyacentes ) se asegura de que solo cambie las etiquetas que siguen directamente a la casilla de verificación oculta en el marcado.Puede optimizar eso colocando ambas imágenes en un mapa de sprites y solo aplicando un cambio en
background-position
lugar de intercambiar la imagen.Por supuesto, debe colocar la etiqueta correctamente y aplicar
display: block;
y configurar correctamentewidth
yheight
.Editar:
El ejemplo y el fragmento de código, que creé después de estas instrucciones, usan la misma técnica, pero en lugar de usar imágenes para las casillas de verificación, los reemplazos de las casillas de verificación se realizan únicamente con CSS , creando una
::before
etiqueta que, una vez marcada, tienecontent: "✓";
. Agregue algunos bordes redondeados y transiciones dulces y el resultado es realmente agradable.Aquí hay un código abierto que muestra la técnica y no requiere imágenes para la casilla de verificación:
Aquí está el mismo código en un fragmento:
fuente
:hover
:)Solución CSS pura
Se invocan tres dispositivos limpios:
:checked
selector::before
pseudo-selectorcontent
propiedad css .fuente
<input type="radio" name="myRadio" id="myRadio1" />
también cambia su CSS para ocultar la viñeta:input[type=radio]{display: none;}
Ver este plugin jQuery: imgCheckbox (en NPM y Bower )
Descargo de responsabilidad: no se necesita JavaScript para resolver este problema. La tensión está entre la mantenibilidad y la eficiencia del código. Si bien no es necesario un complemento (o ningún javascript), seguro que lo hace más rápido de construir y, a menudo, más fácil de cambiar.
Solución Barebones:
Con HTML muy simple (ninguno de los problemas con casillas de verificación y etiquetas, etc.):
Puede utilizar jQuery toggleClass para activar / desactivar una
selected
ochecked
clase en elclick
evento:Los elementos marcados se obtienen con
Más frescura:
Puede diseñar las imágenes basándose en esto, pero un gran problema es que sin otros elementos DOM ni siquiera puede usar
::before
y::after
agregar cosas como marcas de verificación. La solución es envolver sus imágenes con otro elemento (y también tiene sentido adjuntar el detector de clics al elemento envuelto).Esto deja su html realmente limpio y su js increíblemente legible. Echa un vistazo al fragmento ...
Mostrar fragmento de código
Usando el plugin imgCheckbox jQuery:
Inspirado por la solución anterior, he creado un complemento que se puede usar tan fácilmente como:
Véalo en acción (y vea la fuente )
fuente
Agregaría un div adicional con
position: relative;
yclass="checked"
que tiene el mismo ancho / alto que la imagen y que la posición queleft: 0; top: 0;
contiene el icono. Se inicia condisplay: none;
.Ahora puedes escuchar el
click
evento:De esta manera, puede obtener el icono y también cambiar el tamaño de la imagen a una forma más pequeña.
Aviso: Solo quería mostrarle la "lógica" detrás de mis pensamientos, este ejemplo podría no funcionar o tiene algunos errores.
fuente
He notado que otras respuestas no usan
<label>
(¿por qué no?), O requieren coincidenciasfor
yid
atributos. Esto significa que si tiene identificaciones en conflicto, su código no funcionará y debe recordar hacer identificaciones únicas cada vez.Además, si oculta
input
condisplay:none
ovisibility:hidden
, el navegador no se centrará en él.Una casilla de verificación y su texto (o en este caso, imagen) se pueden envolver en una etiqueta:
fuente
Aquí un ejemplo rápido de seleccionar una imagen como una casilla de verificación
Ejemplo actualizado usando Knockout.js:
fuente
Para ampliar la respuesta aceptada para cualquier persona que use WordPress y GravityForms para generar sus formularios y desee rellenar automáticamente los campos de casilla de verificación con una lista de publicaciones y su Miniatura destacada asociada
Y el CSS:
fuente