2010-05-04 17 views
6

He estado experimentando con la etiqueta canvas y Javascript. He creado una página que toma Tweets de la línea de tiempo pública de Twitter y los anima a la vista. Funciona mediante el uso de un elemento canvas en el fondo de la animación. Cuando se completa la animación, crea un elemento div con el mismo texto en la parte superior. Hago esto para que el texto del tweet sea seleccionable y se pueda hacer clic en los enlaces.Hacer que Firefox renderice el texto del lienzo de la misma manera que el texto CSS

Ahora, en Safari, Chrome e incluso Opera, el texto del lienzo y el texto div se ven casi exactamente iguales. Sin embargo, en Firefox, el tamaño del texto es lo suficientemente diferente como para hacerlo 'saltar' en el momento en que cambia a div.

¿Alguien sabe cómo hacer que Firefox represente el texto de la misma manera en el elemento del lienzo y div usando CSS? O esto es una incoherencia de renderizado con el motor.

He puesto la página on my website si quiere ver lo que quiero decir.

Ahora para el código:

El CSS que estoy usando para hacer que la div contiene:

line-height: 21px; font-weight: 100; font-family: Georgia, "New Century Schoolbook", "Nimbus Roman No9 L", serif; font-size: 20px; 

para la representación en el lienzo que estoy usando:

this.context.font = this.scale + 'px Georgia'; 
this.context.fillStyle = "white"; 
this.context.strokeStyle = 'white'; 
this.context.fillText(this.text, 0, 0); 
this.context.strokeText(this.text, 0, 0); 

donde this.scale es un factor de escala animado que termina exactamente a 20px. Entonces, para recapitular, estoy usando la misma fuente y terminando en el mismo tamaño de px, pero Firefox representa el texto de manera diferente entre Canvas y CSS.

(editar) Aquí hay una captura de ejemplo: alt text http://danforys.com/temp/firefox-behaviour.png

primera línea es la animación de texto en el uso de lienzo, segunda línea es el div resultante.

+0

Hmm, mirando de cerca a la pantalla, tal vez es los espacios. La letra tiene un tamaño similar, pero los espacios se ven un poco más amplios en el div CSS. –

Respuesta

1

Derecho, tengo test case.

Creé un elemento div y canvas uno al lado del otro con el mismo texto. Resulta que la representación de la fuente fue una pista falsa. Lo que difiere con Firefox es el informe de los anchos de caracteres. Mi visualizador de Twitter calcula el ancho de cada personaje usando measureText(). Width y los coloca en consecuencia. Por alguna razón, el ancho de los caracteres en Firefox es más pequeño.

Curiosamente, en el caso de prueba mido dos cosas:

  1. El ancho total de todo el texto
  2. La suma de las anchuras de cada carácter en el texto

En Chrome , ambos salen a 399px. En Firefox, el primero sale como 393px, el segundo a 367px.

Editar: El error se ha cerrado. Mozilla dice it's invalid, todavía digo que es inconsistente con los otros navegadores. Tendré que encontrar otra forma de hacerlo, o suficiente información para convencer a Mozilla de que, después de todo, es un error. Gracias por escuchar de todos modos!

+0

Ok, solo puedo adivinar que este es un error de Firefox Javascript. Lo he informado: https://bugzilla.mozilla.org/show_bug.cgi?id=563758 –

+0

No puedo duplicar esto en FF3.6, ¿esto es un cambio reciente? ¿Has jugado con espacios entre letras para ver si puedes alinearlos? Eso me parece la diferencia. – ndp

+0

Además, si las funciones del sistema operativo respetan, p. los parámetros de interletraje, el ancho total de un texto puede ser diferente de la suma del ancho de un solo carácter. Si usa fuentes que lo admitan, incluso podría obtener ligaduras (es decir, caracteres especiales) para ciertas combinaciones de caracteres que no puede simular utilizando su enfoque. – MartinStettner

0

No puedo ver tanta diferencia entre Firefox y Chrome (aparte de la velocidad ...).

¿Ha intentado no utilizar strokeText? Creo que el texto generalmente se procesa utilizando fill -operations.

Cool app, btw.!

+0

Gracias Martin! Sí, lo he intentado con y sin strokeText. Sin, el texto parece mucho más delgado y se ve muy diferente al div en los tres navegadores. Parece que el texto de CSS se acaricia y se llena, o de un peso equivalente a eso. Observe también el peso de la fuente en el CSS, cambiando esto a valores menores que 'negrita'. Tampoco parece haber ninguna diferencia. Está solo allí porque estaba experimentando. –

+0

Si observa detenidamente el punto en que el texto comienza a animarse hacia arriba, el tamaño del carácter salta. Es especialmente notable en Firefox si miras tweets largos con caracteres a la derecha de la línea. Acumulativamente, hay un gran salto en la longitud de la línea. Al menos hay en FF 3.6.3 en OSX. –

+0

Curiosamente, el procesamiento parece diferir también entre las versiones de Chrome. En casa (Chrome [verificare la versión más adelante] en OSX Snow Leopard, el texto con relleno * y * se ve igual que el div. En el trabajo, en Leopard Chrome 5.0.342.9 beta, el texto acariciado y relleno es mucho más gordo que el div. Creo que necesito para investigar esto más ... –

Cuestiones relacionadas