2011-09-25 15 views
15

Es mejor ver a un error por sí mismo en Firefox: http://jsfiddle.net/kizu/btdVd/¿Hay una solución CSS para el bug de Firefox: inline-block + primera letra con tamaño cambiado

La imagen, que muestra el error:

enter image description here

Y el error filled in 2007 on bugzilla.

El error aparece cuando se va a añadir ::first-letter pseudo-elemento con display: inline-block, y luego cambiar el font-size de esta first-letter.

Más letras en una palabra después de la primera: más espacio adicional agregado (o restado - si el tamaño de la fuente es menor que la del bloque).

Añadiendo float: left al first-letter invierte el error: con un tamaño de letra más grande, el ancho de inline-block se encoge.

Entonces, la pregunta: ¿hay alguna solución CSS-only para este error? Me está matando de alguna manera.

+0

Esto sigue siendo un error. Agregué otra solución que creo que es más simple, usando '-moz-padding-end'. – RustyToms

+0

Gracias. Nos encontramos con este error EXACTO hoy. – thinsoldier

Respuesta

13

He encontrado que desencadenar reflujo en toda la página (o cualquier bloque con un problema) soluciona el problema, así que he encontrado una manera de activarlo en cada bloque con animación CSS única: http://jsfiddle.net/kizu/btdVd/23/

sin embargo, aunque esta revisión no tienen inconvenientes en la representación, que tienen algunos otros:

  • que funcionaría sólo para Fx5 + (que soporta animaciones);
  • todavía muestra el error original durante unos pocos ms, por lo que es un poco parpadeante.

Por lo tanto, no es una solución ideal, pero sería de alguna ayuda cuando Fx4- estaría desactualizado. Por supuesto, puede desencadenar esa corrección de carga con JS, pero no es tan agradable.

+0

Dado que no hubo mejores respuestas y Fx4- son algo antiguas, usar la animación aquí es la mejor solución hasta ahora. – kizu

7

No creo que haya una buena solución.

he llegado a una solución para usted, aunque escamosa:

.test:first-letter { 
    font-size: 2em; 
    letter-spacing: -0.225em; 
} 

agrega el estilo letter-spacing al selector :first-letter en su violín, y usted encontrará los bloques se remontan a más o menos la derecha tamaño.

Explicación:

Básicamente, el fallo está siendo causado por todo el bloque de tomar su tamaño de la fuente especificada en el first-letter.

Lo que estoy haciendo aquí con letter-spacing es intentar ajustar el tamaño de esta fuente, sin afectar su apariencia física. Ajustar el espacio entre letras de esta manera en el texto normal daría como resultado que las letras se superpongan entre sí por .225 del ancho de un carácter en cada lado.

Inicialmente esperaba que un valor de -0.25 fuera suficiente, es decir, un cuarto de carácter en cada lado reduciría el ancho de cada carácter a la mitad, que sería lo que queremos porque la primera letra es font-size:2em Por lo tanto, es dos veces más grande.

Sin embargo, el cálculo no es tan claro, ya que el primer y el último caracteres de la cadena solo se superponen en un lado cada uno, y porque la primera letra realmente quiere ser de doble ancho, incluso si el resto de los personajes no.

Todo esto significa que el valor exacto letter-spacing requerido para contrarrestar el error variará dependiendo de cuánto tiempo el texto, así como los tamaños de fuente del texto original y la primera letra. Esta es la razón por la que tuve que experimentar un poco con el valor del espaciado entre letras para que funcione, y también explica por qué no pude lograr un ajuste perfecto en todas las filas de texto en tu Fiddle. Hubiera necesitado un valor ligeramente diferente para cada bloque.

El valor de -0.225 parece ser lo más cerca que puedo llegar a que sea correcto para todos sus ejemplos, pero en la práctica tendrá que ajustarlo para adaptarse a su sitio.

No olvide también que este es un error de Firefox, y por lo tanto tendrá que escribirlo como un truco específico del navegador de algún tipo. Y tenga cuidado de no perder de vista el informe de errores de Firefox que ha vinculado; cuando se solucione, tendrás que encontrar la manera de mantener el truco para los usuarios de versiones antiguas, pero eliminarlo para los usuarios con la solución.

[EDIT]

La única otra solución de trabajo se me ha ocurrido con no consiste simplemente en utilizar las características que provocan el fallo. es decir, suelte el selector :first-letter y use un <span> por separado para la primera letra de su texto si desea darle un estilo diferente.

Esta es la respuesta obvia en realidad, y por supuesto resolvería el problema (y también significaría que su primera letra con estilo funciona en navegadores más antiguos), pero no sería ideal desde una perspectiva semántica, y lo más importante no lo hace En realidad, respondo la pregunta, y es por eso que no la ofrecí como una solución en mi respuesta original.

He estado tratando de encontrar un trabajo alternativo para el error, pero las opciones son limitadas, y nada de lo que he probado ha dado tan buenos resultados como mi sugerencia inicial.

He intentado hackear el :first-letter invisible, y usando :before para mostrar la gran letra mayúscula inicial. Sin embargo, esto no funcionó para mí. No me entretuve demasiado tiempo para que puedas ponerlo en funcionamiento, pero hay un problema en que deberías definir la letra principal en tu CSS, lo que no sería ideal.

Otra posible solución es usar la propiedad CSS font-stretch: condensed; en el :first-letter. Esto reduciría el ancho de la primera letra a 1em, y así resolvería la cuestión del ancho del resto del texto. Los inconvenientes de esto, sin embargo, son que, en primer lugar, haría que la letra principal se vea aplastada, lo que probablemente no sea lo que desea, y en segundo lugar, este estilo solo funciona para las fuentes que admiten la propiedad condensed. Resulta que esto no está bien soportado por las fuentes estándar, por lo que puede no ser viable para usted.

Al final, la solución original letter-spacing sigue siendo la única forma que he encontrado para solucionar el problema.

+0

Vote por la explicación. Triste, pero necesito una solución más estable, que funcione para palabras cortas y largas y para diferentes primeros caracteres: parece que el 'espacio entre letras' debe ser diferente para, por ejemplo, las letras' W' y 'I' . Además, el espaciado de letras negativo en sí mismo no se ve bien de todos modos :( – kizu

+0

Sé que no es perfecto, pero lamentablemente esto es lo más cerca que he podido contraatacar el efecto del error. El único otro La solución que puedo dar es dejar de intentar usar el selector ': first-letter', y dividir la primera letra en su propia' '. No es ideal, no es semántica, y en realidad no aborda el error, pero resolvería el problema para su página. – Spudley

+0

@kizu - He agregado algunas notas sobre algunas otras ideas que probé para resolver este problema. – Spudley

0

Este error aún existe, pero algunas de las correcciones ya no funcionan. Incluso después de desencadenar un reflujo con una animación, el bloque en línea volvió al mismo tamaño para mí.No pude usar el truco letter-spacing porque ya lo estoy usando en la primera letra, eso es lo que está causando el problema para mí. He resuelto el problema mediante la adición de esto a la CSS para el selector afectada:

-moz-padding-end: *number of pixels to compensate*; 

Por el momento, moz-padding-end parece ser específica a Firefox, y se puede añadir o eliminar ancho hasta el final de la línea-bloque. Debido a que este es un error específico de Firefox, eso fue lo que hizo el truco para mí.

Cuestiones relacionadas