Je voudrais utiliser JavaScript pour calculer la largeur d'une chaîne. Est-ce possible sans avoir à utiliser une police monospace?
Si ce n'est pas intégré, ma seule idée est de créer un tableau des largeurs pour chaque caractère, mais cela est assez déraisonnable, en particulier en prenant en charge Unicode et différentes tailles de type (et tous les navigateurs d'ailleurs).
javascript
textbox
Jacob
la source
la source
Réponses:
Créez un DIV stylisé avec les styles suivants. Dans votre JavaScript, définissez la taille de la police et les attributs que vous essayez de mesurer, placez votre chaîne dans le DIV, puis lisez la largeur et la hauteur actuelles du DIV. Il s'étirera pour s'adapter au contenu et la taille sera à quelques pixels de la taille de la chaîne rendue.
la source
+1
sert chaque dimension?En HTML 5 , vous pouvez simplement utiliser la méthode Canvas.measureText (plus d'explications ici ).
Essayez ce violon :
Ce violon compare cette méthode Canvas à une variante de la méthode basée sur DOM de Bob Monteverde , afin que vous puissiez analyser et comparer la précision des résultats.
Cette approche présente plusieurs avantages, notamment:
textAlign
ettextBaseline
.REMARQUE: lorsque vous ajoutez le texte à votre DOM, n'oubliez pas de prendre également en compte le remplissage, la marge et la bordure .
REMARQUE 2: Sur certains navigateurs, cette méthode donne une précision sous-pixel (le résultat est un nombre à virgule flottante), sur d'autres non (le résultat n'est qu'un entier). Vous voudrez peut-être exécuter
Math.floor
(ouMath.ceil
) sur le résultat, pour éviter les incohérences. Étant donné que la méthode basée sur DOM n'est jamais précise en sous-pixels, cette méthode a une précision encore plus élevée que les autres méthodes ici.Selon ce jsperf (merci aux contributeurs dans les commentaires), la méthode Canvas et la méthode basée sur DOM sont à peu près aussi rapides, si la mise en cache est ajoutée à la méthode basée sur DOM et que vous n'utilisez pas Firefox. Dans Firefox, pour une raison quelconque, cette méthode Canvas est beaucoup plus rapide que la méthode basée sur DOM (en septembre 2014).
la source
strokeText()
oufillText()
. Peut-être vouliez-vous commenter une réponse différente?En voici un que j'ai fouetté sans exemple. Il semble que nous soyons tous sur la même longueur d'onde.
Son utilisation est simple:
"a string".width()
** Ajouté
white-space: nowrap
afin que les chaînes avec une largeur supérieure à la largeur de la fenêtre puissent être calculées.la source
String
car elle diminue la séparation des préoccupations de votre programme (code de base séparé vs code d'interface utilisateur). Imaginez que vous souhaitiez porter votre code principal sur une plate-forme avec un cadre d'interface utilisateur très différent ...o[0].getBoundingClientRect().width
comme suggéré ici: stackoverflow.com/a/16072668/936397jQuery:
la source
Cela fonctionne pour moi ...
la source
La bibliothèque javascript ExtJS possède une grande classe appelée Ext.util.TextMetrics qui "fournit des mesures précises en pixels pour les blocs de texte afin que vous puissiez déterminer exactement quelle hauteur et quelle largeur, en pixels, un bloc de texte donné sera". Vous pouvez l'utiliser directement ou afficher sa source pour coder pour voir comment cela se fait.
http://docs.sencha.com/extjs/6.5.3/modern/Ext.util.TextMetrics.html
la source
J'aime votre "seule idée" de faire juste une carte de largeur de caractère statique! Cela fonctionne bien pour mes besoins. Parfois, pour des raisons de performances ou parce que vous n'avez pas facilement accès à un DOM, vous pouvez simplement souhaiter une calculatrice autonome rapide et hacky calibrée à une seule police. Voici donc un calibré pour Helvetica; passez une chaîne et (éventuellement) une taille de police:
Ce tableau laid géant est des largeurs de caractères ASCII indexées par code de caractère. Donc, cela prend juste en charge ASCII (sinon cela suppose une largeur de caractère moyenne). Heureusement, la largeur évolue essentiellement de façon linéaire avec la taille de la police, donc cela fonctionne assez bien avec n'importe quelle taille de police. Il manque visiblement de conscience du crénage, des ligatures ou autre.
Pour "calibrer" je viens de rendre chaque caractère jusqu'au charCode 126 (le puissant tilde) sur un svg et j'ai obtenu le cadre de délimitation et l'ai enregistré dans ce tableau; plus de code et d'explication et de démonstration ici .
la source
* fontSize
et les utiliserJ'ai écrit un petit outil pour ça. C'est peut-être utile à quelqu'un. Cela fonctionne sans jQuery .
https://github.com/schickling/calculate-size
Usage:
Violon: http://jsfiddle.net/PEvL8/
la source
Vous pouvez utiliser le canevas pour ne pas avoir à vous soucier autant des propriétés css:
la source
Cela devrait fonctionner tant que la balise <span> n'a aucun autre style appliqué. offsetWidth inclura la largeur des bordures, le remplissage horizontal, la largeur de la barre de défilement verticale, etc.
la source
Le code-snips ci-dessous, "calcule" la largeur de la balise span, lui ajoute "..." s'il est trop long et réduit la longueur du texte, jusqu'à ce qu'il rentre dans son parent (ou jusqu'à ce qu'il ait essayé plus de un millier de fois)
CSS
HTML
JavaScript (avec jQuery)
la source
Le mieux est de détecter si le texte s’adapte juste avant d’afficher l’élément. Vous pouvez donc utiliser cette fonction qui ne nécessite pas que l'élément soit à l'écran.
Usage:
la source
Dans le cas où quelqu'un d'autre est venu ici à la fois pour trouver un moyen de mesurer la largeur d'une chaîne et un moyen de savoir quelle est la plus grande taille de police qui conviendra à une largeur particulière, voici une fonction qui s'appuie sur la solution de @ Domi avec une recherche binaire :
la source
Essayez ce code:
la source
La largeur et la hauteur d'un texte peuvent être obtenues avec
clientWidth
etclientHeight
assurez-vous que la propriété de position de style est définie sur absolue
pas obligé d'être à l'intérieur d'un
div
, peut être à l'intérieur d'unp
ou d'unspan
la source
À partir de la réponse de Deepak Nadar , j'ai changé les paramètres des fonctions pour accepter les styles de texte et de police. Vous n'avez pas besoin de référencer un élément. De plus, ils
fontOptions
ont des valeurs par défaut, vous n'avez donc pas besoin de tous les fournir.la source
Je suppose que cela ressemble à l'entrée de Depak, mais est basé sur le travail de Louis Lazaris publié dans un article sur une page Web impressionnante
L'événement fit est utilisé pour exécuter l'appel de fonction immédiatement après que la fonction est associée au contrôle.
par exemple: $ ('input'). autofit (). trigger ("fit");
la source
Sans jQuery:
la source
Violon de l'exemple de travail: http://jsfiddle.net/tdpLdqpo/1/
HTML:
Code JavaScript:
la source
La somme de toutes les largeurs de rectangle renvoyées donne la largeur totale du texte en pixels.
la source
J'ai fait un petit module ES6 (utilise jQuery):
Facile à utiliser:
Chose cool que vous pourriez remarquer - cela permet de prendre en compte tous les attributs CSS, même les rembourrages!
la source
Vous pouvez également le faire avec createRange, qui est plus précis, qu'avec la technique de clonage de texte:
la source
la source