Tengo un menú de navegación horizontal, que es básicamente un <ul>
conjunto de elementos uno al lado del otro. No defino el ancho, sino que simplemente uso el relleno, porque me gustaría que los anchos se definan por el ancho del elemento del menú. Pongo en negrita el elemento seleccionado actualmente.
El problema es que en negrita, la palabra se vuelve un poco más ancha, lo que hace que el resto de los elementos se desplace ligeramente hacia la izquierda o hacia la derecha. ¿Existe alguna forma inteligente de evitar que esto suceda? ¿Algo como decirle al acolchado que ignore el ancho adicional causado por la negrita? Mi primer pensamiento fue simplemente restar algunos píxeles del relleno del elemento "activo", pero esta cantidad varía.
Si es posible, me gustaría evitar establecer un ancho estático en cada entrada y luego centrarlo en lugar de la solución de relleno que tengo actualmente, para simplificar los cambios futuros en las entradas.
Respuestas:
Tuve el mismo problema, pero obtuve un efecto similar con un pequeño compromiso, usé text-shadow en su lugar.
Aquí hay un ejemplo de trabajo:
ejemplo de jsfiddle
fuente
li:hover {text-shadow: 1px 0 0 black;}
dio como resultado un texto con muy poco espacio entre las letras. Para mejorar eso nuevamente, también configuramosli {letter-spacing: 1px;}
-0.5px 0 #fff, 0.5px 0 #fff
, porque podíamos ver el pequeño espacio entre el texto en sí y la sombra. Y también cuando el texto está en negrita, agrega peso a ambos lados.La mejor solución de trabajo usando :: after
HTML
CSS
Agrega un pseudoelemento invisible con un ancho de texto en negrita, obtenido por
title
atributo.La
text-shadow
solución parece poco natural en Mac y no utiliza toda la belleza que ofrece la representación de texto en Mac .. :)http://jsfiddle.net/85LbG/
Crédito: https://stackoverflow.com/a/20249560/5061744
fuente
margin-top
al::after
bloque resolvió eso.La solución más portátil y visualmente agradable sería usar
text-shadow
. Esto revisa y muestra ejemplos de la respuesta de Thorgeir usando los ajustes de Alexxali y los míos:Esto pone pequeñas "sombras" en negro (use el nombre / código de color de su fuente en lugar de
black
si es necesario) en ambos lados de cada letra usando unidades que se escalarán correctamente con la representación de la fuente.Ver por ti mismo:
Pase el cursor sobre las líneas renderizadas para ver en qué se diferencian del texto estándar.
Modifique el nivel de zoom de su navegador ( Ctrl+ +y Ctrl+ -) para ver cómo varían.
Agregué otras dos soluciones aquí para comparar: el truco de espaciado de letras de @ cgTag , que no funciona tan bien ya que implica adivinar rangos de ancho de fuente, y el truco de dibujo :: after de @ workaholic_gangster911 , que deja un espacio extra incómodo para que el texto en negrita pueda expandirse sin empujar los elementos de texto vecinos (coloco la atribución después del texto en negrita para que pueda ver cómo no se mueve).
En el futuro, tendremos más fuentes variables capaces de cosas como cambiar el grado de fuente a través de
font-variation-settings
. La compatibilidad con el navegador está aumentando (Chrome 63+, Firefox 62+), pero esto aún requiere más que solo fuentes estándar y pocas fuentes existentes lo admiten.Si incrusta una fuente variable, podrá usar CSS de esta manera:
Hay una demostración en vivo con un control deslizante para jugar con varios grados en la Guía de fuentes variables de Mozilla. La Introducción de Google a las fuentes variables en la web tiene un GIF animado que muestra un cambio entre una calificación alta y ninguna calificación:
fuente
Descubrí que la mayoría de las fuentes tienen el mismo tamaño cuando ajusta el espacio entre letras en 1 px.
Si bien esto cambia la fuente normal para que cada letra tenga un espacio extra entre píxeles. Para los menús, los títulos son tan cortos que no presentan ningún problema.
fuente
0.98px
fracciones más pequeñas.1px
a valores relativos como0.025ex
o0.0125ex
. Vea mi respuesta para una demostración en vivo.Para obtener una respuesta más actualizada, puede utilizar
-webkit-text-stroke-width
:Esto evita cualquier pseudoelemento (que es una ventaja para los lectores de pantalla) y sombras de texto (que se ve desordenado y aún puede crear un ligero efecto de 'salto') o establecer anchos fijos (que pueden ser poco prácticos).
También le permite configurar un elemento para que sea más audaz que 1px (teóricamente, puede hacer una fuente tan negrita como desee y también podría ser un ejercicio de mala calidad para crear una versión en negrita de una fuente que no tiene negrita variante, como fuentes personalizadas ( editar: las fuentes variables deprecian esta sugerencia ). Aunque esto debe evitarse ya que probablemente hará que algunas fuentes parezcan ásperas e irregulares)
Definitivamente esto funciona en Edge, Firefox, Chrome y Opera (en el momento de la publicación) y en Safari ( editar: @Lars Blumberg, gracias por confirmarlo ). NO funciona en IE11 o inferior.
También tenga en cuenta que utiliza el
-webkit
prefijo, por lo que esto no es estándar y el soporte puede ser eliminado en el futuro, así que no confíe en esto, es audaz es realmente importante; es mejor evitar esta técnica a menos que sea meramente estética.fuente
Desafortunadamente, la única forma de evitar que el ancho cambie cuando el texto está en negrita es definir el ancho del elemento de la lista; sin embargo, como dijiste, hacerlo manualmente consume mucho tiempo y no es escalable.
Lo único que se me ocurre es usar un javascript que calcula el ancho de la pestaña antes de que esté en negrita, y luego aplica el ancho al mismo tiempo que se requiere el negrita (ya sea al pasar el mouse o al hacer clic).
fuente
Use JavaScript para establecer un ancho fijo de li basado en el contenido sin negrita, luego en negrita el contenido aplicando un estilo a la
<a>
etiqueta (o agregue un intervalo si<li>
no tiene hijos).fuente
Esta es una pregunta muy antigua, pero la estoy revisando porque tuve este problema en una aplicación que estoy desarrollando y encontré todas las respuestas aquí.
(Omita este párrafo para el TL; DR ...)Estoy usando la fuente web Gotham de cloud.typography.com, y tengo botones que comienzan en forma hueca (con un borde / texto blanco y un fondo transparente) y adquieren un color de fondo al pasar el mouse. Descubrí que algunos de los colores de fondo que estaba usando no contrastaban bien con el texto blanco, así que quería cambiar el texto a negro para esos botones, pero, ya sea por un truco visual o métodos comunes de suavizado, oscuro el texto sobre un fondo claro siempre parece tener un peso más ligero que el texto blanco sobre un fondo oscuro. Descubrí que aumentar el peso de 400 a 500 para el texto oscuro mantenía casi exactamente el mismo peso "visual". Sin embargo, estaba aumentando el ancho del botón en una pequeña cantidad, una fracción de un píxel, pero fue suficiente para hacer que los botones parecieran "temblar" levemente, de lo que quería deshacerme.
Solución:
Obviamente, este es un problema realmente delicado, por lo que requería una solución delicada. En última instancia, utilicé un negativo
letter-spacing
en el texto más audaz como cgTag recomendó anteriormente, pero 1px habría sido demasiado, así que calculé exactamente el ancho que necesitaría.Al inspeccionar el botón en las herramientas de desarrollo de Chrome, encontré que el ancho predeterminado de mi botón era 165.47px y 165.69px al pasar el mouse, una diferencia de 0.22px. El botón tenía 9 caracteres, entonces:
0.22 / 9 = 0.024444px
Al convertir eso a unidades em, podría hacer que el ajuste del tamaño de fuente fuera independiente. Mi botón estaba usando un tamaño de fuente de 16px, entonces:
0.024444 / 16 = 0.001527em
Entonces, para mi fuente particular, el siguiente CSS mantiene los botones exactamente del mismo ancho al pasar el mouse:
Con algunas pruebas y utilizando la fórmula anterior, puede encontrar exactamente el
letter-spacing
valor para su situación, y debería funcionar independientemente del tamaño de fuente.La única advertencia es que los diferentes navegadores usan cálculos de subpíxeles ligeramente diferentes, por lo que si está apuntando a este nivel de OCD de precisión perfecta de subpíxeles, deberá repetir la prueba y establecer un valor diferente para cada navegador. Los estilos CSS orientados al navegador generalmente están mal vistos , por una buena razón, pero creo que este es un caso de uso en el que es la única opción que tiene sentido.
fuente
Interesante pregunta. Supongo que estás usando flotación, ¿verdad?
Bueno, no conozco ninguna técnica que pueda usar para deshacerse de esta ampliación de fuente, por lo tanto, intentarán ajustarse al ancho mínimo requerido, y la variación del grosor de la fuente cambiará este valor.
La solución única que conozco para evitar este cambio es una que dijiste que no querías: establecer tamaños fijos en li.
fuente
Puede implementar esto como el menú flotante "Comprar por departamento" de amazon.com. Utiliza div ancho. Puede crear div ancho y ocultar su parte derecha
fuente
ACTUALIZACIÓN: Tuve que usar la etiqueta B para el título porque en IE11 la pseudoclase i: after no se mostraba cuando tenía visibilidad: oculta.
En mi caso, quiero alinear una casilla de verificación / radio de entrada (diseñada a medida) con el texto de la etiqueta donde el texto se pone en negrita cuando se marca la entrada.
La solución proporcionada aquí no me funcionó en Chrome. La alineación vertical de entrada y etiqueta se estropeó con la clase: after psuedo y -margins no solucionó esto.
Aquí hay una solución en la que no tiene problemas con las alineaciones verticales.
fuente