C'est l'un des problèmes CSS mineurs qui me tourmente constamment. Comment les gens autour de Stack Overflow s'alignent verticalement checkboxes
et leur cross-browserlabels
cohérent ? Chaque fois que je les aligne correctement dans Safari (généralement sur le ), ils sont complètement désactivés dans Firefox et IE. Corrigez-le dans Firefox, et Safari et IE sont inévitablement foirés. Je perds du temps à chaque fois que je code un formulaire.vertical-align: baseline
input
Voici le code standard avec lequel je travaille:
<form>
<div>
<label><input type="checkbox" /> Label text</label>
</div>
</form>
J'utilise généralement la réinitialisation d'Eric Meyer, donc les éléments de formulaire sont relativement exempts de remplacements. Dans l'attente de tous les conseils ou astuces que vous avez à offrir!
height
etline-height
, jetez un œil à jsfiddle.net/wepw5o57/3position
ettop
résolution de ce problème Exemple: jsfiddle.net/ynkjc22sRéponses:
Après plus d'une heure de peaufinage, de test et d'essais de différents styles de balisage, je pense avoir une solution décente. Les exigences pour ce projet particulier étaient:
Avant d'entrer dans une explication, je vais juste vous donner le code:
Voici l'exemple de travail dans JSFiddle .
Ce code suppose que vous utilisez une réinitialisation comme Eric Meyer qui ne remplace pas les marges et le remplissage d'entrée de formulaire (d'où la réinitialisation de la marge et du remplissage dans le CSS d'entrée). De toute évidence, dans un environnement en direct, vous allez probablement imbriquer / remplacer des éléments pour prendre en charge d'autres éléments d'entrée, mais je voulais que les choses soient simples.
A noter:
*overflow
déclaration est un hack IE en ligne (le hack star-property). IE 6 et 7 le remarqueront, mais Safari et Firefox l'ignoreront correctement. Je pense que ce pourrait être un CSS valide, mais vous êtes toujours mieux avec des commentaires conditionnels; je l'ai utilisé pour plus de simplicité.vertical-align
déclaration qui était cohérente entre les navigateurs étaitvertical-align: bottom
. La définition de ce paramètre et le positionnement relatif vers le haut se sont comportés de manière presque identique dans Safari, Firefox et IE avec seulement un ou deux pixels de différence.overflow: hidden
pour une raison quelconque, coupe l'espace supplémentaire et permet au positionnement d'IE d'agir de manière très similaire à Safari et Firefox.J'espère que ceci aide quelqu'un d'autre! Je n'ai essayé cette technique spécifique sur aucun autre projet que celui sur lequel je travaillais ce matin, alors n'hésitez pas à trouver quelque chose qui fonctionne de manière plus cohérente.
la source
Parfois, l'alignement vertical nécessite deux éléments en ligne (span, label, input, etc ...) côte à côte pour fonctionner correctement. Les cases à cocher suivantes sont correctement centrées verticalement dans IE, Safari, FF et Chrome, même si la taille du texte est très petite ou grande.
Ils flottent tous côte à côte sur la même ligne, mais le nowrap signifie que le texte entier de l'étiquette reste toujours à côté de la case à cocher.
L'inconvénient est les balises SPAN supplémentaires sans signification.
Maintenant, si vous aviez un texte d'étiquette très long qui devait être enveloppé sans être placé sous la case à cocher, vous utiliseriez un remplissage et un retrait de texte négatif sur les éléments d'étiquette:
la source
display: block; float: left;
semble être redondantEn travaillant avec la solution de One Crayon , j'ai quelque chose qui fonctionne pour moi et qui est plus simple:
Rend pixel par pixel la même chose dans Safari (dont je fais confiance à la ligne de base) et Firefox et IE7 sont tous les deux aussi bons. Il fonctionne également pour différentes tailles de police d'étiquette, grandes et petites. Maintenant, pour fixer la ligne de base d'IE sur les sélections et les entrées ...
Mise à jour: (modification tierce)
La
bottom
position correcte dépend de la famille de polices et de la taille de police! J'ai trouvé que l'utilisationbottom: .08em;
de la case à cocher et des éléments radio est une bonne valeur générale. Je l'ai testé dans Chrome / Firefox / IE11 sous Windows avec les polices Arial et Calibri en utilisant plusieurs tailles de police petites / moyennes / grandes.la source
Une chose simple qui semble bien fonctionner est d'appliquer un réglage de la position verticale de la case à cocher avec alignement vertical. Il variera toujours d'un navigateur à l'autre, mais la solution n'est pas compliquée.
Référence
la source
vertical-align
etposition: relative
parce qu'il fonctionne également correctement dans IE9 :)em
essayer
vertical-align: middle
aussi votre code semble qu'il devrait être:
la source
<label for="blah">
n'est nécessaire que si vous utilisez quelque chose où il n'est pas logique que l'étiquette soit enveloppée (comme une zone de texte; je l'utilise généralement<label for="blah">Foo</label><input id="blah" type="text" />
dans ce cas). Avec les cases à cocher, je trouve que c'est moins de balisage pour l'envelopper.Essayez ma solution, je l'ai essayée dans IE 6, FF2 et Chrome et elle rend pixel par pixel dans les trois navigateurs.
la source
La seule solution qui fonctionne parfaitement pour moi est:
Testé aujourd'hui dans Chrome, Firefox, Opera, IE 7 et 8. Exemple: Fiddle
la source
Je n'ai pas complètement testé ma solution, mais elle semble très bien fonctionner.
Mon HTML est simplement:
J'ai ensuite défini toutes les cases à cocher
24px
pour la hauteur et la largeur. Pour rendre le texte aligné je fais l'étiquette estline-height
aussi24px
et assignvertical-align: top;
comme ceci:EDIT: Après les tests IE, j'ai ajouté
vertical-align: bottom;
à l'entrée et changé le CSS du label. Vous pouvez trouver que vous avez besoin d'un cas css IE conditionnel pour trier le remplissage - mais le texte et la boîte sont en ligne.Si quelqu'un constate que cela ne fonctionne pas, veuillez me le faire savoir. Le voici en action (dans Chrome et IE - excuses car des captures d'écran ont été prises sur la rétine et en utilisant des parallèles pour IE):
la source
J'utilise généralement la hauteur de ligne afin d'ajuster la position verticale de mon texte statique:
J'espère que cela pourra aider.
la source
L'astuce consiste à utiliser l'alignement vertical uniquement dans les cellules du tableau ou le bloc en ligne si vous utilisez une étiquette d'étiquette.
la source
Jetons enfin un œil à 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 avec l'inspecteur DOM:
Et voici la même case à cocher sans style dans Chrome:
Vous pouvez voir la marge (orange); le rembourrage n'est pas présent (serait affiché en vert). Alors, quelle est cette pseudo-marge à droite et en bas de la case à cocher? Ce sont des parties de l'image utilisées pour la case à cocher . C'est pourquoi l'utilisation
vertical-align: middle
ne suffit pas vraiment et c'est la source des problèmes entre les navigateurs.Alors, que pouvons-nous faire à ce sujet?
Une option évidente est - remplacez les images! Heureusement, on peut le faire via CSS et remplacer ceux-ci par des images externes, des images base64 (en CSS), des svg en CSS ou simplement des pseudo-éléments. C'est une approche robuste (multi-navigateur!), Et voici un exemple d'un tel ajustement dérobé à cette question :
Vous voudrez peut-être lire quelques articles plus approfondis sur un tel style comme certains répertoriés ici ; c'est hors de portée de cette réponse.
Ok, qu'en est-il encore de la solution sans images personnalisées ou pseudo-éléments?
TL; DR: cela ne fonctionnera pas, utilisez plutôt une case à cocher personnalisée
Tout d'abord, notons que si dans d'autres navigateurs ces pseudo-marges à l'intérieur de l'icône de case à cocher étaient arbitraires, il n'y avait pas de solution cohérente. Pour en construire une, nous devons explorer l'anatomie de ces images dans les navigateurs existants.
Alors, quels navigateurs ont les pseudo-marges dans les cases à cocher? J'ai vérifié Chrome 75, Vivaldi 2.5 (à base de chrome), FireFox 54 (ne demandez pas pourquoi un tel obsolète), IE 11, Edge 42, Safari ?? (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 également tous les navigateurs basés sur Chromium, comme Opera).
Quelle est la taille de ces pseudo-marges? Pour comprendre cela, on peut utiliser une case à cocher zoomée:
mon résultat est ~ 7% de largeur / hauteur et donc 0,9-1,0 px en unités absolues. La précision peut cependant être mise en doute: essayez différentes valeurs de
zoom
pour la case à cocher. Dans mes tests dans Chrome et Vivaldi, la taille relative de la pseudo-marge est très différente auxzoom
valeurs 10, 20 et aux valeurs 11-19 (??):scale
semble être plus cohérent:donc probablement ~ 14% et 2px sont les valeurs correctes.
Maintenant que nous connaissons (?) La taille de la pseudo-marge, notons que cela ne suffit pas. Les tailles des icônes des cases à cocher sont-elles les mêmes pour tous les navigateurs? Hélas! Voici ce que l'inspecteur DOM affiche pour les cases à cocher sans style:
Avant de discuter de solutions ou d'astuces, demandons: qu'est-ce qu'un alignement correct ? Que voulons-nous atteindre? À un certain point, c'est une question de goût, mais en gros, je peux penser aux aspects "sympas" des alignements suivants:
texte et case à cocher sur la même ligne de base (je ne modifie délibérément pas la taille de la case à cocher ici):
ou avoir la même ligne médiane en termes de lettres minuscules:
ou même ligne médiane en termes de lettres majuscules (il est plus facile de voir la différence pour différentes tailles de 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 minuscules et majuscules).
Pour cette discussion, appelons un alignement agréable si la case à cocher est sur la même ligne de base que le texte et a la taille d'une lettre majuscule (un choix très discutable):
Maintenant, quels outils devons-nous:
?
En ce qui concerne l' ajustement de la taille des cases à cocher : il y a
width
,height
,size
,zoom
,scale
(ai - je raté quelque chose?).zoom
etscale
ne permettent pas de définir la taille absolue, ils peuvent donc aider uniquement à ajuster la taille du texte, pas définir la taille multi-navigateur (sauf si nous pouvons écrire des règles spécifiques au navigateur).size
ne fonctionne pas avec Chrome (est-ce que cela fonctionnait avec l'ancien IE? de toute façon, ce n'est pas si intéressant).width
etheight
fonctionne dans Chrome et d'autres navigateurs, afin que nous puissions définir une taille commune, mais encore une fois, dans Chrome, il définit la taille de l'image entière, pas la case à cocher elle-même. Remarque: c'est le minimum (largeur, hauteur) qui définit la taille d'une case à cocher (si largeur ≠ hauteur, la zone en dehors du carré de case à cocher est ajoutée à la "pseudo-marge").Une chose regrettable est que les pseudo-marges dans la case à cocher Chrome ne sont pas définies sur zéro pour toute largeur et hauteur, pour autant que je puisse voir.
Je crains qu'il n'y ait pas de méthode fiable uniquement en CSS de nos jours.
Considérons l'alignement vertical.
vertical-align
ne peut pas donner de résultats cohérents lorsqu'il est défini surmiddle
ou àbaseline
cause 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 surtop
:(sur l'image: alignement vertical: haut, bas et bas sans boîte-ombre)
Alors, quel résultat en tirons-nous?
L'extrait ci-dessus fonctionne avec Chrome (navigateurs à base de chrome), mais les autres navigateurs nécessitent une taille de case à cocher plus petite. Il semble impossible d'ajuster à la fois la taille et l'alignement vertical de manière à contourner la bizarrerie de l'image de la case à cocher de Chromium. Ma dernière suggestion est: utilisez plutôt des cases à cocher personnalisées - et vous éviterez la frustration :)
la source
Maintenant que flexbox est pris en charge dans tous les navigateurs modernes, quelque chose comme ça semble être une approche plus facile pour moi.
Voici la démo complète de la version préfixée:
Afficher l'extrait de code
la source
Je pense que c'est le moyen le plus simple
la source
Je n'aime pas le positionnement relatif, car il rend l'élément rendu au-dessus de tout le reste à son niveau (il peut aller au-dessus de quelque chose si vous avez une disposition complexe).
J'ai découvert que les
vertical-align: sub
cases à cocher sont suffisamment alignées dans Chrome, Firefox et Opera. Impossible de vérifier Safari car je n'ai pas MacOS et IE10 est légèrement éteint, mais j'ai trouvé que c'était une assez bonne solution pour moi.Une autre solution pourrait être d'essayer de créer des CSS spécifiques pour chaque navigateur et de les affiner avec un alignement vertical en% / pixels / EM: http://css-tricks.com/snippets/css/browser-specific-hacks/
la source
Cela fonctionne bien pour moi:
la source
La réponse choisie avec plus de 400 votes positifs n'a pas fonctionné pour moi dans Chrome 28 OSX, probablement parce qu'elle n'a pas été testée dans OSX ou qu'elle a fonctionné dans tout ce qui existait en 2008 lorsque cette question a été répondue.
Les temps ont changé et de nouvelles solutions CSS3 sont désormais possibles. Ma solution utilise des pseudo-éléments pour créer une case à cocher personnalisée . Ainsi, les stipulations (pour ou contre, quelle que soit la façon dont vous les regardez) sont les suivantes:
Cette solution masque la case à cocher et ajoute et stylise des pseudo-éléments à l'étiquette pour créer la case à cocher visible. Étant donné que l'étiquette est liée à la case à cocher masquée, le champ de saisie sera toujours mis à jour et la valeur sera soumise avec le formulaire.
Et si vous êtes intéressé, voici mon point de vue sur les boutons radio: http://jsfiddle.net/DtKrV/2/
J'espère que quelqu'un trouve cela utile!
la source
Je n'ai jamais eu de problème avec ça:
la source
Si vous utilisez des formulaires Web ASP.NET, vous n'avez pas à vous soucier des DIV et d'autres éléments ou des tailles fixes. Nous pouvons aligner le
<asp:CheckBoxList>
texte en définissantfloat:left
le type d'entrée CheckboxList en CSS.Veuillez vérifier l'exemple de code suivant:
Code .ASPX:
la source
Si vous utilisez Twitter Bootstrap, vous pouvez simplement utiliser la
checkbox
classe sur<label>
:la source
Avec une case à cocher de type d'entrée enveloppée à l'intérieur de l'étiquette et flottant vers la gauche comme suit:
cela a fonctionné pour moi:
Assurez-vous que la hauteur du est identique à la hauteur de ligne du (niveau de bloc).
la source
Codez en dur la hauteur et la largeur de la case à cocher, supprimez son rembourrage et faites sa hauteur plus les marges verticales égales à la hauteur de ligne de l'étiquette. Si le texte de l'étiquette est en ligne, faites flotter la case. Firefox, Chrome et IE7 + rendent tous l'exemple suivant identique: http://www.kornea.com/css-checkbox-align
la source
la source
Je laisse généralement une case à cocher sans étiquette, puis je fais de son "étiquette" un élément distinct. C'est une douleur, mais il y a tellement de différences entre les navigateurs entre la façon dont les cases à cocher et leurs étiquettes sont affichées (comme vous l'avez remarqué) que c'est la seule façon dont je peux me rapprocher de contrôler à quoi tout ressemble.
Je finis également par le faire dans le développement de winforms, pour la même raison. Je pense que le problème fondamental avec le contrôle de case à cocher est qu'il s'agit vraiment de deux contrôles différents: la case et l'étiquette. En utilisant une case à cocher, vous laissez le soin aux implémenteurs du contrôle de décider comment ces deux éléments sont affichés côte à côte (et ils se trompent toujours, où mauvais = pas ce que vous voulez).
J'espère vraiment que quelqu'un aura une meilleure réponse à votre question.
la source
CSS:
HTML:
Le code ci-dessus placera vos éléments de liste dans trois colonnes et modifiera simplement les largeurs en fonction.
la source
Ce qui suit donne une cohérence parfaite au pixel près entre les navigateurs, même IE9:
L'approche est assez sensée, au point d'être évidente:
Il en résulte une règle générale applicable à l'échelle mondiale:
Avec une taille de police adaptable par formulaire, jeu de champs ou élément.
Testé dans les derniers Chrome, Safari et Firefox sur Mac, Windows, Iphone et Android. Et IE9.
Cette méthode est probablement applicable à tous les types d'entrée qui ne dépassent pas une ligne de texte. Appliquez une règle de type à votre convenance.
la source
Je sais donc que cela a été répondu à plusieurs reprises, mais je pense que j'ai une solution beaucoup plus élégante que celles qui ont déjà été fournies. Et pas seulement 1 solution élégante, mais 2 solutions distinctes pour chatouiller votre envie. Cela dit, tout ce que vous devez savoir et voir est contenu dans 2 JS Fiddle's, avec des commentaires.
La solution n ° 1 repose sur la "Checkbox" native du navigateur donné, mais avec une torsion ... Elle est contenue dans un div qui est plus facile à positionner entre les navigateurs, avec un débordement: caché pour couper l'excès d'une case à cocher étirée de 1px (c'est donc vous ne pouvez pas voir les vilaines frontières de FF)
HTML simple: (suivez le lien pour revoir le css avec des commentaires, le bloc de code est pour satisfaire stackoverflow) http://jsfiddle.net/KQghJ/
La solution n ° 2 utilise le "Checkbox Toggle Hack" pour basculer l'état CSS d'un DIV, qui a été correctement positionné dans le navigateur, et configuré avec un simple sprite pour les états des cases à cocher non cochées et cochées. Tout ce qui est nécessaire est d'ajuster la position d'arrière-plan avec ladite case à cocher Toggle Hack. À mon avis, c'est la solution la plus élégante, car vous avez plus de contrôle sur vos cases à cocher et radios, et vous pouvez garantir qu'elles se ressemblent dans tous les navigateurs.
HTML simple: (suivez le lien pour revoir le CSS avec des commentaires, le bloc de code est pour satisfaire StackOverflow) http://jsfiddle.net/Sx5M2/
Si quelqu'un n'est pas d'accord avec ces méthodes, laissez-moi un commentaire, j'aimerais entendre des commentaires sur les raisons pour lesquelles d'autres n'ont pas trouvé ces solutions, ou s'ils l'ont, pourquoi je ne vois aucune réponse ici à leur sujet? Si quelqu'un voit une de ces méthodes échouer, ce serait bien de le voir aussi, mais celles-ci ont été testées dans les derniers navigateurs et s'appuient sur des méthodes HTML / CSS qui sont assez anciennes et universelles pour autant que je sache.
la source
Ouais merci! Cela aussi m'a rendu fou pour toujours.
Dans mon cas particulier, cela a fonctionné pour moi:
J'utilise reset.css, ce qui pourrait expliquer certaines des différences, mais cela semble bien fonctionner pour moi.
la source
position: relative;
a quelques problèmes dans IE avec z-index et des animations comme slideUp / slideDown de jQuery.CSS:
jQuery:
Le style a probablement besoin de modifications en fonction de la taille de police utilisée dans
<label>
PS:
J'utilise ie7js pour faire fonctionner le CSS dans IE6.
la source
Utilisez simplement
vertical-align: sub
, comme pokrishka l'a déjà suggéré.Violon
Code HTML:
Code CSS:
la source
Solution simple:
Testé dans Chrome, Firefox, IE9 +, Safari, iOS 9+
la source