Eu tenho um menu de navegação horizontal, que é basicamente apenas um <ul>
com os elementos colocados lado a lado. Não defino largura, mas simplesmente uso preenchimento, porque gostaria que as larguras fossem definidas pela largura do item de menu. Coloco em negrito o item selecionado no momento.
O problema é que, em negrito, a palavra se torna um pouco mais larga, o que faz com que o resto dos elementos se desloquem ligeiramente para a esquerda ou direita. Existe uma maneira inteligente de evitar que isso aconteça? Algo parecido com dizer ao preenchimento para ignorar a largura extra causada pelo negrito? Meu primeiro pensamento foi simplesmente subtrair alguns pixels do preenchimento do elemento "ativo", mas essa quantidade varia.
Se possível, gostaria de evitar definir uma largura estática em cada entrada e, em seguida, centralizar em oposição à solução de preenchimento que tenho atualmente, a fim de simplificar as alterações futuras nas entradas.
Respostas:
Eu tive o mesmo problema, mas obtive um efeito semelhante com um pequeno compromisso, usei a sombra de texto em seu lugar.
Aqui está um exemplo prático:
exemplo jsfiddle
fonte
li:hover {text-shadow: 1px 0 0 black;}
resultou em texto com muito pouco espaçamento entre as letras. Para melhorar isso novamente, também definimosli {letter-spacing: 1px;}
-0.5px 0 #fff, 0.5px 0 #fff
, porque pudemos ver a pequena lacuna entre o próprio texto e a sombra. E também quando o texto está em negrito, adiciona peso a ambos os lados.A melhor solução de trabalho usando :: after
HTML
CSS
Ele adiciona um pseudoelemento invisível com largura de texto em negrito, originado por
title
atributo.A
text-shadow
solução não parece natural no Mac e não utiliza toda a beleza que a renderização de texto no Mac oferece. :)http://jsfiddle.net/85LbG/
Crédito: https://stackoverflow.com/a/20249560/5061744
fonte
margin-top
ao::after
bloco resolveu isso.A solução mais portátil e visualmente agradável seria usar
text-shadow
. Isso revisa e mostra exemplos da resposta de Thorgeir usando os ajustes de Alexxali e meus próprios:Isso coloca pequenas "sombras" em preto (use o nome / código da cor da sua fonte no lugar,
black
se necessário) em ambos os lados de cada letra, usando unidades que serão dimensionadas corretamente com a renderização da fonte.Veja por si mesmo:
Passe o mouse sobre as linhas renderizadas para ver como elas diferem do texto padrão.
Altere o nível de zoom do seu navegador ( Ctrl+ +e Ctrl+- ) para ver como eles variam.
Eu adicionei duas outras soluções aqui para comparação: o truque de espaçamento de letras do @cgTag , que não funciona tão bem, pois envolve adivinhar os intervalos de largura de fonte, e @ workaholic_gangster911's :: após o truque de desenho , que deixa um espaço extra estranho para que o texto em negrito possa se expandir sem cutucar os itens de texto vizinhos (coloquei a atribuição após o texto em negrito para que você possa ver como ele não se move).
No futuro, teremos mais fontes variáveis capazes de coisas como alterar a nota da fonte via
font-variation-settings
. O suporte do navegador está aumentando (Chrome 63+, Firefox 62+), mas isso ainda requer mais do que apenas fontes padrão e poucas fontes existentes o suportam.Se você incorporar uma fonte variável, poderá usar CSS da seguinte forma:
Há uma demonstração ao vivo com um controle deslizante para tocar com várias notas no Guia de fontes variáveis do Mozilla. A introdução do Google às fontes variáveis na web tem um GIF animado que demonstra a alternância entre uma nota alta e nenhuma nota:
fonte
Descobri que a maioria das fontes tem o mesmo tamanho quando você ajusta o espaçamento entre letras em 1px.
Embora isso mude a fonte regular para que cada letra tenha um espaçamento de pixel extra. Para menus, os títulos são tão curtos que não representam um problema.
fonte
0.98px
ou frações menores.1px
para valores relativos como0.025ex
ou0.0125ex
. Veja minha resposta para uma demonstração ao vivo.Para obter uma resposta mais atualizada, você pode usar
-webkit-text-stroke-width
:Isso evita quaisquer pseudo-elementos (o que é uma vantagem para leitores de tela) e sombras de texto (que parecem confusas e ainda podem criar um leve efeito de 'salto') ou definir qualquer largura fixa (o que pode ser impraticável).
Ele também permite que você defina um elemento para ser mais negrito do que 1px (teoricamente, você pode deixar uma fonte tão negrito quanto quiser e também pode ser um treino de má qualidade para criar uma versão em negrito de uma fonte que não tem negrito variante, como fontes personalizadas ( editar: fontes variáveis depreciam esta sugestão ). Embora isso deva ser evitado, pois provavelmente fará com que algumas fontes pareçam arranhadas e irregulares)
Isso definitivamente funciona no Edge, Firefox, Chrome e Opera (no momento da postagem) e no Safari ( editar: @Lars Blumberg obrigado por confirmar isso ). NÃO funciona no IE11 ou inferior.
Observe também que ele usa o
-webkit
prefixo, então isso não é padrão e o suporte pode ser abandonado no futuro, então não confie nisso, é muito importante - é melhor evitar essa técnica, a menos que seja meramente estética.fonte
Infelizmente, a única maneira de evitar que a largura mude quando o texto está em negrito é definir a largura do item da lista, no entanto, como você afirmou, fazer isso manualmente é demorado e não escalonável.
A única coisa em que consigo pensar é em usar um javascript que calcula a largura da guia antes de colocá-la em negrito e, em seguida, aplica a largura ao mesmo tempo que o negrito é necessário (quando você passa o mouse ou clica).
fonte
Use JavaScript para definir uma largura fixa de li com base no conteúdo sem negrito e, em seguida, coloque o conteúdo em negrito aplicando um estilo à
<a>
tag (ou adicione um intervalo se o<li>
não tiver nenhum filho).fonte
Esta é uma pergunta muito antiga, mas estou revisando-a porque tive esse problema em um aplicativo que estou desenvolvendo e achei todas as respostas aqui insuficientes.
(Pule este parágrafo para o TL; DR ...)Estou usando a webfont Gotham de cloud.typography.com e tenho botões que começam vazios (com uma borda / texto em branco e um fundo transparente) e adquirem uma cor de fundo ao passar o mouse. Descobri que algumas das cores de fundo que estava usando não contrastavam bem com o texto branco, então eu queria mudar o texto para preto para esses botões, mas - seja por causa de um truque visual ou métodos comuns de suavização - escuro o texto em um fundo claro sempre parece ser mais leve do que o texto branco em um fundo escuro. Descobri que aumentar o peso de 400 para 500 para o texto escuro mantinha quase exatamente o mesmo peso "visual". No entanto, estava aumentando a largura do botão em uma pequena quantidade - uma fração de pixel - mas foi o suficiente para fazer os botões parecerem "tremer" um pouco, do qual eu queria me livrar.
Solução:
Obviamente, este é um problema muito exigente, por isso exigiu uma solução delicada. No final
letter-spacing
das contas, usei um negativo no texto mais em negrito, conforme cgTag recomendado acima, mas 1px seria um exagero, então calculei exatamente a largura de que precisaria.Ao inspecionar o botão no Chrome devtools, descobri que a largura padrão do meu botão era 165,47 px e 165,69 px ao passar o mouse, uma diferença de 0,22 px. O botão tinha 9 caracteres, então:
0,22 / 9 = 0,024444 px
Ao converter isso em unidades em, eu poderia tornar o ajuste do tamanho da fonte agnóstico. Meu botão estava usando um tamanho de fonte de 16 px, então:
0,024444 / 16 = 0,001527em
Portanto, para minha fonte específica, o seguinte CSS mantém os botões exatamente com a mesma largura ao passar o mouse:
Com alguns testes e usando a fórmula acima, você pode encontrar exatamente o
letter-spacing
valor certo para a sua situação, e deve funcionar independentemente do tamanho da fonte.A única ressalva é que navegadores diferentes usam cálculos de subpixel ligeiramente diferentes, portanto, se você deseja esse nível de OCD de precisão perfeita de subpixel, será necessário repetir o teste e definir um valor diferente para cada navegador. Os estilos CSS direcionados a navegadores geralmente são malvistos , por um bom motivo, mas acho que este é um caso de uso em que é a única opção que faz sentido.
fonte
Pergunta interessante. Suponho que você esteja usando float, certo?
Bem, eu não conheço nenhuma técnica que você possa usar para se livrar desse aumento da fonte, portanto, eles tentarão se ajustar à largura mínima necessária - e a espessura da fonte variando vai alterar esse valor.
A solução única que conheço para evitar essa mudança é uma que você disse que não queria: definir tamanhos fixos para li.
fonte
Você pode implementar isso como no menu suspenso "Comprar por departamento" da amazon.com. Ele usa div amplo. Você pode criar um div largo e ocultar sua parte direita
fonte
ATUALIZAÇÃO: Tive que usar a tag B para o título porque no IE11 a pseudo classe i: after não apareceu quando eu tinha visibilidade: hidden.
No meu caso, quero alinhar uma caixa de seleção / rádio de entrada (com design personalizado) com o texto do rótulo, onde o texto fica em negrito quando a entrada é marcada.
A solução fornecida aqui não funcionou para mim no Chrome. O alinhamento vertical da entrada e do rótulo bagunçou com: after psuedo class e -margins não corrigiram isso.
Aqui está uma correção em que você não terá problemas com alinhamentos verticais.
fonte