Comment pouvez-vous trouver la hauteur de texte sur un canevas HTML?
La spec a un contexte.savoir measuretext(texte) la fonction qui va vous dire combien de largeur, il aurait besoin d'imprimer ce texte, mais je ne peux pas trouver un moyen de savoir quelle est la taille c'est. Je sais que c'est en fonction de la police, mais je ne sais pas à convertir une police de caractères chaîne de caractères à une hauteur de texte.
- J'aimerais savoir une meilleure façon que la réponse sommet. S'il existe un algorithme pour prendre le point arbitraire de la police et de trouver le max/min des bornes sur elle, j'en serais très heureux d'en entendre parler. =)
- il semble y être. Voir la réponse de ellisbben (et mon amélioration à elle).
- Je me demandais si le Caractère Unicode 'pâté' (U+2588) pourrait être utilisée comme une approximation en multipliant la largeur par deux.
- Il est intéressant de noter que la réponse dépend un peu de vos besoins. Par exemple, la hauteur nécessaire pour rendre le caractère "a" est différent de la hauteur nécessaire pour rendre le caractère "y", en raison de la descente qui s'étend au-dessous de la ligne de base de la police. Le HTML en fonction des réponses ci-dessous ne tiennent pas compte de cela et de vous donner une hauteur appropriée pour n'importe quel texte, alors que @Noitidart réponse donne une image plus exacte de la hauteur de texte spécifique.
- N'oubliez pas que vous pouvez avoir des personnages qui ressemblent à ce
M̶̢̹̝͖̦̖̭͕̭̣͆̃̀̅̒̊͌̿ͅ
, donc c'est vraiment un problème épineux afin de le résoudre dans le cas général.
Vous devez vous connecter pour publier un commentaire.
Mise à JOUR - pour un exemple de ce travail, j'ai utilisé cette technique dans le Carota éditeur.
La suite de ellisbben réponse, ici est une version améliorée pour obtenir la montée et la descente de la ligne de base, à savoir les mêmes que
tmAscent
ettmDescent
retourné par Win32 l' GetTextMetric API. Cette opération est nécessaire si vous voulez faire un mot gainé de texte avec des durées différentes polices de caractères/tailles.L'image ci-dessus a été généré sur une toile en Safari, le rouge étant la ligne du haut, où la toile a été dit de dessiner le texte, le vert étant la ligne de base et le bleu du fond (du rouge au bleu est à la hauteur totale).
À l'aide de jQuery pour la concision:
En outre un élément de texte, j'ajoute un div avec
display: inline-block
afin que je puisse régler sesvertical-align
de style, et puis de trouver l'endroit où le navigateur a mis.De sorte que vous obtenez en retour un objet avec
ascent
,descent
etheight
(qui est justeascent
+descent
pour des raisons de commodité). Pour le tester, il vaut la peine d'avoir une fonction qui dessine une ligne horizontale:Ensuite, vous pouvez voir comment le texte est positionné sur la toile par rapport au point haut, base et bas:
getTextHeight()
àvar text = $('<span>Hg</span>').css({ 'font-family': fontName, 'font-size' : fontSize });
, c'est à dire l'ajout de la taille séparément.<div></div>
à<div style="white-space : nowrap;"></div>
à gérer très longue chaîneLa toile spec ne nous donne pas une méthode pour mesurer la hauteur d'une chaîne de caractères. Toutefois, vous pouvez définir la taille de votre texte, en pixels, et vous pouvez généralement trouver la verticale limites sont relativement facilement.
Si vous avez besoin de quelque chose de plus précis, alors vous pourriez jeter un texte sur la toile et ensuite d'obtenir des données de pixels et de comprendre comment le nombre de pixels utilisés à la verticale. Ce serait relativement simple, mais pas très efficace. Vous pourriez faire quelque chose comme ceci (il fonctionne, mais il met un peu de texte sur votre toile que vous voulez supprimer):
Pour Bespin ils font semblant d'avoir de la hauteur par la mesure de la largeur d'une minuscule " m " ... je ne sais pas comment c'est utilisé, et je ne recommanderais pas cette méthode. Voici la Bespin méthode:
em
est une police relative la mesure où l'on em est égale à la hauteur de la lettreM
dans la taille de police par défaut.Mg
que le texte d'exemple, il pourrait être préférable d'utiliser quelque chose commeOg
ouGg
depuis la ronde des lettres (comme O et G) monter et descendre très légèrement plus à droite les lettres M et T, de sorte qu'ils apparaissent alignés (sinon, la ronde des lettres semblent être court). Aussi, quel est l'effet de l'anti–aliasing sur le résultat?Vous pouvez obtenir une très bonne approximation de la hauteur verticale par la vérification de la longueur d'un capital de M.
EDIT: Êtes-vous à l'aide de toile transforme? Si oui, vous devez suivre la matrice de transformation. La méthode suivante doit mesurer la hauteur d'un texte avec la première transformation.
EDIT #2: Bizarrement le code ci-dessous ne produit pas de réponses correctes lorsque je le lance sur ce StackOverflow page; il est tout à fait possible que la présence de certaines règles de style pourrait casser cette fonction.
La toile utilise des polices tels que définis par le CSS, donc, en théorie, il suffit d'ajouter une manière appropriée de style bloc de texte dans le document et à mesure de sa hauteur. Je pense que c'est beaucoup plus facile que le rendu de texte, puis en extrayant les données de pixel et il doit aussi respecter les jambages inférieurs et supérieurs. Découvrez les suivantes:
Vous aurez à vous assurer que vous obtenez le style de la police correcte sur l'élément DOM-vous que vous mesurez la hauteur de l', mais c'est assez simple; vraiment, vous devriez utiliser quelque chose comme
Les navigateurs commencent à soutenir avancé mesures de texte, ce qui fera de cette tâche triviale lorsqu'il est largement pris en charge:
fontHeight
vous obtient la boîte de délimitation de la hauteur qui est constante quelle que soit la chaîne en cours de rendu.actualHeight
est spécifique à la chaîne en cours de rendu.Spec: https://www.w3.org/TR/2012/CR-2dcontext-20121217/#dom-textmetrics-fontboundingboxascent et les sections situé juste en dessous.
Statut de Support (20-Août-2017):
Comme JJ Raide suggère, vous pouvez ajouter votre texte à une plage, puis de mesurer la offsetHeight de la plage.
Comme indiqué sur HTML5Rocks
N'est pas à la hauteur du texte en pixels égale à la taille de la police (en pts) si vous définir la police de caractères à l'aide du contexte.de police ?
Juste pour ajouter à la réponse de Daniel (qui est excellent! et tout à fait raison!), version sans JQuery:
J'ai juste testé le code ci-dessus et fonctionne très bien sur la dernière version de Chrome, FF et Safari sur Mac.
EDIT: j'ai ajouté de la taille de la police ainsi et testé avec webfont au lieu de la police système fonctionne génial.
J'ai résolu ce problème straitforward - à l'aide de la manipulation de pixels.
Ici est un graphique réponse:
Voici le code:
J'ai mis en place une bibliothèque de nice pour la mesure de la hauteur et de la largeur du texte en utilisant le HTML de la toile. Cela devrait faire ce que vous voulez.
https://github.com/ChrisBellew/text-measurer.js
Ici est une fonction simple. Pas de bibliothèque nécessaires.
J'ai écrit cette fonction pour obtenir le haut et le bas de limites par rapport à la base. Si
textBaseline
est fixé àalphabetic
. Ce qu'il fait est qu'il crée une autre toile, et tire de là, et puis trouve le plus haut et le plus bas non vide de pixel. Et c'est le haut et le bas de limites. Il la retourne en tant que parent, de sorte que si la hauteur est de 20px, et il n'y a rien en dessous de la ligne de base, puis le top lié est-20
.Vous devez fournir des caractères. Sinon, il vous donnera 0 hauteur et 0 largeur, évidemment.
Utilisation:
Voici la fonction:
relativeBot
,relativeTop
, etheight
sont les choses utiles à l'objet de retour.Voici un exemple d'usage:
HTML:
La
relativeBot
etrelativeTop
sont ce que vous voyez dans cette image ici:https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Tutorial/Drawing_text
Je suis en train d'écrire un émulateur de terminal j'ai donc besoin de dessiner des rectangles autour des personnages.
Évidemment, si vous souhaitez que le montant exact de l'espace, le personnage prend, il ne va pas aider. Mais ça vous donne une bonne approximation pour certaines utilisations.
une ligne de réponse
CSS "line-height: normal" est entre 1 et 1,2
lire ici pour plus d'info
Drôle que TextMetrics a la largeur seulement et non hauteur:
http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#textmetrics
Pouvez-vous utiliser une plage comme sur cet exemple?
http://mudcu.be/journal/2011/01/html5-typographic-metrics/#alignFix
Tout d'abord, vous devez définir la hauteur d'une taille de police, puis en fonction de la valeur de la hauteur de la police pour déterminer la hauteur de votre texte, c'est combien, la croix-des lignes de texte, bien sûr, la même hauteur de la police ont besoin d'accumuler, si le texte ne dépasse pas la plus grande zone de texte de la Hauteur, tout montrer, sinon, n'afficher que le texte dans la zone de texte. Des valeurs élevées ont besoin de votre propre définition. Plus la hauteur prédéfinie, plus la hauteur du texte qui doit être affiché et interceptés.
Après l'effet est traitée(résoudre)
Avant que l'effet est traitée(
non résolu)
J'ai trouvé que JUSTE POUR ARIAL la plus simple, la plus rapide et accuratest moyen de trouver la hauteur de la boîte englobante est d'utiliser la largeur de certaines lettres. Si vous prévoyez d'utiliser une police sans laisser l'utilisateur choisir l'un de différent, vous pouvez faire un peu de recherche pour trouver la bonne lettre que de faire le travail pour la police.
HTML:
C'est ce que j'ai fait en fonction des autres réponses ici:
JS:
réglage de la taille de la police peut ne pas être pratique si, depuis la mise en
ctx.font = "
utilise celle définie par le CSS ainsi que toute intégrées de la police des tags. Si vous utilisez la police CSS, vous n'avez aucune idée de ce que la hauteur est de un par programme, en utilisant le savoir measuretext méthode, qui est très myope. Sur une autre note, cependant, IE8 NE retour la largeur et la hauteur.
Cela fonctionne 1) pour le texte multiligne ainsi 2) et même dans IE9!
Je sais que c'est un vieux répondu à la question, mais pour l'avenir de référence, je voudrais ajouter une brève, minimal, JS uniquement (pas de jquery) solution je crois que les gens peuvent profiter de:
Solution approximative:
Ce sera la précision des résultats en police à chasse fixe.
C'est l'agitation urbaine... La hauteur du texte est la taille de la police.. N'a pas de lire la documentation?
cela permettra de régler la hauteur de 22px.
la seule raison pour laquelle il y a un..
est parce que la largeur de la chaîne ne peut pas être déterminée, sauf s'il sait que la chaîne que vous souhaitez que la largeur de mais pour toutes les chaînes dessinée avec la police.. la hauteur sera 22px.
si vous utilisez une autre mesure que px la hauteur sera toujours le même, mais avec mesure donc à la plupart tout ce que vous avez à faire est de convertir la mesure.
Dans des situations normales, la suivante devrait fonctionner: