Ich hätte gerne eine Alternative zu einem Standard-Kontrollkästchen - im Grunde möchte ich Bilder verwenden. Wenn der Benutzer auf das Bild klickt, wird es ausgeblendet und ein Kontrollkästchen überlagert.
Im Wesentlichen möchte ich etwas tun, wie es Recaptcha 2 tut, wenn Sie auf Bilder klicken, die bestimmte Kriterien erfüllen. Sie können hier eine Recaptcha-Demo sehen, aber manchmal können Sie Textfragen lösen, im Gegensatz zur Bildauswahl. Hier ist ein Screenshot:
Wenn Sie auf eines der Bilder klicken (in diesem Fall mit einem Bild von Steak), wird das Bild, auf das Sie klicken, kleiner und das blaue Häkchen zeigt an, dass Sie es angekreuzt haben.
Angenommen, ich möchte genau dieses Beispiel reproduzieren.
Mir ist klar, dass ich 9 versteckte Kontrollkästchen haben und jQuery anhängen kann, sodass beim Klicken auf das Bild das versteckte Kontrollkästchen aktiviert / deaktiviert wird. Aber was ist mit dem Verkleinern des Bildes / Überlagern der Zecke?
quelle
:before
Magie für das Häkchenbild bewirkt ?Antworten:
Reine semantische HTML / CSS-Lösung
Dies ist einfach selbst zu implementieren, es ist keine vorgefertigte Lösung erforderlich. Außerdem wird es Ihnen viel beibringen, da Sie mit CSS nicht allzu einfach zu sein scheinen.
Folgendes müssen Sie tun:
Ihre Kontrollkästchen müssen unterschiedliche
id
Attribute haben. Auf diese Weise können Sie eine Verbindung<label>
mit demfor
Attribut des Labels herstellen.Beispiel:
Das Anhängen des Etiketts an das Kontrollkästchen löst ein Browserverhalten aus: Immer wenn jemand auf das Etikett (oder das darin enthaltene Bild) klickt, wird das Kontrollkästchen umgeschaltet.
Als nächstes blenden Sie das Kontrollkästchen aus, indem Sie es beispielsweise anwenden
display: none;
.Jetzt müssen Sie nur noch den gewünschten Stil für Ihr
label::before
Pseudoelement festlegen (das als visuelles Ersatzelement für das Kontrollkästchen verwendet wird):In einem letzten kniffligen Schritt verwenden Sie den
:checked
Pseudo-Selektor von CSS, um das Bild zu ändern, wenn das Kontrollkästchen aktiviert ist:Die
+
( nebenstehende Geschwisterauswahl ) stellt sicher, dass Sie nur Beschriftungen ändern, die direkt auf das ausgeblendete Kontrollkästchen im Markup folgen.Sie können dies optimieren, indem Sie beide Bilder in eine Spritemap einfügen und nur eine Änderung vornehmen,
background-position
anstatt das Bild auszutauschen .Natürlich müssen Sie das Etikett korrekt positionieren und anzuwenden
display: block;
und richtig eingestelltwidth
undheight
.Bearbeiten:
Das Codepen-Beispiel und das Snippet, die ich nach diesen Anweisungen erstellt habe, verwenden dieselbe Technik, aber anstatt Bilder für die Kontrollkästchen zu verwenden, werden die Kontrollkästchen nur durch CSS ersetzt , wobei
::before
auf dem Etikett ein erstellt wird, das nach dem Aktivieren vorhanden istcontent: "✓";
. Fügen Sie einige abgerundete Ränder und süße Übergänge hinzu und das Ergebnis ist wirklich sympathisch!Hier ist ein funktionierender Codepen, der die Technik veranschaulicht und keine Bilder für das Kontrollkästchen benötigt:
Hier ist der gleiche Code in einem Snippet:
quelle
:hover
:) reagierenReine CSS-Lösung
Es werden drei nette Geräte aufgerufen:
:checked
Selektor::before
Pseudo-Selektorcontent
Eigenschaft.quelle
<input type="radio" name="myRadio" id="myRadio1" />
Ändern Sie auch Ihr CSS, um die Kugel zu verbergen:input[type=radio]{display: none;}
Siehe dieses jQuery-Plugin: imgCheckbox (auf npm und bower )
Haftungsausschluss: Zur Lösung dieses Problems ist kein Javascript erforderlich. Die Spannung liegt zwischen Wartbarkeit und Effizienz des Codes. Es ist zwar kein Plugin (oder Javascript) erforderlich, aber es macht es sicher schneller zu erstellen und oft einfacher zu ändern.
Barebones-Lösung:
Mit sehr einfachem HTML (keine Unordnung mit Kontrollkästchen und Beschriftungen usw.):
Mit der toggleClass von jQuery können Sie eine
selected
oder einechecked
Klasse für dasclick
Ereignis aktivieren / deaktivieren :Überprüfte Elemente werden mit abgerufen
Plus Coolness:
Sie können die Bilder basierend darauf formatieren, aber ein großes Problem ist, dass Sie ohne andere DOM-Elemente nicht einmal verwenden
::before
und::after
Dinge wie Häkchen hinzufügen können. Die Lösung besteht darin, Ihre Bilder mit einem anderen Element zu versehen (und es ist sinnvoll, den Klick-Listener auch an das umschlossene Element anzuhängen).Dies lässt Ihr HTML wirklich sauber und Ihr js unglaublich lesbar. Schauen Sie sich das Snippet an ...
Code-Snippet anzeigen
Verwenden des imgCheckbox jQuery Plugins :
Inspiriert von der obigen Lösung habe ich ein Plugin erstellt, das so einfach verwendet werden kann wie:
Sehen Sie es in Aktion (und sehen Sie die Quelle )
quelle
Ich würde eine zusätzliche div anhängen mit
position: relative;
undclass="checked"
die die gleiche Breite / Höhe hat wie die Bildposition hat und als inleft: 0; top: 0;
das Symbol enthält. Es beginnt mitdisplay: none;
.Jetzt können Sie das
click
Ereignis hören:Auf diese Weise können Sie das Symbol erhalten und die Bildgröße auf eine kleinere Größe ändern.
Hinweis: Ich wollte Ihnen nur die "Logik" hinter meinen Gedanken zeigen. Dieses Beispiel funktioniert möglicherweise nicht oder enthält einige Fehler.
quelle
Ich habe festgestellt, dass andere Antworten entweder nicht verwendet werden
<label>
(warum nicht?) Oder Übereinstimmungenfor
undid
Attribute erfordern . Dies bedeutet, dass Ihr Code nicht funktioniert, wenn Sie nicht übereinstimmende IDs haben, und Sie müssen daran denken, jedes Mal eindeutige IDs zu erstellen.Wenn Sie das
input
mitdisplay:none
oder ausblendenvisibility:hidden
, konzentriert sich der Browser nicht darauf.Ein Kontrollkästchen und sein Text (oder in diesem Fall das Bild) können in ein Etikett eingeschlossen werden:
quelle
Hier ein kurzes Beispiel für die Auswahl eines Bildes wie ein Kontrollkästchen
Beispiel mit Knockout.js aktualisiert:
quelle
Erweiterung der akzeptierten Antwort für alle, die WordPress & GravityForms zum Generieren ihrer Formulare verwenden und Kontrollkästchenfelder automatisch mit einer Liste von Posts und der zugehörigen empfohlenen Miniaturansicht füllen möchten
Und das CSS:
quelle