La spécification a une fonction context.measureText (texte) qui vous indiquera la largeur nécessaire pour imprimer ce texte, mais je ne trouve pas de moyen de savoir quelle est sa hauteur. Je sais que c'est basé sur la police, mais je ne sais pas convertir une chaîne de police en une hauteur de texte.
javascript
text
canvas
swampsjohn
la source
la source
M̶̢̹̝͖̦̖̭͕̭̣͆̃̀̅̒̊͌̿ͅ
, c'est donc un problème vraiment délicat, alors résolvez le cas général.Réponses:
MISE À JOUR - pour un exemple de ce fonctionnement, j'ai utilisé cette technique dans l' éditeur Carota .
Dans le prolongement de la réponse d'ellisbben, voici une version améliorée pour obtenir l'ascension et la descente à partir de la ligne de base, c'est-à-dire identiques
tmAscent
ettmDescent
renvoyées par l' API GetTextMetric de Win32 . Ceci est nécessaire si vous souhaitez créer une séquence de texte enveloppée de mots avec des étendues dans différentes polices / tailles.L'image ci-dessus a été générée sur un canevas dans Safari, le rouge étant la ligne supérieure où le canevas a été invité à dessiner le texte, le vert étant la ligne de base et le bleu étant le bas (donc le rouge au bleu est la pleine hauteur).
Utilisation de jQuery pour la concision:
En plus d'un élément de texte, j'ajoute un div avec
display: inline-block
pour pouvoir définir sonvertical-align
style, puis savoir où le navigateur l'a mis.Vous récupérez donc un objet avec
ascent
,descent
etheight
(ce qui est justeascent
+descent
pour plus de commodité). Pour le tester, cela vaut la peine d'avoir une fonction qui trace une ligne horizontale:Ensuite, vous pouvez voir comment le texte est positionné sur le canevas par rapport au haut, à la ligne de base et au bas:
la source
getTextHeight()
envar text = $('<span>Hg</span>').css({ 'font-family': fontName, 'font-size' : fontSize });
, c'est- à -dire en ajoutant la taille séparément.<div></div>
pour<div style="white-space : nowrap;"></div>
gérer une très longue cordeVous pouvez obtenir une approximation très proche de la hauteur verticale en vérifiant la longueur d'un grand M.
la source
La spécification du canevas ne nous donne pas de méthode pour mesurer la hauteur d'une chaîne. Cependant, vous pouvez définir la taille de votre texte en pixels et vous pouvez généralement déterminer quelles sont les limites verticales relativement facilement.
Si vous avez besoin de quelque chose de plus précis, vous pouvez lancer du texte sur le canevas, puis obtenir des données de pixels et déterminer combien de pixels sont utilisés verticalement. Ce serait relativement simple, mais pas très efficace. Vous pouvez faire quelque chose comme ceci (cela fonctionne, mais dessine du texte sur votre canevas que vous voudriez supprimer):
Pour Bespin, ils simulent une hauteur en mesurant la largeur d'un 'm' minuscule ... Je ne sais pas comment cela est utilisé, et je ne recommanderais pas cette méthode. Voici la méthode Bespin pertinente:
la source
em
est une mesure de police relative où un em est égal à la hauteur de la lettreM
dans la taille de police par défaut.Les navigateurs commencent à prendre en charge les métriques de texte avancées , ce qui rendra cette tâche triviale lorsqu'elle est largement prise en charge:
fontHeight
vous obtient la hauteur de la zone de délimitation qui est constante quelle que soit la chaîne rendue.actualHeight
est spécifique à la chaîne rendue.Spec: https://www.w3.org/TR/2012/CR-2dcontext-20121217/#dom-textmetrics-fontboundingboxascent et les sections juste en dessous.
État de l'assistance (20 août 2017):
la source
EDIT: Utilisez-vous des transformations de canevas? Si tel est le cas, vous devrez suivre la matrice de transformation. La méthode suivante doit mesurer la hauteur du texte avec la transformation initiale.
EDIT # 2: Curieusement, le code ci-dessous ne produit pas de réponses correctes lorsque je l'exécute sur cette page StackOverflow; il est tout à fait possible que la présence de certaines règles de style puisse casser cette fonction.
Le canevas utilise des polices telles que définies par CSS, donc en théorie, nous pouvons simplement ajouter un morceau de texte de style approprié au document et mesurer sa hauteur. Je pense que c'est beaucoup plus facile que de rendre du texte puis de vérifier les données de pixels et que cela devrait également respecter les ascendeurs et les descendants. Vérifiez ce qui suit:
Vous devrez vous assurer que le style de police est correct sur l'élément DOM dont vous mesurez la hauteur, mais c'est assez simple; vraiment vous devriez utiliser quelque chose comme
la source
La hauteur du texte en pixels n'est-elle pas égale à la taille de la police (en pts) si vous définissez la police en utilisant context.font?
la source
Comme le suggère JJ Stiff, vous pouvez ajouter votre texte à une étendue, puis mesurer la hauteur offset de la plage.
Comme indiqué sur HTML5Rocks
la source
Juste pour ajouter à la réponse de Daniel (ce qui est génial! Et tout à fait raison!), Version sans JQuery:
Je viens de tester le code ci-dessus et fonctionne très bien sur les derniers Chrome, FF et Safari sur Mac.
EDIT: J'ai également ajouté la taille de la police et testé avec la police Web au lieu de la police système - fonctionne à merveille.
la source
J'ai résolu ce problème directement - en utilisant la manipulation des pixels.
Voici la réponse graphique:
Voici le code:
la source
J'écris un émulateur de terminal donc j'avais besoin de dessiner des rectangles autour des caractères.
Évidemment, si vous voulez la quantité exacte d'espace que le personnage occupe, cela ne vous aidera pas. Mais cela vous donnera une bonne approximation pour certaines utilisations.
la source
J'ai implémenté une belle bibliothèque pour mesurer la hauteur et la largeur exactes du texte à l'aide de la toile HTML. Cela devrait faire ce que vous voulez.
https://github.com/ChrisBellew/text-measurer.js
la source
Voici une fonction simple. Aucune bibliothèque nécessaire.
J'ai écrit cette fonction pour obtenir les limites supérieure et inférieure par rapport à la ligne de base. Si
textBaseline
est défini suralphabetic
. Ce qu'il fait, c'est qu'il crée un autre canevas, puis y dessine, puis trouve le pixel le plus haut et le plus bas non vide. Et ce sont les limites du haut et du bas. Il le renvoie comme relatif, donc si la hauteur est de 20 px et qu'il n'y a rien en dessous de la ligne de base, alors la limite supérieure est-20
.Vous devez lui fournir des caractères. Sinon, cela vous donnera 0 hauteur et 0 largeur, évidemment.
Usage:
Voici la fonction:
relativeBot
,,relativeTop
etheight
sont les éléments utiles de l'objet de retour.Voici un exemple d'utilisation:
Le
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
la source
réponse en une ligne
CSS "line-height: normal" est compris entre 1 et 1,2
lisez ici pour plus d'informations
la source
C'est drôle que TextMetrics n'ait qu'une largeur et aucune hauteur:
http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#textmetrics
Pouvez-vous utiliser un Span comme sur cet exemple?
http://mudcu.be/journal/2011/01/html5-typographic-metrics/#alignFix
la source
C'est ce que j'ai fait sur la base de certaines des autres réponses ici:
la source
Tout d'abord, vous devez définir la hauteur d'une taille de police, puis en fonction de la valeur de la hauteur de police pour déterminer la hauteur actuelle de votre texte est de combien, les lignes de texte croisé, bien sûr, la même hauteur de la la police doit s'accumuler, si le texte ne dépasse pas la plus grande hauteur de la zone de texte, tout afficher, sinon, afficher uniquement le texte dans le texte de la zone. Les valeurs élevées nécessitent votre propre définition. Plus la hauteur prédéfinie est grande, plus la hauteur du texte à afficher et à intercepter est grande.
Une fois l'effet traité (résoudre)
Avant que l'effet ne soit traité (non résolu)
la source
J'ai trouvé que JUST FOR ARIAL, le moyen le plus simple, le plus rapide et le plus précis de trouver la hauteur du cadre de sélection consiste à utiliser la largeur de certaines lettres. Si vous prévoyez d'utiliser une certaine police sans laisser l'utilisateur en choisir une différente, vous pouvez faire un peu de recherche pour trouver la bonne lettre qui convient à cette police.
la source
la définition de la taille de la police peut cependant ne pas être
ctx.font = ''
utilisera celui défini par CSS ainsi que toutes les balises de police intégrées. Si vous utilisez la police CSS, vous n'avez aucune idée de la hauteur par programmation, en utilisant la méthode measureText, qui est très myope. Sur une autre note cependant, IE8 renvoie la largeur et la hauteur.
la source
Cela fonctionne 1) pour le texte multiligne également 2) et même dans IE9!
la source
Je sais que c'est une vieille question avec réponse, mais pour référence future, j'aimerais ajouter une solution courte, minimale, uniquement JS (pas de jquery) dont je pense que les gens peuvent bénéficier:
la source
Dans des situations normales, les éléments suivants devraient fonctionner:
la source
C'est fou ... La hauteur du texte est la taille de la police. Aucun de vous n'a lu la documentation?
cela définira la hauteur à 22px.
la seule raison pour laquelle il y a un ..
C'est parce que la largeur de la chaîne ne peut être déterminée que s'il connaît la chaîne dont vous voulez la largeur, mais pour toutes les chaînes dessinées avec la police .. la hauteur sera de 22px.
si vous utilisez une autre mesure que px, la hauteur sera toujours la même, mais avec cette mesure, tout ce que vous auriez à faire est de convertir la mesure.
la source
Solution approximative:
Ce sera un résultat précis dans une police à espacement unique.
la source