Come modellare una casella usando CSS


831

Sto cercando di modellare una casella di controllo utilizzando quanto segue:

<input type="checkbox" style="border:2px dotted #00f;display:block;background:#ff0000;" />

Ma lo stile non è applicato. La casella di controllo mostra ancora il suo stile predefinito. Come posso dargli lo stile specificato?



1
Penso che si sta cercando qualcosa di simile: asimishaq.com/myfiles/image-checkbox Vedi questo post: stackoverflow.com/questions/16352864/...
Asim-Ishaq


1
il link è nel commento sopra. comunque: blog.felixhagspiel.de/index.php/posts/custom-inputs
Felix Hagspiel

1
Wow. Guardando tutte queste risposte, devo solo dire, tutto questo lavoro è solo per mettere una casella di controllo in stile sullo schermo
Michael

Risposte:


784

AGGIORNARE:

La risposta di seguito fa riferimento allo stato delle cose prima della diffusa disponibilità di CSS 3. Nei browser moderni (incluso Internet Explorer 9 e versioni successive) è più semplice creare sostituzioni di caselle con il tuo stile preferito, senza utilizzare JavaScript.

Ecco alcuni link utili:

Vale la pena notare che il problema fondamentale non è cambiato. Non è ancora possibile applicare gli stili (bordi, ecc.) Direttamente all'elemento della casella di controllo e tali stili influiscono sulla visualizzazione della casella di controllo HTML. Ciò che è cambiato, tuttavia, è che ora è possibile nascondere la casella di controllo effettiva e sostituirla con un elemento in stile personale, utilizzando solo CSS. In particolare, poiché ora CSS ha un :checkedselettore ampiamente supportato , è possibile fare in modo che la sostituzione rifletta correttamente lo stato selezionato della casella.


RISPOSTA VECCHIA

Ecco un utile articolo sulle caselle di controllo dello stile . Fondamentalmente, quello scrittore ha scoperto che varia enormemente da browser a browser e che molti browser visualizzano sempre la casella di controllo predefinita, indipendentemente da come lo stile. Quindi non c'è davvero un modo semplice.

Non è difficile immaginare una soluzione alternativa in cui utilizzare JavaScript per sovrapporre un'immagine alla casella di controllo e fare clic su tale immagine per verificare la casella di controllo reale. Gli utenti senza JavaScript vedrebbero la casella di controllo predefinita.

Modificato per aggiungere: ecco un bel copione che fa questo per te ; nasconde il vero elemento checkbox, lo sostituisce con un arco di stile e reindirizza gli eventi click.


34
Questa risposta sta invecchiando! Il collegamento principale porta a un sito che confronta gli stili IE6 e IE7 ...
Jonatan Littke,

7
Punto giusto - e il punto base non è più vero, nei browser moderni. Ho aggiornato con alcuni collegamenti più recenti, ma ho lasciato l'originale come risorsa per i browser più vecchi.
Jacob Mattison,

3
Easy CSS Checkbox Generator , è stato davvero facile e intuitivo. Viene fornito con GUI anche per la creazione personalizzata! Ben apprezzato :)
CᴴᴀZ,

Sono interessato alla vecchia risposta perché voglio che questa funzione sia compatibile con IE8 + e altri browser (Chrome, Firefox e Safari). Tuttavia, non riesco a trovare molti feedback sul plugin che mi consiglia ryanfait.com/resources/custom-checkboxes-and-radio-buttons
Adrien Be

2
Questa non è una risposta molto utile - è solo un elenco di articoli, molti dei quali sono molto vecchi ora.
Steve Bennett

141

C'è un modo per farlo usando solo CSS. Possiamo (ab) usare invece l' labelelemento e lo stile. L'avvertenza è che questo non funzionerà per Internet Explorer 8 e versioni precedenti.

.myCheckbox input {
  position: relative;
  z-index: -9999;
}

.myCheckbox span {
  width: 20px;
  height: 20px;
  display: block;
  background: url("link_to_image");
}

.myCheckbox input:checked + span {
  background: url("link_to_another_image");
}
<label for="test">Label for my styled "checkbox"</label>
<label class="myCheckbox">
  <input type="checkbox" name="test" />
  <span></span>
</label>


@GandalfStormCrow funzionerà per qualsiasi browser che supporti la pseudo-classe: controllata, che IE8 NON supporta. Puoi verificare se funziona con selectivizr.com - che aggiunge il supporto per: controllato e amici.
Blake Pettersson,

In altre parole, supporta IE9 e versioni successive: spuntato.
Blake Pettersson,

1
C'è un polyfill per IE8 e precedenti: github.com/rdebeasi/checked-polyfill
Tim

Funziona, ma la prima volta lampeggia. Perché sta succedendo?
tecnophyle

Credo che i nascosto inputnon prendano mai il focus della tastiera, quindi questi sono irraggiungibili dalla tastiera.
sam

139

Puoi ottenere un effetto di casella personalizzato piuttosto interessante usando le nuove abilità fornite con le classi :aftere :beforepseudo. Il vantaggio è che non è necessario aggiungere altro al DOM, solo la casella di controllo standard.

Nota che funzionerà solo con browser compatibili. Credo che ciò sia legato al fatto che alcuni browser non consentono di impostare :aftere :beforeinserire elementi di input. Il che sfortunatamente significa per il momento che sono supportati solo i browser WebKit. Firefox + Internet Explorer consentirà comunque il funzionamento delle caselle di controllo, non ancora modificate, e si spera che questo cambi in futuro (il codice non utilizza i prefissi del fornitore).

Questa è solo una soluzione browser WebKit (Chrome, Safari, browser Mobile)

Vedi esempio violino

$(function() {
  $('input').change(function() {
    $('div').html(Math.random());
  });
});
/* Main Classes */
.myinput[type="checkbox"]:before {
  position: relative;
  display: block;
  width: 11px;
  height: 11px;
  border: 1px solid #808080;
  content: "";
  background: #FFF;
}

.myinput[type="checkbox"]:after {
  position: relative;
  display: block;
  left: 2px;
  top: -11px;
  width: 7px;
  height: 7px;
  border-width: 1px;
  border-style: solid;
  border-color: #B3B3B3 #dcddde #dcddde #B3B3B3;
  content: "";
  background-image: linear-gradient(135deg, #B1B6BE 0%, #FFF 100%);
  background-repeat: no-repeat;
  background-position: center;
}

.myinput[type="checkbox"]:checked:after {
  background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAQAAABuW59YAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAB2SURBVHjaAGkAlv8A3QDyAP0A/QD+Dam3W+kCAAD8APYAAgTVZaZCGwwA5wr0AvcA+Dh+7UX/x24AqK3Wg/8nt6w4/5q71wAAVP9g/7rTXf9n/+9N+AAAtpJa/zf/S//DhP8H/wAA4gzWj2P4lsf0JP0A/wADAHB0Ngka6UmKAAAAAElFTkSuQmCC'), linear-gradient(135deg, #B1B6BE 0%, #FFF 100%);
}

.myinput[type="checkbox"]:disabled:after {
  -webkit-filter: opacity(0.4);
}

.myinput[type="checkbox"]:not(:disabled):checked:hover:after {
  background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAQAAABuW59YAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAB2SURBVHjaAGkAlv8A3QDyAP0A/QD+Dam3W+kCAAD8APYAAgTVZaZCGwwA5wr0AvcA+Dh+7UX/x24AqK3Wg/8nt6w4/5q71wAAVP9g/7rTXf9n/+9N+AAAtpJa/zf/S//DhP8H/wAA4gzWj2P4lsf0JP0A/wADAHB0Ngka6UmKAAAAAElFTkSuQmCC'), linear-gradient(135deg, #8BB0C2 0%, #FFF 100%);
}

.myinput[type="checkbox"]:not(:disabled):hover:after {
  background-image: linear-gradient(135deg, #8BB0C2 0%, #FFF 100%);
  border-color: #85A9BB #92C2DA #92C2DA #85A9BB;
}

.myinput[type="checkbox"]:not(:disabled):hover:before {
  border-color: #3D7591;
}

/* Large checkboxes */
.myinput.large {
  height: 22px;
  width: 22px;
}

.myinput.large[type="checkbox"]:before {
  width: 20px;
  height: 20px;
}

.myinput.large[type="checkbox"]:after {
  top: -20px;
  width: 16px;
  height: 16px;
}

/* Custom checkbox */
.myinput.large.custom[type="checkbox"]:checked:after {
  background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGHRFWHRBdXRob3IAbWluZWNyYWZ0aW5mby5jb23fZidLAAAAk0lEQVQ4y2P4//8/AyUYwcAD+OzN/oMwshjRBoA0Gr8+DcbIhhBlAEyz+qZZ/7WPryHNAGTNMOxpJvo/w0/uP0kGgGwGaZbrKgfTGnLc/0nyAgiDbEY2BCRGdCDCnA2yGeYVog0Aae5MV4c7Gzk6CRqAbDM2w/EaQEgzXgPQnU2SAcTYjNMAYm3GaQCxNuM0gFwMAPUKd8XyBVDcAAAAAElFTkSuQmCC'), linear-gradient(135deg, #B1B6BE 0%, #FFF 100%);
}

.myinput.large.custom[type="checkbox"]:not(:disabled):checked:hover:after {
  background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGHRFWHRBdXRob3IAbWluZWNyYWZ0aW5mby5jb23fZidLAAAAk0lEQVQ4y2P4//8/AyUYwcAD+OzN/oMwshjRBoA0Gr8+DcbIhhBlAEyz+qZZ/7WPryHNAGTNMOxpJvo/w0/uP0kGgGwGaZbrKgfTGnLc/0nyAgiDbEY2BCRGdCDCnA2yGeYVog0Aae5MV4c7Gzk6CRqAbDM2w/EaQEgzXgPQnU2SAcTYjNMAYm3GaQCxNuM0gFwMAPUKd8XyBVDcAAAAAElFTkSuQmCC'), linear-gradient(135deg, #8BB0C2 0%, #FFF 100%);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<table style="width:100%">
  <tr>
    <td>Normal:</td>
    <td><input type="checkbox" /></td>
    <td><input type="checkbox" checked="checked" /></td>
    <td><input type="checkbox" disabled="disabled" /></td>
    <td><input type="checkbox" disabled="disabled" checked="checked" /></td>
  </tr>
  <tr>
    <td>Small:</td>
    <td><input type="checkbox" class="myinput" /></td>
    <td><input type="checkbox" checked="checked" class="myinput" /></td>
    <td><input type="checkbox" disabled="disabled" class="myinput" /></td>
    <td><input type="checkbox" disabled="disabled" checked="checked" class="myinput" /></td>
  </tr>
  <tr>
    <td>Large:</td>
    <td><input type="checkbox" class="myinput large" /></td>
    <td><input type="checkbox" checked="checked" class="myinput large" /></td>
    <td><input type="checkbox" disabled="disabled" class="myinput large" /></td>
    <td><input type="checkbox" disabled="disabled" checked="checked" class="myinput large" /></td>
  </tr>
  <tr>
    <td>Custom icon:</td>
    <td><input type="checkbox" class="myinput large custom" /></td>
    <td><input type="checkbox" checked="checked" class="myinput large custom" /></td>
    <td><input type="checkbox" disabled="disabled" class="myinput large custom" /></td>
    <td><input type="checkbox" disabled="disabled" checked="checked" class="myinput large custom" /></td>
  </tr>
</table>

Bonus violino flipswitch stile Webkit

$(function() {
  var f = function() {
    $(this).next().text($(this).is(':checked') ? ':checked' : ':not(:checked)');
  };
  $('input').change(f).trigger('change');
});
body {
  font-family: arial;
}

.flipswitch {
  position: relative;
  background: white;
  width: 120px;
  height: 40px;
  -webkit-appearance: initial;
  border-radius: 3px;
  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
  outline: none;
  font-size: 14px;
  font-family: Trebuchet, Arial, sans-serif;
  font-weight: bold;
  cursor: pointer;
  border: 1px solid #ddd;
}

.flipswitch:after {
  position: absolute;
  top: 5%;
  display: block;
  line-height: 32px;
  width: 45%;
  height: 90%;
  background: #fff;
  box-sizing: border-box;
  text-align: center;
  transition: all 0.3s ease-in 0s;
  color: black;
  border: #888 1px solid;
  border-radius: 3px;
}

.flipswitch:after {
  left: 2%;
  content: "OFF";
}

.flipswitch:checked:after {
  left: 53%;
  content: "ON";
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>

<h2>Webkit friendly mobile-style checkbox/flipswitch</h2>
<input type="checkbox" class="flipswitch" /> &nbsp;
<span></span>
<br>
<input type="checkbox" checked="checked" class="flipswitch" /> &nbsp;
<span></span>


9
Firefox 33.1 / Linux: il violino mostra solo le caselle di controllo predefinite. Niente sembra diverso.
robsch,

1
@robsch Questo è chiaramente indicato nel post originale. La versione di Firefox o OS è irrilevante, non funziona in Firefox. "FF + IE consentirà comunque il funzionamento delle caselle di controllo, solo in stile ..."
Josh Mc

Un buon approccio. Ma non tutti i browser lo fanno bene. Solo Chrome ha il miglior output per quanto ho esaminato.
EA,

Molto bella. Tuttavia ... È di nuovo un approccio IE 5.x. Solo Webkit. Perché non segue sempre le regole ... Questo è l'intero problema con i browser webkit.
Alex

1
Soluzione migliore! +1 Ma non vedo il motivo per scrivere un esempio così grande. 30 righe per descrivere l'idea sarebbero sufficienti.
Andrii Bogachenko,

136

Prima di iniziare (a partire da gennaio 2015)

La domanda e la risposta originali ora hanno ~ 5 anni. Come tale, questo è un po 'un aggiornamento.

In primo luogo, ci sono una serie di approcci quando si tratta di caselle di controllo di stile. il principio di base è:

  1. Dovrai nascondere il controllo casella predefinito che è disegnato dal tuo browser e non può essere sovrascritto in alcun modo significativo usando i CSS.

  2. Con il controllo nascosto, sarà comunque necessario essere in grado di rilevare e attivare lo stato selezionato

  3. Lo stato selezionato della casella di controllo dovrà essere riflesso dallo stile di un nuovo elemento

La soluzione (in linea di principio)

Quanto sopra può essere realizzato in vari modi - e spesso sentirai che usare gli pseudo-elementi CSS3 è la strada giusta. In realtà, non esiste un modo giusto o sbagliato, dipende dall'approccio più adatto al contesto in cui lo userete. Detto questo, ne ho uno preferito.

  1. Avvolgi la casella in un labelelemento. Ciò significa che anche quando è nascosto, puoi comunque attivare o disattivare lo stato selezionato facendo clic in un punto qualsiasi dell'etichetta.

  2. Nascondi la tua casella di controllo

  3. Aggiungi un nuovo elemento dopo la casella di controllo che modellerai di conseguenza. Deve apparire dopo la casella di controllo in modo che possa essere selezionato usando CSS e disegnato in base allo :checkedstato. CSS non può selezionare "indietro".

La soluzione (nel codice)

Affinamento (usando le icone)

Ma hey! Ti sento urlare. E se volessi mostrare un bel segno di spunta o una croce nella casella? E non voglio usare immagini di sfondo!

Bene, è qui che possono entrare in gioco gli pseudo-elementi CSS3. Supportano la contentproprietà che consente di iniettare icone Unicode che rappresentano entrambi gli stati. In alternativa, è possibile utilizzare una fonte di icone di caratteri di terze parti come carattere fantastico (anche se assicurarsi di aver impostato anche il pertinente font-family, ad esempio su FontAwesome)

label input {
  display: none; /* Hide the default checkbox */
}

/* Style the artificial checkbox */
label span {
  height: 10px;
  width: 10px;
  border: 1px solid grey;
  display: inline-block;
  position: relative;
}

/* Style its checked state...with a ticked icon */
[type=checkbox]:checked + span:before {
  content: '\2714';
  position: absolute;
  top: -5px;
  left: 0;
}
<label>
  <input type='checkbox'>
  <span></span>
  Checkbox label text
</label>


14
Tranne: HTML semplificato, CSS semplificato, spiegazione dettagliata.
SW4,

4
@AnthonyHayward - risposta aggiornata, questo era dovuto all'utilizzo di display: nessuno che non crea un'istanza del controllo in modo tabulato, ho cambiato
SW4

1
Stavo lottando per trovare un esempio in cui la casella di controllo fosse all'interno dell'etichetta anziché prima / dopo. Questa è una soluzione ben documentata e spiegata. Sarebbe bello vedere questa risposta aggiornata per gennaio 2016.
Clarus Dignus,

1
Non ancora tablable con display: none.
sam

2
Sostituisci visibility: hidden;con opacity: 0 !important;se hai ancora problemi con la tabulazione.
Jabacchetta,

40

Seguirei il consiglio della risposta di SW4 : nascondere la casella di controllo e coprirla con un intervallo personalizzato, suggerendo questo HTML:

<label>
  <input type="checkbox">
  <span>send newsletter</span>
</label>

L'etichetta a capo automatico consente di fare clic sul testo senza la necessità del collegamento degli attributi "for-id". Però,

Non nasconderlo usando visibility: hiddenodisplay: none

Funziona facendo clic o toccando, ma questo è un modo scadente di utilizzare le caselle di controllo. Alcune persone usano ancora molto più efficace Tabper spostare l'attenzione, Spaceattivare e nascondersi con quel metodo lo disabilita. Se il modulo è lungo, si salveranno i polsi di qualcuno da usare tabindexo accesskeyattributi. E se osservi il comportamento della casella di controllo del sistema, c'è un'ombra decente al passaggio del mouse. La casella di controllo ben disegnata dovrebbe seguire questo comportamento.

La risposta di cobberboy raccomanda Font Awesome che di solito è meglio di bitmap poiché i font sono vettori scalabili. Lavorando con l'HTML sopra, suggerirei queste regole CSS:

  1. Nascondi caselle di controllo

    input[type="checkbox"] {
      position: absolute;
      opacity: 0;
      z-index: -1;
    }

    Uso solo aspetti negativi z-indexpoiché il mio esempio usa skin di checkbox abbastanza grandi da coprirle completamente. Non lo consiglio left: -999pxpoiché non è riutilizzabile in tutti i layout. La risposta di Bushan Wagh fornisce un modo a prova di proiettile per nasconderlo e convincere il browser a usare tabindex, quindi è una buona alternativa. Ad ogni modo, entrambi sono solo un trucco. Il modo corretto oggi è appearance: none, vedi la risposta di Joost :

    input[type="checkbox"] {
      appearance: none;
      -webkit-appearance: none;
      -moz-appearance: none;
    }
  2. Etichetta casella di controllo stile

    input[type="checkbox"] + span {
      font: 16pt sans-serif;
      color: #000;
    }
  3. Aggiungi la casella di controllo

    input[type="checkbox"] + span:before {
      font: 16pt FontAwesome;
      content: '\00f096';
      display: inline-block;
      width: 16pt;
      padding: 2px 0 0 3px;
      margin-right: 0.5em;
    }

    \00f096 è Font Awesome square-o , l'imbottitura è regolata per fornire anche un contorno punteggiato sulla messa a fuoco (vedi sotto).

  4. Aggiungi la casella di controllo selezionata skin

    input[type="checkbox"]:checked + span:before {
      content: '\00f046';
    }

    \00f046è Font Awesome's check-square-o, che non ha la stessa larghezza disquare-o , che è la ragione dello stile di larghezza sopra.

  5. Aggiungi contorno di messa a fuoco

    input[type="checkbox"]:focus + span:before {
      outline: 1px dotted #aaa;
    }

    Safari non fornisce questa funzione (vedi il commento di @Jason Sankey), che dovresti usare window.navigator per rilevare il browser e saltarlo se è Safari.

  6. Imposta il colore grigio per la casella di controllo disabilitata

    input[type="checkbox"]:disabled + span {
      color: #999;
    }
  7. Imposta l'ombra al passaggio del mouse sulla casella di controllo non disabilitata

    input[type="checkbox"]:not(:disabled) + span:hover:before {
      text-shadow: 0 1px 2px #77F;
    }

Demo Fiddle

Prova a passare il mouse sopra le caselle di controllo e usa Tabe Shift+ Tabper spostare e Spaceattivare.


3
Un voto per aver affrontato il problema del focus: personalizzazioni come questa non dovrebbero rimuovere le funzionalità di base. Nota che Safari non mette a fuoco la tastiera per le caselle di controllo (anche quelle predefinite), che mi hanno confuso momentaneamente durante l'implementazione di una soluzione che includeva la gestione del focus.
Jason Sankey,

sembra che le caselle di controllo nello snippet non funzionino più? Su windows 10 cromate
Félix Gagnon-Grenier,

1
Bella risposta. Fornito la base per la mia soluzione, ho usato l'etichetta esistente dopo l'input in cui hai utilizzato un intervallo extra e ho ottenuto il supporto Edge e FF.
Jono

2
La maggior parte di queste risposte ignora l'accessibilità. Adoro che questa risposta lo mantenga intatto.
maxshuty

1
@maxshuty Mi piace anche il tuo approccio: quando qualcuno crea una libreria, spesso è solo una confessione che non può programmare in modo semplice nella lingua madre di sua scelta. IMHO FontAwesome ha rovinato il loro piano gratuito usando javascript per caricare il carattere, ma mi piacciono ancora perché rimangono open source e licenza gratuita. Di solito finisco per creare un sottoinsieme di icone gratuite di cui ho bisogno in un particolare progetto (di solito max 5kB). Pagherei volentieri se mi risparmiassero lo sforzo, ma non i folli 99 $ all'anno come propongono nel loro piano Pro.
Jan Turoň,

30

Puoi modellare le caselle di controllo con un piccolo trucco usando l' labelelemento che segue un esempio:

.checkbox > input[type=checkbox] {
  visibility: hidden;
}

.checkbox {
  position: relative;
  display: block;
  width: 80px;
  height: 26px;
  margin: 0 auto;
  background: #FFF;
  border: 1px solid #2E2E2E;
  border-radius: 2px;
  -webkit-border-radius: 2px;
  -moz-border-radius: 2px;
}

.checkbox:after {
  position: absolute;
  display: inline;
  right: 10px;
  content: 'no';
  color: #E53935;
  font: 12px/26px Arial, sans-serif;
  font-weight: bold;
  text-transform: capitalize;
  z-index: 0;
}

.checkbox:before {
  position: absolute;
  display: inline;
  left: 10px;
  content: 'yes';
  color: #43A047;
  font: 12px/26px Arial, sans-serif;
  font-weight: bold;
  text-transform: capitalize;
  z-index: 0;
}

.checkbox label {
  position: absolute;
  display: block;
  top: 3px;
  left: 3px;
  width: 34px;
  height: 20px;
  background: #2E2E2E;
  cursor: pointer;
  transition: all 0.5s linear;
  -webkit-transition: all 0.5s linear;
  -moz-transition: all 0.5s linear;
  border-radius: 2px;
  -webkit-border-radius: 2px;
  -moz-border-radius: 2px;
  z-index: 1;
}

.checkbox input[type=checkbox]:checked + label {
  left: 43px;
}
<div class="checkbox">
  <input id="checkbox1" type="checkbox" value="1" />
  <label for="checkbox1"></label>
</div>

E un FIDDLE per il codice sopra. Nota che alcuni CSS non funzionano nelle versioni precedenti dei browser, ma sono sicuro che ci sono alcuni fantasiosi esempi JavaScript là fuori!


28

Soluzione semplice da implementare e facilmente personalizzabile

Dopo molte ricerche e test ho ottenuto questa soluzione che è semplice da implementare e più facile da personalizzare. In questa soluzione :

  1. Non hai bisogno di librerie e file esterni
  2. Non è necessario aggiungere ulteriore HTML nella tua pagina
  3. Non è necessario modificare i nomi e l'id della casella di controllo

Metti semplicemente il CSS scorrevole nella parte superiore della tua pagina e lo stile di tutte le caselle di controllo cambierà in questo modo:

Inserisci qui la descrizione dell'immagine

input[type=checkbox] {
  transform: scale(1.5);
}

input[type=checkbox] {
  width: 30px;
  height: 30px;
  margin-right: 8px;
  cursor: pointer;
  font-size: 17px;
  visibility: hidden;
}

input[type=checkbox]:after {
  content: " ";
  background-color: #fff;
  display: inline-block;
  margin-left: 10px;
  padding-bottom: 5px;
  color: #00BFF0;
  width: 22px;
  height: 25px;
  visibility: visible;
  border: 1px solid #00BFF0;
  padding-left: 3px;
  border-radius: 5px;
}

input[type=checkbox]:checked:after {
  content: "\2714";
  padding: -5px;
  font-weight: bold;
}

1
Semplice è meglio!
Adrian Moisa,

Questa è un'ottima risposta, funziona solo senza bisogno di altro
HeavyHead,

Buono e molto semplice
khalidh,

Bella soluzione. Ma non lo vedo funzionare su Firefox, IE o Edge (non c'è casella di controllo)
Jono

20

Puoi evitare di aggiungere markup extra. Funziona ovunque tranne IE per desktop (ma funziona in IE per Windows Phone e Microsoft Edge) tramite l'impostazione CSS appearance:

input[type="checkbox"] {
  -webkit-appearance: none;
  -moz-appearance: none;
  appearance: none;

  /* Styling checkbox */
  width: 16px;
  height: 16px;
  background-color: red;
}

input[type="checkbox"]:checked {
  background-color: green;
}
<input type="checkbox" />


3
Mi piace questo approccio - è un po 'confuso perché non dovresti mai usare davvero l'aspetto in CSS ma è molto più pulito di alcune delle altre risposte che usano prima e dopo. E per qualcosa del genere, penso che JavaScript sia un overkill completo.
Sprose,

18

Preferisco usare i caratteri icona (come FontAwesome) poiché è facile modificare i loro colori con CSS e si adattano molto bene su dispositivi ad alta densità di pixel. Quindi ecco un'altra variante CSS pura, usando tecniche simili a quelle sopra.

(Di seguito è un'immagine statica in modo da poter visualizzare il risultato; vedere la JSFiddle per una versione interattiva.)

Esempio di casella di controllo

Come con altre soluzioni, utilizza l' labelelemento. Un adiacente spancontiene il nostro carattere di casella di controllo.

span.bigcheck-target {
  font-family: FontAwesome; /* Use an icon font for the checkbox */
}

input[type='checkbox'].bigcheck {
  position: relative;
  left: -999em; /* Hide the real checkbox */
}

input[type='checkbox'].bigcheck + span.bigcheck-target:after {
  content: "\f096"; /* In fontawesome, is an open square (fa-square-o) */
}

input[type='checkbox'].bigcheck:checked + span.bigcheck-target:after {
  content: "\f046"; /* fontawesome checked box (fa-check-square-o) */
}

/* ==== Optional - colors and padding to make it look nice === */
body {
  background-color: #2C3E50;
  color: #D35400;
  font-family: sans-serif;
  font-weight: 500;
  font-size: 4em; /* Set this to whatever size you want */
}

span.bigcheck {
  display: block;
  padding: 0.5em;
}
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" />

<span class="bigcheck">
  <label class="bigcheck">
    Cheese
    <input type="checkbox" class="bigcheck" name="cheese" value="yes" />
    <span class="bigcheck-target"></span>
  </label>
</span>

Ecco il JSFiddle per questo.


.... quello che hai descritto è lo stesso delle risposte precedenti di Bhushan Wagh, Jake, Jonathan Hodgson e Blake;)
SW4,

7
@ SW4 Ho fatto riferimento a questo fatto, tranne per il fatto che questa risposta usa i caratteri icona (che nessuna delle risposte precedenti aveva). Il primo paragrafo lo rende abbastanza chiaro.
cobberboy,

È necessario sostituire font-family: FontAwesome;con font-family: 'Font Awesome\ 5 Free';, e aggiornare il contenuto unicode se si vuole farlo funzionare in nuova versione.
SuN

12

Di recente ho trovato una soluzione abbastanza interessante al problema.

È possibile utilizzare appearance: none;per disattivare lo stile predefinito della casella di controllo e quindi scriverne uno proprio come descritto qui (Esempio 4) .

Esempio di violino

Sfortunatamente il supporto del browser è piuttosto negativo per appearance opzione. Dai miei test personali ho fatto funzionare correttamente solo Opera e Chrome. Ma questa sarebbe la strada da percorrere per mantenerla semplice quando arriva un supporto migliore o vuoi solo usare Chrome / Opera.

"Posso usare?" collegamento


In effetti appearanceè proprio ciò di cui abbiamo bisogno per questo; tieni presente che "non è standard e non è su una traccia standard" .
sam,

12

Con CSS puro, niente di speciale con :beforee :after, nessuna trasformazione, puoi disattivare l'aspetto predefinito e quindi modellarlo con un'immagine di sfondo in linea come nell'esempio seguente. Funziona in Chrome, Firefox, Safari e ora Edge (Chromium Edge).

INPUT[type=checkbox]:focus
{
    outline: 1px solid rgba(0, 0, 0, 0.2);
}

INPUT[type=checkbox]
{
    background-color: #DDD;
    border-radius: 2px;
    appearance: none;
    -webkit-appearance: none;
    -moz-appearance: none;
    width: 17px;
    height: 17px;
    cursor: pointer;
    position: relative;
    top: 5px;
}

INPUT[type=checkbox]:checked
{
    background-color: #409fd6;
    background: #409fd6 url("data:image/gif;base64,R0lGODlhCwAKAIABAP////3cnSH5BAEKAAEALAAAAAALAAoAAAIUjH+AC73WHIsw0UCjglraO20PNhYAOw==") 3px 3px no-repeat;
}
<form>
  <label><input type="checkbox">I Agree To Terms &amp; Conditions</label>
</form>


1
Sì! Solo uno che è in realtà decente.
odinho - Velmont,

10

La mia soluzione

input[type="checkbox"] {
  cursor: pointer;
  -webkit-appearance: none;
  -moz-appearance: none;
  appearance: none;
  outline: 0;
  background: lightgray;
  height: 16px;
  width: 16px;
  border: 1px solid white;
}

input[type="checkbox"]:checked {
  background: #2aa1c0;
}

input[type="checkbox"]:hover {
  filter: brightness(90%);
}

input[type="checkbox"]:disabled {
  background: #e6e6e6;
  opacity: 0.6;
  pointer-events: none;
}

input[type="checkbox"]:after {
  content: '';
  position: relative;
  left: 40%;
  top: 20%;
  width: 15%;
  height: 40%;
  border: solid #fff;
  border-width: 0 2px 2px 0;
  transform: rotate(45deg);
  display: none;
}

input[type="checkbox"]:checked:after {
  display: block;
}

input[type="checkbox"]:disabled:after {
  border-color: #7b7b7b;
}
<input type="checkbox"><br>
<input type="checkbox" checked><br>
<input type="checkbox" disabled><br>
<input type="checkbox" disabled checked><br>


Se qualcuno potesse consigliarti perché il mio testo non è allineato dopo, mi piacerebbe saperlo! Principiante CSS qui.
agirault,

8

Puoi semplicemente utilizzare appearance: nonesui browser moderni, in modo che non ci sia uno stile predefinito e tutti i tuoi stili siano applicati correttamente:

input[type=checkbox] {
  -webkit-appearance: none;
  -moz-appearance: none;
  appearance: none;
  display: inline-block;
  width: 2em;
  height: 2em;
  border: 1px solid gray;
  outline: none;
  vertical-align: middle;
}

input[type=checkbox]:checked {
  background-color: blue;
}

1
Questo è un esempio particolarmente minimalista che ha funzionato per il mio caso, grazie!
Jason R Stevens CFA

8

Desideri NO JavaScript, NO librerie esterne, conformità per l'accessibilità e entrambe le caselle di controllo e i pulsanti di opzione?

Ho fatto lo scrolling e lo scrolling e tonnellate di queste risposte hanno semplicemente lanciato l'accessibilità fuori dalla porta e violato WCAG in più di un modo. Ho inserito i pulsanti di opzione dalla maggior parte delle volte che quando usi le caselle di controllo personalizzate desideri anche i pulsanti di opzione personalizzati.

Fiddles :

In ritardo alla festa, ma in qualche modo questo è ancora difficile nel 2019 2020, quindi ho aggiunto le mie tre soluzioni che sono accessibili e facili da inserire.

Questi sono tutti JavaScript gratis , libreria esterna gratuita * e accessibili ...

Se vuoi plug-n-play con uno di questi è sufficiente copiare il foglio di stile dai violini, modificare i codici colore nel CSS in base alle tue esigenze ed essere sulla buona strada. È possibile aggiungere un'icona di segno di spunta svg personalizzata se si desidera per le caselle di controllo. Ho aggiunto molti commenti per quelle persone non CSS.

Se hai un testo lungo o un piccolo contenitore e stai riscontrando il ritorno a capo del testo sotto la casella di controllo o l'inserimento del pulsante di opzione, converti semplicemente in div come questo .

Spiegazione più lunga: avevo bisogno di una soluzione che non violasse WCAG, che non si basasse su JavaScript o librerie esterne e che non interrompesse la navigazione della tastiera come la tabulazione o la barra spaziatrice per selezionare, che consente gli eventi di attivazione, una soluzione che consente di disabilitare le caselle di controllo che sono entrambi controllati e incontrollato, e, infine, una soluzione in cui posso personalizzare l'aspetto della casella di controllo però voglio con diverso background-color's, border-radius, svgsfondi, ecc

Ho usato una combinazione di questa risposta di @Jan Turoň per trovare la mia soluzione che sembra funzionare abbastanza bene. Ho fatto un violino con i pulsanti di opzione che utilizza molto dello stesso codice dalle caselle di controllo per farlo funzionare anche con i pulsanti di opzione.

Sto ancora imparando l'accessibilità, quindi se ho perso qualcosa per favore lascia un commento e proverò a correggerlo qui è un esempio di codice delle mie caselle di controllo:

input[type="checkbox"] {
  position: absolute;
  opacity: 0;
  z-index: -1;
}

/* Text color for the label */
input[type="checkbox"]+span {
  cursor: pointer;
  font: 16px sans-serif;
  color: black;
}

/* Checkbox un-checked style */
input[type="checkbox"]+span:before {
  content: '';
  border: 1px solid grey;
  border-radius: 3px;
  display: inline-block;
  width: 16px;
  height: 16px;
  margin-right: 0.5em;
  margin-top: 0.5em;
  vertical-align: -2px;
}

/* Checked checkbox style (in this case the background is red) */
input[type="checkbox"]:checked+span:before {
  /* NOTE: Replace the url with a path to an SVG of a checkmark to get a checkmark icon */
  background-image: url('https://cdnjs.cloudflare.com/ajax/libs/ionicons/4.5.6/collection/build/ionicons/svg/ios-checkmark.svg');
  background-repeat: no-repeat;
  background-position: center;
  /* The size of the checkmark icon, you may/may not need this */
  background-size: 25px;
  border-radius: 2px;
  background-color: #e7ffba;
  color: white;
}

/* Adding a dotted border around the active tabbed-into checkbox */
input[type="checkbox"]:focus+span:before,
input[type="checkbox"]:not(:disabled)+span:hover:before {
  /* Visible in the full-color space */
  box-shadow: 0px 0px 0px 2px rgba(0, 150, 255, 1);

  /* Visible in Windows high-contrast themes
     box-shadow will be hidden in these modes and
     transparency will not be hidden in high-contrast
     thus box-shadow will not show but the outline will
     providing accessibility */
  outline-color: transparent; /*switch to transparent*/
  outline-width: 2px;
  outline-style: dotted;
  }


/* Disabled checkbox styles */
input[type="checkbox"]:disabled+span {
  cursor: default;
  color: black;
  opacity: 0.5;
}

/* Styles specific to this fiddle that you do not need */
body {
  padding: 1em;
}
h1 {
  font-size: 18px;
}
<h1>
  NOTE: Replace the url for the background-image in CSS with a path to an SVG in your solution or CDN. This one was found from a quick google search for a checkmark icon cdn
</h1>

<label>
  <input type="checkbox">
  <span>Try using tab and space</span>
</label>

<br>

<label>
  <input type="checkbox" checked disabled>
  <span>Disabled Checked Checkbox</span>
</label>

<br>

<label>
  <input type="checkbox" disabled>
  <span>Disabled Checkbox</span>
</label>
<br>

<label>
  <input type="checkbox">
  <span>Normal Checkbox</span>
</label>

<br>

<label>
  <input type="checkbox">
  <span>Another Normal Checkbox</span>
</label>


Ho aggiunto la mia risposta anche qui , si spera che aiuti qualcuno. Ho usato il tema nel mio. :) Spero che qualcuno lo veda.
Mr. Polywhirl,

6

Ecco una semplice soluzione CSS senza jQuery o codice JavaScript.

Sto usando le icone FontAwseome ma puoi usare qualsiasi immagine

input[type=checkbox] {
  display: inline-block;
  font-family: FontAwesome;
  font-style: normal;
  font-weight: normal;
  line-height: 1;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  visibility: hidden;
  font-size: 14px;
}

input[type=checkbox]:before {
  content: @fa-var-square-o;
  visibility: visible;
  /*font-size: 12px;*/
}

input[type=checkbox]:checked:before {
  content: @fa-var-check-square-o;
}

1
A differenza della maggior parte delle altre risposte, questa non richiede la creazione di elementi aggiuntivi labelo span. Funziona e basta!
KurtPreston,

Potresti mostrare un esempio o una demo, o almeno la parte HTML, con cui funziona questo codice CSS? @aWebDeveloper
Sándor Zuboly

@aWebDeveloper apportare modifiche inane per rispondere a una risposta o una domanda alla home page è contro le regole.
TylerH,

@aWebDeveloper Hai modificato una vecchia risposta a una domanda inattiva, che la porta in prima pagina e fornisce un link direttamente alla tua risposta. Questo va bene se hai informazioni pertinenti da aggiungere o modificare in una risposta. Tutto quello che hai fatto è stato incorporare una delle tue frasi in un blocco di virgolette, che non è utile a nessuno.
TylerH,

dovrebbe funzionare @VadimOvchinnikov ... niente qui è specifico per Chrome
aWebDeveloper

6

Dal mio googling, questo è il modo più semplice per lo stile della casella di controllo. Aggiungi :aftere :checked:afterCSS in base al tuo design.

body{
  background: #DDD;
}
span{
  margin-left: 30px;
}
input[type=checkbox] {
    cursor: pointer;
    font-size: 17px;
    visibility: hidden;
    position: absolute;
    top: 0;
    left: 0;
    transform: scale(1.5);
}

input[type=checkbox]:after {
    content: " ";
    background-color: #fff;
    display: inline-block;
    color: #00BFF0;
    width: 14px;
    height: 19px;
    visibility: visible;
    border: 1px solid #FFF;
    padding: 0 3px;
    margin: 2px 0;
    border-radius: 8px;
    box-shadow: 0 0 15px 0 rgba(0,0,0,0.08), 0 0 2px 0 rgba(0,0,0,0.16);
}

input[type=checkbox]:checked:after {
    content: "\2714";
    display: unset;
    font-weight: bold;
}
<input type="checkbox"> <span>Select Text</span>


Soluzione molto interessante per browser che supportano pseudo-elementi. :)
Jean-François Beauchamp,

6

Modifica lo stile della casella di controllo con CSS3 semplice, non è richiesta alcuna manipolazione JS e HTML.

.form input[type="checkbox"]:before {
  display: inline-block;
  font: normal normal normal 14px/1 FontAwesome;
  font-size: inherit;
  text-rendering: auto;
  -webkit-font-smoothing: antialiased;
  content: "\f096";
  opacity: 1 !important;
  margin-top: -25px;
  appearance: none;
  background: #fff;
}

.form input[type="checkbox"]:checked:before {
  content: "\f046";
}

.form input[type="checkbox"] {
  font-size: 22px;
  appearance: none;
  -webkit-appearance: none;
  -moz-appearance: none;
}
<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet" />

<form class="form">
  <input type="checkbox" />
</form>


@VadimOvchinnikov Abbiamo una soluzione che richiede di seguito qualche struttura html .. stackoverflow.com/questions/23305780/...
BEJGAM SHIVA PRASAD

4

Un modello semplice e leggero:

input[type=checkbox] {
  cursor: pointer;
}

input[type=checkbox]:checked:before {
  content: "\2713";
  background: #fffed5;
  text-shadow: 1px 1px 1px rgba(0, 0, 0, .2);
  font-size: 20px;
  text-align: center;
  line-height: 8px;
  display: inline-block;
  width: 13px;
  height: 15px;
  color: #00904f;
  border: 1px solid #cdcdcd;
  border-radius: 4px;
  margin: -3px -3px;
  text-indent: 1px;
}

input[type=checkbox]:before {
  content: "\202A";
  background: #ffffff;
  text-shadow: 1px 1px 1px rgba(0, 0, 0, .2);
  font-size: 20px;
  text-align: center;
  line-height: 8px;
  display: inline-block;
  width: 13px;
  height: 15px;
  color: #00904f;
  border: 1px solid #cdcdcd;
  border-radius: 4px;
  margin: -3px -3px;
  text-indent: 1px;
}
<input type="checkbox" checked="checked">checked1<br>
<input type="checkbox">unchecked2<br>
<input type="checkbox" checked="checked" id="id1">
<label for="id1">checked2+label</label><br>
<label for="id2">unchecked2+label+rtl</label>
<input type="checkbox" id="id2">
<br>

https://jsfiddle.net/rvgccn5b/


1
Gli pseudoelementi per inputs sono supportati solo in Chrome, il tuo codice non funziona allo stesso modo in tutti i browser.
Vadim Ovchinnikov,

4

Penso che il modo più semplice per farlo sia quello di disegnare labele realizzare ilcheckbox invisibile.

HTML

<input type="checkbox" id="first" />
<label for="first">&nbsp;</label>

CSS

checkbox {
  display: none;
}

checkbox + label {
  /* Style for checkbox normal */
  width: 16px;
  height: 16px;
}

checkbox::checked + label,
label.checked {
  /* Style for checkbox checked */
}

Il checkbox, anche se è nascosto, sarà ancora accessibili, e il suo valore verrà inviato quando viene inviato un modulo. Per i vecchi browser potrebbe essere necessario modificare la classe del labelcontrollo tramite JavaScript perché non credo che le versioni precedenti di Internet Explorer capiscano ::checkedsul checkbox.


4
La differenza tra la tua risposta e la mia è esattamente cosa?
Blake Pettersson,

@BlakePettersson il tuo è corretto, :: verificato è solo sbagliato (ho anche provato nel caso in cui sia anche permesso);)
esp

7
Questa è una cattiva risposta (a) ::checkedè sbagliato — dovrebbe essere :checked. (b) checkboxè sbagliato - dovrebbe essere[type=checkbox]
Chris Morgan il

4

Yikes! Tutte queste soluzioni alternative mi hanno portato alla conclusione che il tipo di casella di controllo HTML fa schifo se si desidera modellarlo.

Come avvertimento, questa non è un'implementazione CSS. Ho solo pensato di condividere la soluzione alternativa che ho escogitato nel caso in cui qualcun altro lo abbia trovato utile.


Ho usato l' canvaselemento HTML5 .

Il vantaggio di questo è che non è necessario utilizzare immagini esterne e probabilmente è possibile risparmiare un po 'di larghezza di banda.

Il rovescio della medaglia è che se un browser per qualche motivo non riesce a renderlo correttamente, non c'è fallback. Anche se questo rimane un problema nel 2017 è discutibile.

Aggiornare

Ho trovato il vecchio codice abbastanza brutto, quindi ho deciso di dargli una riscrittura.

Object.prototype.create = function(args){
    var retobj = Object.create(this);

    retobj.constructor(args || null);

    return retobj;
}

var Checkbox = Object.seal({
    width: 0,
    height: 0,
    state: 0,
    document: null,
    parent: null,
    canvas: null,
    ctx: null,

    /*
     * args:
     * name      default             desc.
     *
     * width     15                  width
     * height    15                  height
     * document  window.document     explicit document reference
     * target    this.document.body  target element to insert checkbox into
     */
    constructor: function(args){
        if(args === null)
            args = {};

        this.width = args.width || 15;
        this.height = args.height || 15;
        this.document = args.document || window.document;
        this.parent = args.target || this.document.body;
        this.canvas = this.document.createElement("canvas");
        this.ctx = this.canvas.getContext('2d');

        this.canvas.width = this.width;
        this.canvas.height = this.height;
        this.canvas.addEventListener("click", this.ev_click(this), false);
        this.parent.appendChild(this.canvas);
        this.draw();
    },

    ev_click: function(self){
        return function(unused){
            self.state = !self.state;
            self.draw();
        }
    },

    draw_rect: function(color, offset){
        this.ctx.fillStyle = color;
        this.ctx.fillRect(offset, offset,
                this.width - offset * 2, this.height - offset * 2);
    },

    draw: function(){
        this.draw_rect("#CCCCCC", 0);
        this.draw_rect("#FFFFFF", 1);

        if(this.is_checked())
            this.draw_rect("#000000", 2);
    },

    is_checked: function(){
        return !!this.state;
    }
});

Ecco una demo funzionante .

La nuova versione utilizza prototipi e ereditarietà differenziale per creare un sistema efficiente per la creazione di caselle di controllo. Per creare una casella di controllo:

var my_checkbox = Checkbox.create();

Ciò aggiungerà immediatamente la casella di controllo al DOM e collegherà gli eventi. Per verificare se una casella è selezionata:

my_checkbox.is_checked(); // True if checked, else false

È anche importante notare che mi sono liberato del ciclo.

Aggiornamento 2

Qualcosa che ho trascurato di menzionare nell'ultimo aggiornamento è che l'uso della tela ha più vantaggi rispetto alla semplice creazione di una casella di controllo che sembra come si desidera. È anche possibile creare caselle di controllo multi-stato , se lo si desidera.

Object.prototype.create = function(args){
    var retobj = Object.create(this);

    retobj.constructor(args || null);

    return retobj;
}

Object.prototype.extend = function(newobj){
    var oldobj = Object.create(this);

    for(prop in newobj)
        oldobj[prop] = newobj[prop];

    return Object.seal(oldobj);
}

var Checkbox = Object.seal({
    width: 0,
    height: 0,
    state: 0,
    document: null,
    parent: null,
    canvas: null,
    ctx: null,

    /*
     * args:
     * name      default             desc.
     *
     * width     15                  width
     * height    15                  height
     * document  window.document     explicit document reference
     * target    this.document.body  target element to insert checkbox into
     */
    constructor: function(args){
        if(args === null)
            args = {};

        this.width = args.width || 15;
        this.height = args.height || 15;
        this.document = args.document || window.document;
        this.parent = args.target || this.document.body;
        this.canvas = this.document.createElement("canvas");
        this.ctx = this.canvas.getContext('2d');

        this.canvas.width = this.width;
        this.canvas.height = this.height;
        this.canvas.addEventListener("click", this.ev_click(this), false);
        this.parent.appendChild(this.canvas);
        this.draw();
    },

    ev_click: function(self){
        return function(unused){
            self.state = !self.state;
            self.draw();
        }
    },

    draw_rect: function(color, offsetx, offsety){
        this.ctx.fillStyle = color;
        this.ctx.fillRect(offsetx, offsety,
                this.width - offsetx * 2, this.height - offsety * 2);
    },

    draw: function(){
        this.draw_rect("#CCCCCC", 0, 0);
        this.draw_rect("#FFFFFF", 1, 1);
        this.draw_state();
    },

    draw_state: function(){
        if(this.is_checked())
            this.draw_rect("#000000", 2, 2);
    },

    is_checked: function(){
        return this.state == 1;
    }
});

var Checkbox3 = Checkbox.extend({
    ev_click: function(self){
        return function(unused){
            self.state = (self.state + 1) % 3;
            self.draw();
        }
    },

    draw_state: function(){
        if(this.is_checked())
            this.draw_rect("#000000", 2, 2);

        if(this.is_partial())
            this.draw_rect("#000000", 2, (this.height - 2) / 2);
    },

    is_partial: function(){
        return this.state == 2;
    }
});

Ho modificato leggermente quello Checkboxutilizzato nell'ultimo frammento in modo che sia più generico, rendendo possibile "estenderlo" con una casella di controllo che ha 3 stati. Ecco una demo . Come puoi vedere, ha già più funzionalità rispetto alla casella di controllo integrata.

Qualcosa da considerare quando si sceglie tra JavaScript e CSS.

Codice vecchio, mal progettato

Demo di lavoro

Innanzitutto, imposta una tela

var canvas = document.createElement('canvas'),
    ctx = canvas.getContext('2d'),
    checked = 0; // The state of the checkbox
canvas.width = canvas.height = 15; // Set the width and height of the canvas
document.body.appendChild(canvas);
document.body.appendChild(document.createTextNode(' Togglable Option'));

Successivamente, escogita un modo per aggiornare automaticamente la tela.

(function loop(){
  // Draws a border
  ctx.fillStyle = '#ccc';
  ctx.fillRect(0,0,15,15);
  ctx.fillStyle = '#fff';
  ctx.fillRect(1, 1, 13, 13);
  // Fills in canvas if checked
  if(checked){
    ctx.fillStyle = '#000';
    ctx.fillRect(2, 2, 11, 11);
  }
  setTimeout(loop, 1000/10); // Refresh 10 times per second
})();

L'ultima parte è renderlo interattivo. Fortunatamente, è abbastanza semplice:

canvas.onclick = function(){
  checked = !checked;
}

È qui che potresti avere problemi in IE, a causa del loro strano modello di gestione degli eventi in JavaScript.


Spero che questo aiuti qualcuno; è decisamente adatto alle mie esigenze.


Si noti che l'implementazione di Canvas, come emulazione di caselle di controllo, consente più funzionalità rispetto alle caselle di controllo integrate. Ad esempio, cose fantasiose come caselle di controllo "multi-stato" (ad esempio unchecked (e.g. unchecked -> checked -> "kinda" checked -> unchecked, gli stati potrebbero rappresentare "esplicito falso", "esplicito vero", "usa predefinito", per esempio). Sto valutando di aggiungere un esempio alla risposta.
Braden Best

Terribile idea secondo me.

@Neil, per favore, elabora
Braden Best

Perché reinventare la ruota?

@Neil perché non reinventare la ruota? NIH non è sempre una brutta cosa, soprattutto quando offre vantaggi che sarebbero altrimenti impossibili o stupidamente complicati da implementare con la tecnologia esistente. Quindi si tratta di stabilire se si è disposti a gestire le caselle di controllo integrate. E se voglio temerli in modo che si fondano con il linguaggio visivo del mio sito Web o della mia app, voglio il pieno controllo. Quindi, finché qualcuno non crea una libreria UI autonoma, leggera e facile da usare, preferisco personalmente inventare le mie ruote qui. Qualcun altro potrebbe non farlo, ma ciò non invalida la mia risposta.
Braden Best

3

Questo è il modo più semplice e puoi scegliere quali caselle di controllo dare questo stile.

CSS:

.check-box input {
  display: none;
}

.check-box span:before {
  content: ' ';
  width: 20px;
  height: 20px;
  display: inline-block;
  background: url("unchecked.png");
}

.check-box input:checked + span:before {
  background: url("checked.png");
}

HTML:

<label class="check-box">
  <input type="checkbox">
  <span>Check box Text</span>
</label>

3

Non è richiesto JavaScript o jQuery .

Cambia il tuo stile di casella di controllo in modo semplice.

input[type="checkbox"] {
  display: none;
  border: none !important;
  box-shadow: none !important;
}

input[type="checkbox"] + label span {
  background: url(http://imgh.us/uncheck.png);
  width: 49px;
  height: 49px;
  display: inline-block;
  vertical-align: middle;
}

input[type="checkbox"]:checked + label span {
  background: url(http://imgh.us/check_2.png);
  width: 49px;
  height: 49px;
  vertical-align: middle;
}
<input type="checkbox" id="option" />
<label for="option"> <span></span> Click me </label>

Ecco il link JsFiddle


La casella di controllo non viene visualizzata perché si basa su collegamenti esterni ai file di immagine imgh.us/uncheck.png e imgh.us/check_2.png che non sono più disponibili online.
jkdev,

2

Ecco una versione solo CSS / HTML, non è necessario affatto jQuery o JavaScript, HTML semplice e pulito e CSS davvero semplice e breve.

Ecco il JSFiddle

http://jsfiddle.net/v71kn3pr/

Ecco l'HTML:

<div id="myContainer">
    <input type="checkbox" name="myCheckbox" id="myCheckbox_01_item" value="red" />
    <label for="myCheckbox_01_item" class="box"></label>
    <label for="myCheckbox_01_item" class="text">I accept the Terms of Use.</label>
</div>

Ecco il CSS

#myContainer {
    outline: black dashed 1px;
    width: 200px;
}
#myContainer input[type="checkbox"][name="myCheckbox"] {
    display: none;
}
#myContainer input[type="checkbox"][name="myCheckbox"]:not(:checked) + label.box {
    display: inline-block;
    width: 25px;
    height: 25px;
    border: black solid 1px;
    background: #FFF ;
    margin: 5px 5px;
}
#myContainer input[type="checkbox"][name="myCheckbox"]:checked + label.box {
    display: inline-block;
    width: 25px;
    height: 25px;
    border: black solid 1px;
    background: #F00;
    margin: 5px 5px;
}
#myContainer input[type="checkbox"][name="myCheckbox"] + label + label.text {
    font: normal 12px arial;
    display: inline-block;
    line-height: 27px;
    vertical-align: top;
    margin: 5px 0px;
}

Questo può essere adattato per poter avere singole radio o caselle di controllo, gruppi di caselle di controllo e gruppi di pulsanti di opzione.

Questo html / css, ti permetterà di catturare anche i clic sull'etichetta, quindi la casella sarà selezionata e deselezionata anche se fai clic solo sull'etichetta.

Questo tipo di casella di controllo / pulsante di opzione funziona perfettamente con qualsiasi forma, nessun problema. Sono stati testati anche utilizzando PHP, ASP.NET (.aspx), JavaServer Faces e ColdFusion .


2
**Custom checkbox with css**  (WebKit browser solution only Chrome, Safari, Mobile browsers)

    <input type="checkbox" id="cardAccptance" name="cardAccptance" value="Yes">
    <label for="cardAccptance" class="bold"> Save Card for Future Use</label>

    /* The checkbox-cu */

    .checkbox-cu {
        display: block;
        position: relative;
        padding-left: 35px;
        margin-bottom: 0;
        cursor: pointer;
        font-size: 16px;
        -webkit-user-select: none;
        -moz-user-select: none;
        -ms-user-select: none;
        user-select: none;
    }


    /* Hide the browser's default checkbox-cu */

    .checkbox-cu input {
        position: absolute;
        opacity: 0;
        cursor: pointer;
        height: 0;
        width: 0;
    }


    /* Create a custom checkbox-cu */

    .checkmark {
        position: absolute;
        top: 4px;
        left: 0;
        height: 20px;
        width: 20px;
        background-color: #eee;
        border: 1px solid #999;
        border-radius: 0;
        box-shadow: none;
    }


    /* On mouse-over, add a grey background color */

    .checkbox-cu:hover input~.checkmark {
        background-color: #ccc;
    }


    /* When the checkbox-cu is checked, add a blue background */

    .checkbox-cu input:checked~.checkmark {
        background-color: transparent;
    }


    /* Create the checkmark/indicator (hidden when not checked) */

    .checkmark:after {
        content: "";
        position: absolute;
        display: none;
    }


    /* Show the checkmark when checked */

    .checkbox-cu input:checked~.checkmark:after {
        display: block;
    }


    /* Style the checkmark/indicator */

    .checkbox-cu .checkmark::after {
        left: 7px;
        top: 3px;
        width: 6px;
        height: 9px;
        border: solid #28a745;
        border-width: 0 2px 2px 0;
        -webkit-transform: rotate(45deg);
        -ms-transform: rotate(45deg);
        transform: rotate(45deg);
        z-index: 100;
    }

1
input[type=checkbox].css-checkbox {
    position: absolute;
    overflow: hidden;
    clip: rect(0 0 0 0);
    height: 1px;
    width: 1px;
    margin: -1px;
    padding: 0;
    border: 0;
}

input[type=checkbox].css-checkbox + label.css-label {
    padding-left: 20px;
    height: 15px;
    display: inline-block;
    line-height: 15px;
    background-repeat: no-repeat;
    background-position: 0 0;
    font-size: 15px;
    vertical-align: middle;
    cursor: pointer;
}

input[type=checkbox].css-checkbox:checked + label.css-label {
    background-position: 0 -15px;
}

.css-label{
    background-image:url(http://csscheckbox.com/checkboxes/dark-check-green.png);
}

Una spiegazione sarebbe in ordine.
Peter Mortensen,

1

No, non puoi ancora modellare la casella stessa, ma io (finalmente) ho capito come modellare un'illusione mantenendo la funzionalità di fare clic su una casella. Significa che puoi attivarlo anche se il cursore non è perfettamente fermo senza rischiare di selezionare il testo o di attivare il trascinamento della selezione!

Questa soluzione probabilmente si adatta anche ai pulsanti di opzione.

Di seguito funziona in Internet Explorer 9, Firefox 30.0 e Chrome 40.0.2214.91 ed è solo un esempio di base. Puoi ancora usarlo in combinazione con immagini di sfondo e pseudo-elementi.

http://jsfiddle.net/o0xo13yL/1/

label {
    display: inline-block;
    position: relative; /* Needed for checkbox absolute positioning */
    background-color: #eee;
    padding: .5rem;
    border: 1px solid #000;
    border-radius: .375rem;
    font-family: "Courier New";
    font-size: 1rem;
    line-height: 1rem;
}

label > input[type="checkbox"] {
    display: block;
    position: absolute; /* Remove it from the flow */
    width: 100%;
    height: 100%;
    margin: -.5rem; /* Negative the padding of label to cover the "button" */
    cursor: pointer;
    opacity: 0; /* Make it transparent */
    z-index: 666; /* Place it on top of everything else */
}

label > input[type="checkbox"] + span {
    display: inline-block;
    width: 1rem;
    height: 1rem;
    border: 1px solid #000;
    margin-right: .5rem;
}

label > input[type="checkbox"]:checked + span {
    background-color: #666;
}

<label>
    <input type="checkbox" />
    <span>&nbsp;</span>Label text
</label>

1

Poiché i browser come Edge e Firefox non supportano: prima: dopo i tag di input della casella di controllo, ecco un'alternativa puramente con HTML e CSS. Ovviamente dovresti modificare i CSS in base alle tue esigenze.

Rendi HTML per la casella di controllo in questo modo:

<div class='custom-checkbox'>
    <input type='checkbox' />
    <label>
        <span></span>
        Checkbox label
    </label>
</div>

Applica questo stile alla casella di controllo per modificare l'etichetta colore

<style>
    .custom-checkbox {
        position: relative;
    }
    .custom-checkbox input{
        position: absolute;
        left: 0;
        top: 0;
        height:15px;
        width: 50px;    /* Expand the checkbox so that it covers */
        z-index : 1;    /* the label and span, increase z-index to bring it over */
        opacity: 0;     /* the label and set opacity to 0 to hide it. */
    }
    .custom-checkbox input+label {
        position: relative;
        left: 0;
        top: 0;
        padding-left: 25px;
        color: black;
    }
    .custom-checkbox input+label span {
        position: absolute;  /* a small box to display as checkbox */
        left: 0;
        top: 0;
        height: 15px;
        width: 15px;
        border-radius: 2px;
        border: 1px solid black;
        background-color: white;
    }
    .custom-checkbox input:checked+label { /* change label color when checked */
        color: orange;
    }
    .custom-checkbox input:checked+label span{ /* change span box color when checked */
        background-color: orange;
        border: 1px solid orange;
    }
</style>

1

Sembra che tu possa cambiare il colore della casella di controllo in scala di grigi usando solo CSS.

Quanto segue converte le caselle di controllo da nero a grigio (che era su quello che volevo):

input[type="checkbox"] {
    opacity: .5;
}

questo rende anche il confine leggero. inoltre, non puoi davvero vedere l'assegno se lo controlli.
Rachel S,

1

Implementazione SCSS / SASS

Un approccio più moderno

Per coloro che utilizzano SCSS (o che possono essere facilmente convertiti in SASS), sarà utile quanto segue. In effetti, crea un elemento accanto alla casella di controllo, che è quello che modellerai. Quando si fa clic sulla casella di controllo, il CSS ridisegna l'elemento sorella (al nuovo stile selezionato). Il codice è sotto:

label.checkbox {
  input[type="checkbox"] {
    visibility: hidden;
    display: block;
    height: 0;
    width: 0;
    position: absolute;
    overflow: hidden;

    &:checked + span {
      background: $accent;
    }
  }

  span {
    cursor: pointer;
    height: 15px;
    width: 15px;
    border: 1px solid $accent;
    border-radius: 2px;
    display: inline-block;
    transition: all 0.2s $interpol;
  }
}
<label class="checkbox">
    <input type="checkbox" />
    <span></span>
    Label text
</label>


0

Avvertenza : al momento della stesura di questo documento era vero, ma nel frattempo le cose sono progredite.

I moderni browser AFAIK visualizzano le caselle di controllo utilizzando il controllo del sistema operativo nativo, quindi non c'è modo di modellarle.


30
Potrebbe essere stato vero nel '10, ma non ora, dovresti eliminare questa risposta.
Michał K,

3
È ancora vero: tutti i browser moderni visualizzano le caselle di controllo utilizzando il controllo del sistema operativo nativo. È solo che ci sono alcune nuove tecniche interessanti per aggirare questa limitazione.
Gal

Sì, mi riferivo alla parte "non c'è modo di modellarli" ^^
Joril
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.