Pura soluzione semantica HTML / CSS
È facile da implementare da solo, non è necessaria alcuna soluzione prefabbricata. Inoltre ti insegnerà molto in quanto non sembri troppo facile con i CSS.
Questo è quello che hai bisogno di fare:
Le tue caselle di controllo devono avere id
attributi distinti . Ciò ti consente di collegarti <label>
a, usando l' for
attributo- label dell'etichetta.
Esempio:
<input type="checkbox" id="myCheckbox1" />
<label for="myCheckbox1"><img src="http://someurl" /></label>
Il collegamento dell'etichetta alla casella di controllo attiverà un comportamento del browser: ogni volta che qualcuno fa clic sull'etichetta (o sull'immagine al suo interno), la casella di controllo verrà attivata.
Successivamente, nascondi la casella di controllo applicando ad esempio display: none;
ad essa.
Ora non resta che impostare lo stile desiderato per il tuo label::before
pseudo elemento (che verrà utilizzato come elementi di sostituzione della casella di controllo visiva):
label::before {
background-image: url(../path/to/unchecked.png);
}
In un ultimo passaggio complicato, fai uso dello :checked
pseudo-selettore CSS per cambiare l'immagine quando la casella è selezionata:
:checked + label::before {
background-image: url(../path/to/checked.png);
}
Il +
( selettore di fratello adiacente ) si assicura di cambiare solo le etichette che seguono direttamente la casella di controllo nascosta nel markup.
Puoi ottimizzarlo inserendo entrambe le immagini in una mappa sprit e applicando solo una modifica background-position
invece di scambiare l'immagine.
Naturalmente è necessario posizionare correttamente l'etichetta, applicare display: block;
e impostare correttamente width
e height
.
Modificare:
L'esempio e lo snippet di codepen, che ho creato dopo queste istruzioni, utilizzano la stessa tecnica, ma invece di utilizzare le immagini per le caselle di controllo, le sostituzioni delle caselle di controllo vengono eseguite esclusivamente con CSS , creando un ::before
sull'etichetta che, una volta selezionata, ha content: "✓";
. Aggiungi alcuni bordi arrotondati e dolci transizioni e il risultato è davvero piacevole!
Ecco un codice funzionante che mostra la tecnica e non richiede immagini per la casella di controllo:
http://codepen.io/anon/pen/wadwpx
Ecco lo stesso codice in uno snippet:
ul {
list-style-type: none;
}
li {
display: inline-block;
}
input[type="checkbox"][id^="cb"] {
display: none;
}
label {
border: 1px solid #fff;
padding: 10px;
display: block;
position: relative;
margin: 10px;
cursor: pointer;
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
label::before {
background-color: white;
color: white;
content: " ";
display: block;
border-radius: 50%;
border: 1px solid grey;
position: absolute;
top: -5px;
left: -5px;
width: 25px;
height: 25px;
text-align: center;
line-height: 28px;
transition-duration: 0.4s;
transform: scale(0);
}
label img {
height: 100px;
width: 100px;
transition-duration: 0.2s;
transform-origin: 50% 50%;
}
:checked+label {
border-color: #ddd;
}
:checked+label::before {
content: "✓";
background-color: grey;
transform: scale(1);
}
:checked+label img {
transform: scale(0.9);
box-shadow: 0 0 5px #333;
z-index: -1;
}
<ul>
<li><input type="checkbox" id="cb1" />
<label for="cb1"><img src="https://picsum.photos/seed/1/100" /></label>
</li>
<li><input type="checkbox" id="cb2" />
<label for="cb2"><img src="https://picsum.photos/seed/2/100" /></label>
</li>
<li><input type="checkbox" id="cb3" />
<label for="cb3"><img src="https://picsum.photos/seed/3/100" /></label>
</li>
<li><input type="checkbox" id="cb4" />
<label for="cb4"><img src="https://picsum.photos/seed/4/100" /></label>
</li>
</ul>