J'ai créé un menu horizontal en utilisant une liste HTML et CSS. Tout fonctionne comme il se doit, sauf lorsque vous survolez les liens. Vous voyez, j'ai créé un état de survol en gras pour les liens, et maintenant les liens de menu changent en raison de la différence de taille en gras.
Je rencontre le même problème que ce message SitePoint . Cependant, le poste n'a pas de solution appropriée. J'ai cherché une solution partout et je n'en trouve pas. Je ne peux sûrement pas être le seul à essayer de faire ça.
Quelqu'un a-t-il une idée?
PS: Je ne connais pas la largeur du texte dans les éléments de menu, donc je ne peux pas simplement définir la largeur des éléments li.
.nav { margin: 0; padding: 0; }
.nav li {
list-style: none;
display: inline;
border-left: #ffffff 1px solid;
}
.nav li a:link, .nav li a:visited {
text-decoration: none;
color: #000;
margin-left: 8px;
margin-right: 5px;
}
.nav li a:hover{
text-decoration: none;
font-weight: bold;
}
.nav li.first { border: none; }
<ul class="nav">
<li class="first"><a href="#">item 0</a></li>
<li><a href="#">item 1</a></li>
<li><a href="#">item 2</a></li>
<li><a href="#">item 3</a></li>
<li><a href="#">item 4</a></li>
</ul>
margin-top: -1px
à:after
pour éviter de créer un espace de 1px de hauteur.:
vs::
"Tous les navigateurs qui prennent en charge la::
syntaxe CSS3 à deux points ne prennent également en charge que la:
syntaxe, mais IE 8 ne prend en charge que les deux-points. Pour l'instant, il est recommandé d'utiliser simplement les deux-points pour une meilleure prise en charge du navigateur." css-tricks.com/almanac/selectors/a/after-and-beforeUL
oua::after
, en d'autres termes - réinitialiser tous les rembourrages / marges / hauteurs de ligne / tailles de police, etc.Une solution compromise consiste à simuler le gras avec du texte, par exemple:
Pour une meilleure comparaison, j'ai créé ces exemples:
Le passage à
text-shadow
une valeur vraiment faibleblur-radius
rendra l'effet de flou moins apparent.En général, plus vous répétez,
text-shadow
plus votre texte sera audacieux, mais en même temps, il perdra la forme originale des lettres.Je dois vous avertir que la définition des
blur-radius
fractions ne rendra pas la même chose dans tous les navigateurs! Safari, par exemple, a besoin de valeurs plus élevées pour le rendre de la même manière que Chrome.la source
Si vous ne pouvez pas définir la largeur, cela signifie que la largeur changera lorsque le texte sera en gras. Il n'y a aucun moyen d'éviter cela, sauf par des compromis tels que la modification du remplissage / des marges pour chaque état.
la source
Une autre idée utilise
letter-spacing
la source
Une ligne en jquery:
edit: Bien que cela puisse apporter la solution, il convient de mentionner que cela ne fonctionne pas en conjonction avec le code dans le message d'origine. "display: inline" doit être remplacé par des paramètres flottants pour qu'un réglage de largeur soit efficace et que ce menu horizontal fonctionne comme prévu.
la source
ul.nav li a
par desa
œuvres?Solution CSS3 - Expérimentale
(Fausse audace)Pensé à partager une solution différente que personne n'a suggérée ici. Il y a une propriété appelée
text-stroke
qui sera utile pour cela.Ici, je cible le texte à l'intérieur de la
span
balise et nous le frappons d'un pixel avecblack
lequel simulera lebold
style de ce texte particulier.Notez que cette propriété n'est pas largement prise en charge, pour l'instant (lors de la rédaction de cette réponse), seuls Chrome et Firefox semblent le prendre en charge. Pour plus d'informations sur la prise en charge du navigateur pour
text-stroke
, vous pouvez vous référer à CanIUse .Juste pour partager des trucs supplémentaires, vous pouvez les utiliser
-webkit-text-stroke-width: 1px;
si vous ne cherchez pas à définir uncolor
pour votre AVC.la source
Vous pouvez utiliser quelque chose comme
puis dans votre css, définissez simplement le contenu de l'intervalle en gras et masquez-le avec visibilité: caché, afin qu'il conserve ses dimensions. Ensuite, vous pouvez ajuster les marges des éléments suivants pour les adapter correctement.
Je ne sais pas si cette approche est compatible avec le référencement.
la source
Je viens de résoudre le problème avec la solution "fantôme". Cela semble le plus simple et le plus efficace.
Pas besoin de répéter l'ombre trois fois (le résultat était le même pour moi).
la source
J'ai eu un problème similaire au vôtre. Je voulais que mes liens deviennent audacieux lorsque vous les survolez, non seulement dans le menu mais aussi dans le texte. Comme vous pouvez le deviner, ce serait une vraie corvée de découvrir toutes les différentes largeurs. La solution est assez simple:
Créez une boîte qui contient le texte du lien en gras mais coloré comme votre arrière-plan et mais votre vrai lien au-dessus. Voici un exemple de ma page:
CSS:
Bien sûr, vous devez remplacer # FFFFE0 par la couleur d'arrière-plan de votre page. Les z-indices ne semblent pas nécessaires mais je les mets quand même (car l'élément "hypo" apparaîtra après l'élément "hyper" dans le code HTML). Maintenant, pour mettre un lien sur votre page, incluez les éléments suivants:
HTML:
Le deuxième "ici" sera invisible et caché sous votre lien. Comme il s'agit d'une boîte statique avec le texte de votre lien en gras, le reste de votre texte ne se déplacera plus car il est déjà déplacé avant de passer la souris sur le lien.
J'espère que j'ai pu aider :).
Si longtemps
la source
Vous pouvez travailler avec la propriété "margin":
Assurez-vous simplement que les marges gauche et droite sont suffisamment grandes pour que l'espace supplémentaire puisse contenir le texte en gras. Pour les mots longs, vous pouvez choisir différentes marges. C'est juste une autre solution de contournement, mais faire le travail pour moi.
la source
J'aime plutôt utiliser text-shadow. Surtout parce que vous pouvez utiliser des transitions pour animer l'ombre du texte.
Tout ce dont vous avez vraiment besoin est:
Pour une navigation complète, consultez ce jsfiddle: https://jsfiddle.net/831r3yrb/
Prise en charge du navigateur et plus d'informations sur text-shadow: http://www.w3schools.com/cssref/css3_pr_text-shadow.asp
la source
Je déconseille de changer de police (°) en survol. Dans ce cas, ce sont juste les éléments de menu qui bougent un peu, mais j'ai vu des cas où le paragraphe complet est reformaté parce que l'élargissement provoque un retour à la ligne supplémentaire. Vous ne voulez pas que cela se produise lorsque la seule chose que vous faites est de déplacer le curseur; si vous ne faites rien, la mise en page ne devrait pas changer.
Le décalage peut également se produire lors du basculement entre normal et italique. J'essaierais de changer les couleurs ou d'activer le soulignement si vous avez de la place sous le texte. (le soulignement doit rester éloigné de la bordure inférieure)
Je serais hué si j'utilisais des polices de commutation pour ma classe de conception de formulaire :-)
(°) Le mot police est souvent mal utilisé. "Verdana" est une police de caractères , "Verdana normal" et "Verdana bold" sont des polices différentes de la même police de caractères.
la source
la source
J'utilise la solution text-shadow comme certaines autres mentionnées ici:
la différence est que je ne spécifie pas la couleur de l'ombre, donc cette solution est universelle pour toutes les couleurs de police.
la source
Une autre approche consisterait à "émuler" du texte en gras via text-shadow. Cela a le bonus (/ malus, selon votre cas) pour fonctionner également sur les icônes de police.
Un peu hacky, même si cela vous évite de dupliquer du texte (ce qui est utile si c'est beaucoup, comme c'était le cas dans mon cas).
la source
C'est la solution que je préfère. Cela nécessite un peu de JS mais vous n'avez pas besoin que votre propriété title soit exactement la même et votre CSS peut rester très simple.
la source
Et ça? Une solution sans Javascript - CSS3.
http://jsfiddle.net/u1aks77x/1/
la source
Solution pas très élégante, mais "qui marche":
la source
J'ai combiné un tas de techniques ci-dessus pour fournir quelque chose qui ne craint pas totalement avec js désactivé et qui est encore mieux avec un peu de jQuery. Maintenant que les navigateurs prennent en charge l'espacement des lettres sous-pixels s'améliore, il est vraiment agréable de l'utiliser.
la source
Il vaut mieux utiliser un :: avant au lieu d' un :: après comme ceci:
Pour plus de détails: https://jsfiddle.net/r25foavy/
la source
a::before
serait mieux quea::after
? Cela semble être un élément clé de votre réponse, mais il n'est pas évident pourquoi l'un est préférable à l'autre dans ce cas.J'ai corrigé le menu lorsque je survole un succès audacieux. Il supporte responsive, voici mon code:
la source
Si vous n'êtes pas opposé à l'utilisation de Javascript, vous pouvez définir la bonne largeur une fois la page affichée. Voici comment je l'ai fait (en utilisant Prototype):
la source
Je ne peux vraiment pas le supporter quand quelqu'un vous dit de ne pas faire quelque chose de cette façon quand il y a une solution simple au problème. Je ne suis pas sûr des éléments li, mais je viens de résoudre le même problème. J'ai un menu composé de balises div.
Définissez simplement la balise div sur "display: inline-block". Inline afin qu'ils s'assoient côte à côte et bloquent pour que vous puissiez définir une largeur. Il suffit de définir la largeur suffisamment large pour accueillir le texte en gras et aligner le centre du texte.
(Remarque: il semble supprimer mon code HTML [ci-dessous], mais chaque élément de menu était entouré d'une balise div avec l'ID correspondant et le nom de classe SearchBar_Cateogory.
<div id="ROS_SearchSermons" class="SearchBar_Category">
HTML (j'avais des balises d'ancrage enroulées autour de chaque élément de menu, mais je n'ai pas pu les soumettre en tant que nouvel utilisateur)
CSS:
la source
essaye ça:
la source
Vous pouvez également essayer les marges négatives si le texte en gras est plus large que le texte normal. (pas toujours) L'idée est donc d'utiliser des classes à la place pour styliser l'état: hover.
jQuery:
CSS:
J'espère que je pourrais aider!
la source