Examinons enfin la source du problème.
Les cases à cocher sont rendues à l'aide d'images (on peut en définir des personnalisées via CSS). Voici une case à cocher (non cochée) dans FireFox, mise en évidence par l'inspecteur DOM :
Et voici la même case à cocher non stylisée dans Chrome :
Vous pouvez voir la marge (orange) ; le padding n'est pas présent (il serait affiché en vert). Alors, quelle est cette pseudo-marge à droite et en bas de la case à cocher ? Voici des parties de l'image utilisée pour la case à cocher . C'est pourquoi utiliser seulement vertical-align: middle
ne suffit pas vraiment et c'est la source des problèmes liés aux navigateurs croisés.
Alors, que pouvons-nous faire à ce sujet ?
Une option évidente est de remplacer les images ! Heureusement, on peut le faire via CSS et les remplacer par des images externes, des images base64 (in-CSS), des svg in-CSS ou simplement des pseudo-éléments. Il s'agit d'une approche robuste (multi-navigateurs !), et voici un exemple d'ajustement volé à cette question :
.checkbox-custom {
opacity: 0;
position: absolute;
}
.checkbox-custom,
.checkbox-custom-label {
display: inline-block;
vertical-align: middle;
margin: 5px;
cursor: pointer;
}
.checkbox-custom + .checkbox-custom-label:before {
content: '';
display: inline-block;
background: #fff;
border-radius: 5px;
border: 2px solid #ddd;
vertical-align: middle;
width: 10px;
height: 10px;
padding: 2px;
margin-right: 10px;
text-align: center;
}
.checkbox-custom:checked + .checkbox-custom-label:before {
width: 1px;
height: 5px;
border: solid blue;
border-width: 0 3px 3px 0;
transform: rotate(45deg);
-webkit-transform: rotate(45deg);
-ms-transform: rotate(45deg);
border-radius: 0px;
margin: 0px 15px 5px 5px;
}
<div>
<input id="checkbox-1" class="checkbox-custom" name="checkbox-1" type="checkbox">
<label for="checkbox-1" class="checkbox-custom-label">First Choice</label>
</div>
<div>
<input id="checkbox-2" class="checkbox-custom" name="checkbox-2" type="checkbox">
<label for="checkbox-2" class="checkbox-custom-label">Second Choice</label>
</div>
Vous voudrez peut-être lire des articles plus approfondis sur ce type de stylisme, comme ceux énumérés ci-dessous. ici ; c'est hors du champ de cette réponse.
Ok, mais qu'en est-il de la solution "pas d'images ou de pseudo-éléments personnalisés" ?
TL;DR : il semble que cela ne fonctionnera pas, utilisez plutôt une case à cocher personnalisée.
Tout d'abord, notons que si dans les autres navigateurs, ces pseudo-marges à l'intérieur de l'icône de la case à cocher étaient arbitraires, il n'existait pas de solution cohérente. Pour en construire une, nous devons explorer l'anatomie de ces images dans les navigateurs existants.
Quels sont les navigateurs qui ont des pseudo-marges dans les cases à cocher ? J'ai vérifié Chrome 75, Vivaldi 2.5 (basé sur Chromium), FireFox 54 (ne demandez pas pourquoi il est si obsolète), IE 11, Edge 42, Safari ? ? (j'en ai emprunté un pour une minute, j'ai oublié de vérifier la version). Seuls Chrome et Vivaldi ont de telles pseudo-marges (je soupçonne tous les navigateurs basés sur Chromium également, comme Opera).
Quelle est la taille de ces pseudo-margeurs ? Pour le savoir, on peut utiliser une case à cocher zoomée :
input {
zoom: 10;
box-shadow: 0 0 1px inset #999;
}
<input type=checkbox>
mon résultat est de ~7% de la largeur/hauteur et donc 0.9-1.0px en unités absolues. La précision peut être remise en question, cependant : essayez différentes valeurs de zoom
pour la case à cocher. Dans mes tests, tant dans Chrome que dans Vivaldi, la taille relative de la pseudo-marge est très différente à zoom
valeurs 10, 20 et aux valeurs 11-19 ( ??):
scale
semble être plus cohérent :
input {
transform: scale(10) translate(50%, 50%);
box-shadow: 0 0 1px inset #999;
}
<input type=checkbox>
donc probablement ~14% et 2px sont les valeurs correctes.
Maintenant que nous connaissons ( ?) la taille de la pseudo-marge, notons que ce n'est pas suffisant. La taille des icônes des cases à cocher est-elle la même pour tous les navigateurs ? Hélas ! voici ce que montre DOM inspector pour les cases à cocher non stylisées :
- FireFox : 13.3px
- A base de chrome : 12,8px pour l'ensemble, d'où 12,8 (100 % - 14 %) = 1,5 million d'euros. 11px pour ce qui est perçu visuellement comme une case à cocher
- IE 11, Edge : 13px
- Safari : n/a (il faudrait les comparer sur le même écran, je crois)
Avant de parler de solutions ou d'astuces, posons la question suivante : qu'est-ce qu'une correct alignement ? Qu'essayons-nous d'atteindre ? Jusqu'à un certain point, c'est une question de goût, mais en gros, je peux penser aux aspects suivants des alignements "agréables" :
le texte et la case à cocher sur la même ligne de base (je ne règle délibérément pas la taille de la case à cocher ici) :
ou ont la même ligne médiane en termes de lettres minuscules :
ou la même ligne médiane en termes de majuscules (il est plus facile de voir la différence selon la taille de la police) :
et nous devons également décider si la taille de la case à cocher doit être égale à la hauteur d'une lettre minuscule, d'une lettre majuscule ou autre (plus grande, plus petite ou entre minuscule et majuscule).
Pour cette discussion, nous dirons que l'alignement est bon si la case à cocher est sur la même ligne de base que le texte et a la taille d'une majuscule (un choix très discutable) :
Maintenant, quels outils avons-nous pour :
- ajuster la taille de la case à cocher
- reconnaître Chromium avec sa case à cocher pseudo-marginée et définir des styles spécifiques
- ajuster l'alignement vertical des cases à cocher/étiquettes
?
-
En ce qui concerne le ajustement de la taille des cases à cocher : il y a width
, height
, size
, zoom
, scale
(ai-je manqué quelque chose ?). zoom
et scale
ne permettent pas de définir la taille absolue, ils ne peuvent donc aider qu'à ajuster la taille du texte, et non à définir la taille pour tous les navigateurs (à moins que nous puissions écrire des règles spécifiques aux navigateurs). size
ne fonctionne pas avec Chrome (cela fonctionnait-il avec l'ancien IE ? de toute façon, ce n'est pas très intéressant). width
et height
fonctionnent dans Chrome et dans d'autres navigateurs, ce qui nous permet de définir une taille commune, mais là encore, dans Chrome, la taille de l'image entière est définie, et non celle de la case à cocher elle-même. Remarque : c'est minimum(width, height) qui définit la taille d'une case à cocher (si width != height, la zone située à l'extérieur du carré de la case à cocher est ajoutée à la "pseudo-marge").
Malheureusement, les pseudo-marges de la case à cocher de Chrome ne sont pas mises à zéro, quelles que soient la largeur et la hauteur, d'après ce que je vois.
-
J'ai peur qu'il n'y ait pas de Méthode uniquement en CSS ces jours-ci.
-
Considérons l'alignement vertical. vertical-align
ne peut pas donner de résultats cohérents lorsqu'il est réglé sur middle
ou baseline
en raison de la pseudo-marge de Chrome, la seule véritable option pour obtenir le même "système de coordonnées" pour tous les navigateurs est d'aligner l'étiquette et l'entrée sur l'élément top
:
(sur l'image : vertical-align : haut, bas et bas sans box-shadow)
Alors quel résultat en tirons-nous ?
input[type="checkbox"] {
height: 0.95em;
width: 0.95em;
}
label, input {
vertical-align: top;
}
<label><input type="checkbox">label</label>
L'extrait ci-dessus fonctionne avec Chrome (les navigateurs basés sur Chromium), mais d'autres navigateurs exigent une taille plus petite de la case à cocher. Il semble impossible d'ajuster à la fois la taille et l'alignement vertical d'une manière qui permette de contourner la bizarrerie de l'image de la case à cocher de Chromium. Ma dernière suggestion est la suivante : utilisez plutôt des cases à cocher personnalisées - et vous éviterez toute frustration :)
9 votes
Placez chaque case à cocher et chaque étiquette dans un élément <li>. Ajoutez overflow:hidden à l'élément <li> et faites flotter l'étiquette et la case à cocher à gauche. Ils s'alignent alors parfaitement. Ne mettez pas la case à cocher dans l'élément label évidemment.
6 votes
J'ai réussi à le faire en utilisant
height
etline-height
attributs, jetez un coup d'œil à jsfiddle.net/wepw5o57/30 votes
Manipulation avec
position
ettop
résoudra ce problème Exemple : jsfiddle.net/ynkjc22s0 votes
2019. toujours le même problème. toujours besoin de quelques bidouillages pour le faire fonctionner :(
0 votes
@dieter voir ma réponse, j'ai expliqué pourquoi les hacks sont nécessaires et quelle approche n'est pas hacky : stackoverflow.com/a/56558431/3995261