973 votes

Comment styliser une case à cocher en utilisant CSS

Je essaie de styler une case à cocher en utilisant le code suivant :

Mais le style n'est pas appliqué. La case à cocher affiche toujours son style par défaut. Comment lui donner le style spécifié ?

1 votes

Je pense que vous cherchez quelque chose comme ceci: asimishaq.com/myfiles/image-checkbox Voir ce post: stackoverflow.com/questions/16352864/…

1 votes

0 votes

J'ai écrit un tutoriel sur la personnalisation des cases à cocher et des boutons radio avec uniquement du CSS, ainsi que sur la création d'interrupteurs marche/arrêt. Jetez-y un coup d'œil!

874voto

Jacob Mattison Points 32137

MISE À JOUR:

La réponse ci-dessous fait référence à l'état des choses avant la disponibilité généralisée de CSS 3. Dans les navigateurs modernes (y compris Internet Explorer 9 et ultérieur), il est plus facile de créer des remplacements de cases à cocher avec votre style préféré, sans utiliser JavaScript.

Voici quelques liens utiles:

Il convient de noter que le problème fondamental n'a pas changé. Vous ne pouvez toujours pas appliquer des styles (bordures, etc.) directement à l'élément de case à cocher et avoir ces styles affecter l'affichage de la case à cocher HTML. Ce qui a changé, cependant, c'est qu'il est maintenant possible de masquer la case à cocher réelle et de la remplacer par un élément stylisé de votre choix, en n'utilisant que du CSS. En particulier, parce que CSS a maintenant un sélecteur largement pris en charge :checked, vous pouvez faire en sorte que votre remplacement reflète correctement le statut coché de la case.


ANCIENNE RÉPONSE

Voici un article utile sur le style des cases à cocher. Fondamentalement, l'auteur a constaté que cela varie énormément d'un navigateur à l'autre, et que de nombreux navigateurs affichent toujours la case à cocher par défaut, peu importe comment vous la stylisez. Il n'y a donc pas vraiment de solution facile.

On peut facilement imaginer une solution de contournement où vous utiliseriez JavaScript pour superposer une image sur la case à cocher et faire en sorte que les clics sur cette image cochent réellement la case à cocher. Les utilisateurs sans JavaScript verraient la case à cocher par défaut.

Edité pour ajouter: voici un bon script qui fait cela pour vous; il masque l'élément de case à cocher réel, le remplace par un span stylisé et redirige les événements de clic.

47 votes

Cette réponse devient obsolète! Le lien principal mène à un site comparant les styles d'IE6 et d'IE7...

7 votes

Point juste - et le point de base n'est plus vraiment vrai, dans les navigateurs modernes. J'ai mis à jour avec quelques liens plus récents, mais j'ai laissé l'original comme ressource pour les anciens navigateurs.

3 votes

Générateur de cases à cocher CSS facile, était vraiment facile et convivial pour les débutants. Livré avec une interface graphique conviviale pour une création personnalisée! Bien apprécié. :)

159voto

Josh Mc Points 1408

Vous pouvez obtenir un effet de case à cocher personnalisé assez cool en utilisant les nouvelles capacités fournies par les pseudo-classes :after et :before. L'avantage de cela est que vous n'avez pas besoin d'ajouter quoi que ce soit de plus au DOM, juste la case à cocher standard.

Remarque : cela fonctionnera uniquement pour les navigateurs compatibles. Je crois que cela est lié au fait que certains navigateurs ne permettent pas de définir les pseudo-classes :after et :before sur les éléments d'entrée. Cela signifie malheureusement que, pour le moment, seuls les navigateurs WebKit sont pris en charge. Firefox + Internet Explorer permettront toujours aux cases à cocher de fonctionner, simplement sans style, et cela changera espérons-le à l'avenir (le code n'utilise pas de préfixes de vendeur).

Il s'agit d'une solution pour les navigateurs WebKit uniquement (Chrome, Safari, navigateurs mobiles)

Voir l'exemple sur Fiddle

$(function() {
  $('input').change(function() {
    $('div').html(Math.random());
  });
});

/* Classes principales */
.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;
}

/* Grandes cases à cocher */
.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;
}

/* Case à cocher personnalisée */
.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%);
}

    Normal :

    Petit :

    Grand :

    Icône personnalisée :

Fiddle de style flipswitch WebKit Bonus

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

corps {
  police de caractères : arial;
}

.flipswitch {
  position : relative;
  fond : blanc;
  largeur : 120px;
  hauteur : 40px;
  -webkit-appearance : initial;
  border-radius : 3px;
  -webkit-tap-highlight-color : rgba(0, 0, 0, 0);
  contour : aucun;
  taille de la police : 14px;
  police de caractères : Trebuchet, Arial, sans-serif;
  poids de la police : gras;
  curseur : pointer;
  bordure : 1px solide #ddd;
}

.flipswitch:after {
  position : absolute;
  haut : 5%;
  display : block;
  line-height : 32px;
  largeur : 45%;
  hauteur : 90%;
  fond : #fff;
  box-sizing : border-box;
  text-align : center;
  transition : tout 0.3s facilité 0s;
  couleur : noir;
  bordure : #888 1px solide;
  border-radius : 3px;
}

.flipswitch:after {
  gauche : 2%;
  contenu : "OFF";
}

.flipswitch:checked:after {
  gauche : 53%;
  contenu : "ON";
}

Case à cocher / flipswitch de style mobile amical pour WebKit

11 votes

Firefox 33.1/Linux: Le fiddle montre simplement des cases à cocher par défaut. Rien ne semble différent.

2 votes

@robsch Cela est clairement indiqué dans le message d'origine. La version de Firefox ou du système d'exploitation est sans importance, cela ne fonctionne pas dans Firefox. "FF + IE permettront toujours aux cases à cocher de fonctionner, simplement non stylées..."

0 votes

Une bonne approche. Mais tous les navigateurs ne le font pas bien. Seul Chrome a le meilleur rendu selon ce que j'ai examiné.

151voto

Blake Pettersson Points 3431

Il existe un moyen de faire cela en utilisant uniquement du CSS. Nous pouvons (ab)user de l'élément label et styliser cet élément à la place. L'inconvénient est que cela ne fonctionnera pas pour Internet Explorer 8 et les versions inférieures.

.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 my styled "checkbox"

0 votes

@GandalfStormCrow cela fonctionnera pour n'importe quel navigateur qui prend en charge la pseudo-classe :checked, que IE8 ne prend PAS en charge. Vous pouvez vérifier si cela fonctionne avec selectivizr.com - qui ajoute le support pour :checked et ses amis.

0 votes

En d'autres termes, IE9 et les versions ultérieures prennent en charge :checked.

1 votes

Il existe un polyfill pour IE8 et inférieur: github.com/rdebeasi/checked-polyfill

30voto

Jake Points 741

Vous pouvez styliser les cases à cocher avec un petit tour de passe-passe en utilisant l'élément label comme dans l'exemple ci-dessous:

.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;
}

Et un FIDDLE pour le code ci-dessus. Notez que certains CSS ne fonctionnent pas dans les anciennes versions des navigateurs, mais je suis sûr qu'il existe des exemples de JavaScript sophistiqués là-bas!

0 votes

Comment l'utiliser lorsque la case à cocher a son propre libellé ?

0 votes

@Métaphore Ajoutez simplement une deuxième étiquette. Vous pouvez appliquer plusieurs étiquettes au même élément (par exemple, elles peuvent utiliser la même valeur d'attribut for).

20voto

cobberboy Points 326

Je préfère utiliser des polices d'icônes (comme FontAwesome) car il est facile de modifier leurs couleurs avec CSS, et elles s'adaptent très bien aux appareils à haute densité de pixels. Voici donc une autre variante pure en CSS, utilisant des techniques similaires à celles ci-dessus.

(Ci-dessous se trouve une image statique pour que vous puissiez visualiser le résultat; consultez le JSFiddle pour une version interactive.)

Exemple de case à cocher

Tout comme d'autres solutions, cela utilise l'élément label. Un span adjacent contient notre caractère de case à cocher.

span.bigcheck-target {
  font-family: FontAwesome; /* Utilise une police d'icônes pour la case à cocher */
}

input[type='checkbox'].bigcheck {
  position: relative;
  left: -999em; /* Masquer la vraie case à cocher */
}

input[type='checkbox'].bigcheck + span.bigcheck-target:after {
  content: "\f096"; /* Dans FontAwesome, c'est un carré ouvert (fa-square-o) */
}

input[type='checkbox'].bigcheck:checked + span.bigcheck-target:after {
  content: "\f046"; /* Case à cocher cochée dans FontAwesome (fa-check-square-o) */
}

/* ==== Optionnel - couleurs et marge pour un rendu agréable === */
body {
  background-color: #2C3E50;
  color: #D35400;
  font-family: sans-serif;
  font-weight: 500;
  font-size: 4em; /* Réglez ceci à la taille souhaitée */
}

span.bigcheck {
  display: block;
  padding: 0.5em;
}

    Fromage

Voici le JSFiddle correspondant.

1 votes

....ce que vous avez décrit est la même chose que les réponses précédentes de Bhushan Wagh, Jake, Jonathan Hodgson et Blake ;)

8 votes

@SW4 J'ai fait référence à ce fait, sauf que cette réponse utilise des polices d'icônes (que aucune des réponses précédentes n'avait). Le premier paragraphe rend cela assez clair.

0 votes

Vous devez remplacer font-family: FontAwesome; par font-family: 'Font Awesome\ 5 Gratuit';, et mettre à jour le contenu unicode si vous voulez le faire fonctionner dans la nouvelle version.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X