La especificación tiene una función context.measureText (texto) que le indicará cuánto ancho necesitaría para imprimir ese texto, pero no puedo encontrar una manera de saber qué tan alto es. Sé que se basa en la fuente, pero no sé convertir una cadena de fuente a una altura de texto.
javascript
text
canvas
Swampjohn
fuente
fuente
M̶̢̹̝͖̦̖̭͕̭̣͆̃̀̅̒̊͌̿ͅ
, así que este es un problema realmente complicado, así que resuelve el caso general.Respuestas:
ACTUALIZACIÓN : para un ejemplo de este trabajo, utilicé esta técnica en el editor de Carota .
A continuación de la respuesta de ellisbben, aquí hay una versión mejorada para obtener el ascenso y el descenso desde la línea de base, es decir, la misma
tmAscent
ytmDescent
devuelta por la API GetTextMetric de Win32 . Esto es necesario si desea hacer una ejecución de texto en formato de palabra con tramos en diferentes fuentes / tamaños.La imagen de arriba se generó en un lienzo en Safari, siendo el rojo la línea superior donde se le dijo al lienzo que dibujara el texto, el verde como la línea de base y el azul como la parte inferior (de rojo a azul es la altura completa).
Usando jQuery para ser sucinto:
Además de un elemento de texto, agrego un div con el
display: inline-block
que puedo configurar suvertical-align
estilo y luego averiguar dónde lo ha colocado el navegador.Entonces recuperas un objeto con
ascent
,descent
yheight
(que es soloascent
+descent
por conveniencia). Para probarlo, vale la pena tener una función que dibuje una línea horizontal:Luego puede ver cómo se coloca el texto en el lienzo en relación con la parte superior, la línea base y la parte inferior:
fuente
getTextHeight()
avar text = $('<span>Hg</span>').css({ 'font-family': fontName, 'font-size' : fontSize });
, es decir, agregué el tamaño por separado.<div></div>
para<div style="white-space : nowrap;"></div>
manejar una cadena muy largaPuede obtener una aproximación muy cercana de la altura vertical al verificar la longitud de una M. mayúscula
fuente
La especificación del lienzo no nos da un método para medir la altura de una cadena. Sin embargo, puede establecer el tamaño de su texto en píxeles y generalmente puede determinar cuáles son los límites verticales con relativa facilidad.
Si necesita algo más preciso, puede arrojar texto en el lienzo y luego obtener datos de píxeles y calcular cuántos píxeles se usan verticalmente. Esto sería relativamente simple, pero no muy eficiente. Podría hacer algo como esto (funciona, pero dibuja algo de texto en su lienzo que desea eliminar):
Para Bespin, simulan una altura midiendo el ancho de una 'm' minúscula ... No sé cómo se usa esto, y no recomendaría este método. Aquí está el método Bespin relevante:
fuente
em
es una medida de fuente relativa donde un em es igual a la altura de la letraM
en el tamaño de fuente predeterminado.Los navegadores están comenzando a admitir métricas de texto avanzadas , lo que hará que esta tarea sea trivial cuando sea ampliamente compatible:
fontHeight
obtiene la altura del cuadro delimitador que es constante independientemente de la cadena que se representa.actualHeight
es específico de la cadena que se representa.Especificaciones: https://www.w3.org/TR/2012/CR-2dcontext-20121217/#dom-textmetrics-fontboundingboxascent y las secciones justo debajo.
Estado de soporte (20-agosto-2017):
fuente
EDITAR: ¿Estás utilizando transformaciones de lienzo? Si es así, tendrá que rastrear la matriz de transformación. El siguiente método debe medir la altura del texto con la transformación inicial.
EDITAR # 2: Curiosamente, el siguiente código no produce respuestas correctas cuando lo ejecuto en esta página de StackOverflow; Es muy posible que la presencia de algunas reglas de estilo rompa esta función.
El lienzo utiliza fuentes definidas por CSS, por lo que, en teoría, podemos agregar un fragmento de texto con el estilo apropiado al documento y medir su altura. Creo que esto es significativamente más fácil que renderizar texto y luego verificar los datos de píxeles y también debe respetar los ascendentes y descendentes. Mira lo siguiente:
Tendrá que asegurarse de obtener el estilo de fuente correcto en el elemento DOM del que mide la altura, pero eso es bastante sencillo; realmente deberías usar algo como
fuente
¿No es la altura del texto en píxeles igual al tamaño de fuente (en puntos) si define la fuente usando context.font?
fuente
Como sugiere JJ Stiff, puede agregar su texto a un intervalo y luego medir la altura de desplazamiento del intervalo.
Como se muestra en HTML5Rocks
fuente
Solo para agregar a la respuesta de Daniel (¡que es genial! ¡Y absolutamente correcto!), Versión sin JQuery:
Acabo de probar el código anterior y funciona muy bien en los últimos Chrome, FF y Safari en Mac.
EDITAR: también agregué el tamaño de fuente y probé con webfont en lugar de la fuente del sistema, funciona de maravilla.
fuente
Resolví este problema directamente, utilizando la manipulación de píxeles.
Aquí hay una respuesta gráfica:
Aquí está el código:
fuente
Estoy escribiendo un emulador de terminal, así que necesitaba dibujar rectángulos alrededor de los caracteres.
Obviamente, si quieres la cantidad exacta de espacio que ocupa el personaje, no ayudará. Pero le dará una buena aproximación para ciertos usos.
fuente
He implementado una buena biblioteca para medir la altura y el ancho exactos del texto usando el lienzo HTML. Esto debería hacer lo que quieras.
https://github.com/ChrisBellew/text-measurer.js
fuente
Aquí hay una función simple. No se necesita biblioteca.
Escribí esta función para obtener los límites superior e inferior en relación con la línea base. Si
textBaseline
está ajustado aalphabetic
. Lo que hace es crear otro lienzo, y luego dibuja allí, y luego encuentra el píxel superior y el inferior no en blanco. Y ese es el límite superior e inferior. Lo devuelve como relativo, por lo que si la altura es de 20 px y no hay nada debajo de la línea de base, entonces el límite superior es-20
.Debes proporcionarle caracteres. De lo contrario, le dará 0 altura y 0 ancho, obviamente.
Uso:
Aquí está la función:
relativeBot
`relativeTop
` yheight
son las cosas útiles en el objeto de retorno.Aquí hay un ejemplo de uso:
Los
relativeBot
yrelativeTop
son lo que ves en esta imagen aquí:https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Tutorial/Drawing_text
fuente
respuesta de una línea
CSS "line-height: normal" está entre 1 y 1.2
lea aquí para más información
fuente
Es curioso que TextMetrics solo tenga ancho y no alto:
http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#textmetrics
¿Puedes usar un Span como en este ejemplo?
http://mudcu.be/journal/2011/01/html5-typographic-metrics/#alignFix
fuente
Esto es lo que hice en base a algunas de las otras respuestas aquí:
fuente
En primer lugar, debe establecer la altura de un tamaño de fuente, y luego, de acuerdo con el valor de la altura de la fuente, determinar la altura actual de su texto es cuánto, líneas de texto cruzado, por supuesto, la misma altura de la fuente la fuente debe acumularse, si el texto no excede la altura del cuadro de texto más grande, todos se muestran, de lo contrario, solo se muestra el texto dentro del cuadro de texto. Los valores altos necesitan su propia definición. Cuanto mayor sea la altura predeterminada, mayor será la altura del texto que debe mostrarse e interceptarse.
Después de procesar el efecto (resolver)
Antes de que se procese el efecto (sin resolver)
fuente
Descubrí que SOLO PARA ARIAL la forma más simple, rápida y precisa de encontrar la altura del cuadro delimitador es usar el ancho de ciertas letras. Si planea usar una fuente determinada sin permitir que el usuario elija una diferente, puede investigar un poco para encontrar la letra correcta que haga el trabajo para esa fuente.
fuente
Sin embargo, configurar el tamaño de fuente puede no ser práctico, ya que
ctx.font = ''
utilizará el definido por CSS, así como cualquier etiqueta de fuente incrustada. Si usa la fuente CSS, no tiene idea de cuál es la altura de una manera programática, usando el método measureText, que es muy corto de vista. Sin embargo, en otra nota, IE8 sí devuelve el ancho y la altura.
fuente
¡Esto funciona 1) para texto multilínea también 2) e incluso en IE9!
fuente
Sé que esta es una vieja pregunta respondida, pero para referencia futura me gustaría agregar una solución corta, mínima, solo JS (sin jquery), creo que las personas pueden beneficiarse de:
fuente
En situaciones normales, lo siguiente debería funcionar:
fuente
Esto es una locura ... La altura del texto es el tamaño de la fuente ... ¿Ninguno de ustedes leyó la documentación?
Esto establecerá la altura a 22px.
la única razón por la que hay un ...
es porque el ancho de la cadena no se puede determinar a menos que conozca la cadena de la que desea el ancho, pero para todas las cadenas dibujadas con la fuente ... la altura será de 22px.
si usa otra medida que no sea px, entonces la altura seguirá siendo la misma, pero con esa medida, lo máximo que tendrá que hacer es convertir la medida.
fuente
Solución aproximada:
Este será un resultado preciso en una fuente monoespaciada.
fuente