J'ai un menu de navigation horizontal, qui est fondamentalement juste un <ul>
avec les éléments placés côte à côte. Je ne définit pas la largeur, mais j'utilise simplement un remplissage, car je voudrais que les largeurs soient définies par la largeur de l'élément de menu. Je mets en gras l'élément actuellement sélectionné.
Le problème est qu'en gras, le mot devient légèrement plus large, ce qui fait que le reste des éléments se déplace légèrement vers la gauche ou la droite. Y a-t-il un moyen intelligent d'empêcher que cela se produise? Quelque chose dans le sens de dire au rembourrage d'ignorer la largeur supplémentaire causée par le gras? Ma première pensée a été de simplement soustraire quelques pixels du rembourrage de l'élément "actif", mais cette quantité varie.
Si possible, j'aimerais éviter de définir une largeur statique sur chaque entrée, puis de centrer par opposition à la solution de remplissage que j'ai actuellement, afin de simplifier les futures modifications des entrées.
Réponses:
J'ai eu le même problème, mais j'ai eu un effet similaire avec un petit compromis, j'ai utilisé text-shadow à la place.
Voici un exemple de travail:
exemple jsfiddle
la source
li:hover {text-shadow: 1px 0 0 black;}
donné lieu à un texte avec un espacement insuffisant entre les lettres. Pour améliorer à nouveau cela, nous avons également définili {letter-spacing: 1px;}
-0.5px 0 #fff, 0.5px 0 #fff
, parce que nous pouvions voir le petit écart entre le texte lui-même et l'ombre. Et aussi lorsque le texte est en gras, il ajoute du poids des deux côtés.La meilleure solution de travail en utilisant :: after
HTML
CSS
Il ajoute un pseudo-élément invisible avec une largeur de texte en gras, provenant d'un
title
attribut.le
text-shadow
solution ne semble pas naturelle sur Mac et n'utilise pas toute la beauté qu'offre le rendu de texte sur Mac .. :)http://jsfiddle.net/85LbG/
Crédit: https://stackoverflow.com/a/20249560/5061744
la source
margin-top
au::after
bloc a résolu cela.La solution la plus portable et la plus agréable visuellement serait d'utiliser
text-shadow
. Cela révise et montre des exemples de la réponse de Thorgeir en utilisant Alexxali et mes propres ajustements:Cela met de minuscules "ombres" en noir (utilisez le nom / code de couleur de votre police au lieu de
black
si nécessaire) sur les deux côtés de chaque lettre en utilisant des unités qui seront correctement mises à l'échelle avec le rendu de la police.Voir par vous-même:
Survolez les lignes rendues pour voir en quoi elles diffèrent du texte standard.
Modifiez le niveau de zoom de votre navigateur ( Ctrl+ +et Ctrl+- ) pour voir comment ils varient.
J'ai ajouté deux autres solutions ici à titre de comparaison: l' astuce d'espacement des lettres de @ cgTag , qui ne fonctionne pas si bien car elle implique de deviner les plages de largeurs de police, et l'astuce de @ workaholic_gangster911 :: après le dessin , qui laisse un espace supplémentaire gênant pour que le texte en gras puisse s'étendre sans pousser les éléments de texte voisins (je place l'attribution après le texte en gras pour que vous puissiez voir comment il ne bouge pas).
À l'avenir, nous aurons plus de polices variables capables de modifier la qualité de la police via
font-variation-settings
. La prise en charge des navigateurs augmente (Chrome 63+, Firefox 62+) mais cela nécessite encore plus que de simples polices standard et peu de polices existantes le prennent en charge.Si vous incorporez une police variable, vous pourrez utiliser CSS comme ceci:
Il existe une démo en direct avec un curseur pour jouer avec différentes notes sur le guide des polices variables de Mozilla. L' introduction de Google aux polices variables sur le Web a un GIF animé démontrant une bascule entre une note élevée et aucune note:
la source
J'ai trouvé que la plupart des polices sont de la même taille lorsque vous ajustez l'espacement des lettres de 1 px.
Bien que cela change la police normale de sorte que chaque lettre ait un espacement de pixels supplémentaire. Pour les menus, les titres sont si courts que cela ne pose pas de problème.
la source
0.98px
ou des fractions plus petites.1px
valeurs relatives comme0.025ex
ou0.0125ex
. Voir ma réponse pour une démonstration en direct.Pour une réponse plus à jour, vous pouvez utiliser
-webkit-text-stroke-width
:Cela évite les pseudo-éléments (ce qui est un plus pour les lecteurs d'écran) et les ombres de texte (qui semblent désordonnées et peuvent toujours créer un léger effet de `` saut '') ou de définir des largeurs fixes (ce qui peut être peu pratique).
Il vous permet également de définir un élément pour qu'il soit plus audacieux que 1px (en théorie, vous pouvez créer une police aussi audacieuse que vous le souhaitez et pourrait également être un entraînement de mauvaise qualité pour créer une version audacieuse d'une police qui n'a pas de gras variante, comme les polices personnalisées ( modifier: les polices variables déprécient cette suggestion ). Cependant, cela devrait être évité car cela rendra probablement certaines polices irrégulières et irrégulières)
Je cela fonctionne certainement dans Edge, Firefox, Chrome et Opera (au moment de la publication) et dans Safari ( modifier: @Lars Blumberg merci de confirmer cela ). Cela ne fonctionne PAS dans IE11 ou en dessous.
Notez également qu'il utilise le
-webkit
préfixe, donc ce n'est pas standard et le support peut être abandonné à l'avenir, alors ne vous fiez pas à cela, c'est vraiment important - il est préférable d'éviter cette technique à moins qu'elle ne soit simplement esthétique.la source
Malheureusement, le seul moyen d'éviter que la largeur change lorsque le texte est en gras est de définir la largeur de l'élément de liste, mais comme vous l'avez indiqué, cela prend du temps et n'est pas évolutif.
La seule chose à laquelle je peux penser est d'utiliser du javascript qui calcule la largeur de l'onglet avant qu'il ne soit en gras, puis applique la largeur en même temps que le gras est requis (soit lorsque vous survolez ou cliquez).
la source
Utilisez JavaScript pour définir une largeur fixe du li en fonction du contenu non plié, puis mettez le contenu en gras en appliquant un style à la
<a>
balise (ou ajoutez une étendue si le<li>
n'a pas d'enfants).la source
C'est une question très ancienne, mais je la revisite car j'ai eu ce problème dans une application que je développe et j'ai trouvé toutes les réponses voulues.
(Passer ce paragraphe pour le TL; DR ...)J'utilise la police Web Gotham de cloud.typography.com, et j'ai des boutons qui commencent creux (avec une bordure / texte blanc et un fond transparent) et acquièrent une couleur d'arrière-plan en survol. J'ai trouvé que certaines des couleurs d'arrière-plan que j'utilisais ne contrastaient pas bien avec le texte blanc, donc je voulais changer le texte en noir pour ces boutons, mais - que ce soit à cause d'une astuce visuelle ou des méthodes d'anti-aliasing courantes - sombre le texte sur fond clair semble toujours plus léger que le texte blanc sur fond sombre. J'ai trouvé que l'augmentation du poids de 400 à 500 pour le texte sombre maintenait presque exactement le même poids «visuel». Cependant, cela augmentait la largeur du bouton d'une toute petite quantité - une fraction de pixel - mais c'était suffisant pour que les boutons semblent légèrement «vaciller», ce dont je voulais me débarrasser.
Solution:
De toute évidence, il s'agit d'un problème très délicat, il a donc fallu une solution capricieuse. En fin de compte, j'ai utilisé un négatif
letter-spacing
sur le texte plus audacieux comme cgTag recommandé ci-dessus, mais 1px aurait été bien excessif, alors j'ai juste calculé exactement la largeur dont j'aurais besoin.En inspectant le bouton dans Chrome devtools, j'ai constaté que la largeur par défaut de mon bouton était de 165,47 pixels et de 165,69 pixels en survol, une différence de 0,22 pixels. Le bouton avait 9 caractères, donc:
0,22 / 9 = 0,024444px
En convertissant cela en unités em, je pourrais rendre le réglage de la taille de la police agnostique. Mon bouton utilisait une taille de police de 16 pixels, donc:
0,024444 / 16 = 0,001527em
Donc, pour ma police particulière, le CSS suivant garde les boutons exactement de la même largeur en survol:
Avec un peu de test et en utilisant la formule ci-dessus, vous pouvez trouver exactement le bon
letter-spacing
valeur pour votre situation, et cela devrait fonctionner quelle que soit la taille de la police.La seule mise en garde est que différents navigateurs utilisent des calculs de sous-pixels légèrement différents, donc si vous visez ce niveau OCD de précision sub-pixel-perfect, vous devrez répéter le test et définir une valeur différente pour chaque navigateur. Les styles CSS ciblés par navigateur sont généralement mal vus , pour une bonne raison, mais je pense que c'est un cas d'utilisation où c'est la seule option qui a du sens.
la source
Question interessante. Je suppose que vous utilisez float, non?
Eh bien, je ne connais aucune technique que vous pouvez utiliser pour vous débarrasser de cet agrandissement de la police, par conséquent, ils essaieront de s'adapter à la largeur minimale requise - et une épaisseur de police variable changera cette valeur.
La solution unique que je connais pour éviter ce changement est celle que vous avez dit ne pas vouloir: définir des tailles fixes sur li.
la source
Vous pouvez l'implémenter comme le menu déroulant "Magasiner par département" sur amazon.com. Il utilise une division large. Vous pouvez créer une division large et masquer sa partie droite
la source
MISE À JOUR: J'ai dû utiliser la balise B pour le titre car dans IE11 la pseudo classe i: after ne s'affichait pas quand j'avais visibilité: hidden.
Dans mon cas, je veux aligner une case à cocher / radio d'entrée (conçue sur mesure) avec le texte d'étiquette où le texte devient gras lorsque l'entrée est cochée.
La solution fournie ici ne fonctionnait pas pour moi dans Chrome. L'alignement vertical de l'entrée et de l'étiquette a été perturbé par la classe: after psuedo et -margins n'a pas résolu ce problème.
Voici un correctif qui ne pose aucun problème avec les alignements verticaux.
la source