Je voudrais avoir une alternative à une case à cocher standard - en gros, j'aimerais utiliser des images et lorsque l'utilisateur clique sur l'image, la fondre et superposer une case à cocher.
En gros, je veux faire quelque chose comme Recaptcha 2 quand il vous amène à cliquer sur des images qui répondent à certains critères. Vous pouvez voir une démo de Recaptcha ici, mais cela peut parfois vous amener à résoudre des questions de texte, par opposition à la sélection d'images. Voici donc une capture d'écran:
Lorsque vous cliquez sur l'une des images (dans ce cas, contenant une image de steak), la taille de l'image sur laquelle vous cliquez diminue et la coche bleue apparaît, indiquant que vous l'avez cochée.
Disons que je veux reproduire cet exemple exact.
Je me rends compte que je peux avoir 9 cases à cocher cachées et attacher du jQuery de sorte que lorsque je clique sur l'image, il sélectionne / désélectionne la case à cocher cachée. Mais qu'en est-il du rétrécissement de l'image / superposition de la tique?
la source
:before
magie pour l'image de tique?Réponses:
Solution HTML / CSS sémantique pure
Ceci est facile à mettre en œuvre par vous-même, aucune solution prédéfinie n'est nécessaire. De plus, cela vous apprendra beaucoup car vous ne semblez pas trop facile avec CSS.
Voici ce que vous devez faire:
Vos cases à cocher doivent avoir des
id
attributs distincts . Cela vous permet d'y connecter un<label>
, en utilisant l'for
attribut de l' étiquette.Exemple:
Le fait d'attacher l'étiquette à la case à cocher déclenchera un comportement du navigateur: chaque fois que quelqu'un cliquera sur l'étiquette (ou l'image à l'intérieur), la case à cocher sera activée.
Ensuite, vous masquez la case à cocher en y appliquant par exemple
display: none;
.Il ne vous reste plus qu'à définir le style que vous souhaitez pour votre
label::before
pseudo élément (qui sera utilisé comme élément de remplacement visuel de la case à cocher):Dans une dernière étape délicate, vous utilisez le
:checked
pseudo-sélecteur CSS pour changer l'image lorsque la case est cochée:Le
+
( sélecteur frère adjacent ) garantit que vous ne modifiez que les libellés qui suivent directement la case à cocher masquée dans le balisage.Vous pouvez optimiser cela en plaçant les deux images dans un spritemap et en n'appliquant qu'une modification au
background-position
lieu de permuter l'image.Bien sûr, vous devez positionner correctement l'étiquette et appliquer
display: block;
et régler correctementwidth
etheight
.Éditer:
L'exemple et l'extrait de code codepen, que j'ai créés après ces instructions, utilisent la même technique, mais au lieu d'utiliser des images pour les cases à cocher, les remplacements de cases à cocher se font uniquement avec CSS , créant un
::before
sur l'étiquette qui, une fois cochée, acontent: "✓";
. Ajoutez des bordures arrondies et des transitions douces et le résultat est vraiment sympathique!Voici un codepen fonctionnel qui présente la technique et ne nécessite pas d'images pour la case à cocher:
Voici le même code dans un extrait de code:
la source
:hover
:)Solution CSS pure
Il y a trois appareils invoqués:
:checked
sélecteur::before
pseudo-sélecteurcontent
propriété css .la source
<input type="radio" name="myRadio" id="myRadio1" />
change aussi ton css pour cacher la puce:input[type=radio]{display: none;}
Voir ce plugin jQuery: imgCheckbox (sur npm et bower )
Avertissement: aucun javascript n'est nécessaire pour résoudre ce problème. La tension est entre la maintenabilité et l'efficacité du code. Bien qu'il n'y ait pas besoin de plugin (ou de javascript), cela le rend certainement plus rapide à construire et souvent plus facile à changer.
Solution Barebones:
Avec du HTML très simple (pas de désordre avec les cases à cocher et les étiquettes, etc.):
Vous pouvez utiliser toggleClass de jQuery pour activer / désactiver une classe
selected
orchecked
sur l'click
événement:Les éléments cochés sont récupérés avec
Plus fraîcheur:
Vous pouvez styliser les images en fonction de cela, mais un gros problème est que sans autres éléments DOM, vous ne pouvez même pas utiliser
::before
et::after
ajouter des éléments tels que des coches. La solution consiste à envelopper vos images avec un autre élément (et il est logique d'attacher également l'écouteur de clic à l'élément enveloppé).Cela laisse votre html vraiment propre et votre js incroyablement lisible. Jetez un œil à l'extrait ...
Afficher l'extrait de code
Utilisation du plugin jQuery imgCheckbox :
Inspiré par la solution ci-dessus, j'ai construit un plugin qui peut être utilisé aussi facilement que:
Voyez-le en action (et voyez la source )
la source
Je voudrais ajouter un div supplémentaire avec
position: relative;
etclass="checked"
qui a la même largeur / hauteur que l'image a et que la position dansleft: 0; top: 0;
contenant l'icône. Cela commence pardisplay: none;
.Vous pouvez maintenant écouter l'
click
événement -event:De cette façon, vous pouvez obtenir l'icône et redimensionner l'image de manière plus petite.
Remarque: je voulais juste vous montrer la «logique» derrière mes pensées, cet exemple pourrait ne pas fonctionner ou contenir des bogues.
la source
J'ai remarqué que d'autres réponses ne sont pas utilisées
<label>
(pourquoi pas?), Ou nécessitent une correspondancefor
et desid
attributs. Cela signifie que si vous avez des ID en conflit, votre code ne fonctionnera pas et vous devez vous rappeler de créer des ID uniques à chaque fois.De plus, si vous masquez le
input
avecdisplay:none
ouvisibility:hidden
, le navigateur ne se concentrera pas dessus.Une case à cocher et son texte (ou dans ce cas, une image) peuvent être enveloppés dans une étiquette:
la source
Voici un exemple rapide de sélection d'une image comme une case à cocher
Exemple mis à jour avec Knockout.js:
la source
Pour développer la réponse acceptée pour tous ceux qui utilisent WordPress et GravityForms pour générer leurs formulaires et souhaitent renseigner automatiquement les champs de case à cocher avec une liste de publications et leur vignette en vedette associée
Et le CSS:
la source