J'essaye de calculer la largeur du texte en utilisant jQuery. Je ne sais pas quoi, mais je fais définitivement quelque chose de mal.
Alors, voici le code:
var c = $('.calltoaction');
var cTxt = c.text();
var cWidth = cTxt.outerWidth();
c.css('width' , cWidth);
Réponses:
Cela a mieux fonctionné pour moi:
la source
'</span>'
, bien que cela ne semble pas faire de différence (travaillé avec ou sans lui sur FF9).Voici une fonction qui est meilleure que d'autres publiées car
<input>
,<span>
ou"string"
.Démo: http://jsfiddle.net/philfreo/MqM76/
la source
Ma solution
Fondamentalement, une amélioration par rapport à Rune, qui n'utilise pas
.html
si légèrementla source
/
avant le crochet fermant du<span>
tag:calculator = $('<span style="display: inline-block;" />'),
Les
textWidth
fonctions fournies dans les réponses et qui acceptent unstring
comme argument ne prendront pas en compte les espaces blancs de début et de fin (ceux-ci ne sont pas rendus dans le conteneur factice). En outre, ils ne fonctionneront pas si le texte contient un balisage html (une sous-chaîne<br>
ne produira aucune sortie et
renverra la longueur d'un espace).Ceci n'est un problème que pour les
textWidth
fonctions qui acceptent astring
, car si un élément DOM est donné et.html()
est appelé sur l'élément, alors il n'est probablement pas nécessaire de résoudre ce problème pour un tel cas d'utilisation.Mais si, par exemple, vous calculez la largeur du texte pour modifier dynamiquement la largeur d'un
input
élément de texte au fur et à mesure que l'utilisateur tape (mon cas d'utilisation actuel), vous voudrez probablement remplacer les espaces de début et de fin par
et encoder la chaîne en html.J'ai utilisé la solution de philfreo donc en voici une version qui corrige ce problème (avec des commentaires sur les ajouts):
la source
font-size
. J'ai dû ajoutercss('font-size'), this.css('font-size'))
pour que cela fonctionne. Des idées pourquoifont
seul ne copie pas cette valeur?.css
méthode existante , mais je vois que mes crochets sont erronés. Devrait êtrecss('font-size', this.css('font-size'))
.Les fonctions de largeur de jQuery peuvent être un peu floues lorsque vous essayez de déterminer la largeur du texte en raison de modèles de boîte incohérents. Le moyen le plus sûr serait d'injecter div à l'intérieur de votre élément pour déterminer la largeur réelle du texte:
Pour utiliser ce mini plugin, il suffit de:
la source
span
vous obtenez simplement zéro.H2
J'ai essayé cette solution sur un , où les éléments parents ont le débordement masqué, et je n'obtiens que la longueur tronquée du texte. Peut-être qu'une explication de la façon dont cela est censé fonctionner aiderait-elle à mieux le faire?J'ai trouvé que cette solution fonctionne bien et qu'elle hérite de la police d'origine avant le dimensionnement:
la source
org.css("font-weight")
. Aussi, je dirais que laif(!text)
partie n'est pas intuitive. Si j'utilise par exemple,jQuery("#someContainer").textWidth("Lorem ipsum")
je voudrais connaître la largeur du texte de "Lorem ipsum" lorsqu'il est appliqué dans ce conteneur particulier.Ni Rune ni Brain ne fonctionnaient pour moi au cas où l'élément qui contenait le texte avait une largeur fixe. J'ai fait quelque chose de similaire à Okamera. Il utilise moins de sélecteurs.
EDIT: Cela ne fonctionnera probablement pas pour les éléments qui utilisent relative
font-size
, car le code suivant insère l'htmlCalc
élément dansbody
ainsi perd les informations sur la relation des parents.la source
this
est déjà un objet jQuery et$(this)
est donc redondant.Si vous essayez de faire cela avec du texte dans une boîte de sélection ou si ces deux ne fonctionnent pas, essayez celle-ci à la place:
ou
si vous voulez d'abord saisir le texte
la source
la chose que vous faites mal, c'est que vous appelez une méthode sur cTxt, qui est une simple chaîne et non un objet jQuery. cTxt est vraiment le texte contenu.
la source
Légère modification de celle de Nico, car .children () renverra un ensemble vide si nous référençons un élément de texte comme h1 ou p . Nous allons donc utiliser .contents () à la place, et utiliser this au lieu de $ (this) puisque nous créons une méthode sur un objet jQuery.
la source
après avoir chassé un fantôme pendant deux jours, en essayant de comprendre pourquoi la largeur d'un texte était incorrecte, j'ai réalisé que c'était à cause des espaces blancs dans la chaîne de texte qui arrêteraient le calcul de la largeur.
donc, une autre astuce est de vérifier si les espaces sont à l'origine de problèmes. utilisation
espace insécable et voyez si cela résout le problème.
les autres fonctions suggérées fonctionnent bien aussi, mais ce sont les espaces blancs qui causent des problèmes.
la source
white-space: nowrap
le CSS en ligne pour éviter cela.Si vous essayez de déterminer la largeur d'un mélange de nœuds de texte et d'éléments à l'intérieur d'un élément donné, vous devez envelopper tout le contenu avec wrapInner () , calculer la largeur, puis dérouler le contenu.
* Remarque: Vous devrez également étendre jQuery pour ajouter une fonction unwrapInner () car elle n'est pas fournie par défaut.
la source
Développement de la réponse de @ philfreo:
J'ai ajouté la possibilité de vérifier
text-transform
, car des choses commetext-transform: uppercase
ont généralement tendance à élargir le texte.la source
la source
Appelez getColumnWidth () pour obtenir le avec du texte. Cela fonctionne parfaitement bien.
Remarque: - Si vous voulez .css en ligne, transmettez les détails de la police uniquement avec style.
la source
J'ai modifié le code de Nico pour qu'il réponde à mes besoins.
J'utilise .contents () car .children () ne renvoie pas les nœuds de texte dont j'avais besoin. J'ai également constaté que la largeur renvoyée était affectée par la largeur de la fenêtre qui provoquait un wrapping, donc j'utilise un espace blanc: nowrap; pour obtenir la largeur correcte quelle que soit la largeur de la fenêtre.
la source
presque une seule doublure. Vous donne le avec du premier personnage
la source
Je ne pouvais faire fonctionner aucune des solutions répertoriées à 100%, j'ai donc proposé cet hybride , basé sur des idées de @chmurson (qui était à son tour basée sur @Okamera) et également de @philfreo:
Remarques:
this
à l'intérieur d'une méthode d'extension jQuery se trouve déjà un objet jQuery, donc pas besoin de tout le supplément$(this)
que de nombreux exemples ont.white-space: nowrap
, juste pour vous assurer qu'il le mesure comme une seule ligne (et non un retour à la ligne basé sur un autre style de page).font
seul et devais également copier explicitementfont-size
. Je ne sais pas encore pourquoi (enquête toujours).@philfreo
.la source
Parfois, vous devez également mesurer la hauteur et non seulement le texte , mais également la largeur HTML . J'ai pris la réponse @philfreo et je l'ai rendue plus flexible et utile:
la source
la largeur du texte peut être différente pour différents parents, par exemple si vous ajoutez un texte dans la balise h1, il sera plus large que div ou étiquette, donc ma solution comme celle-ci:
la source
J'ai eu des problèmes avec des solutions comme @ rune-kaagaard pour de grandes quantités de texte. J'ai découvert ceci:
JSFiddle GitHub
la source
je pense que tu devrais utiliser
$('.calltoaction').val;
aussi, j'utiliserais id (#) au lieu d'une classe pour cela .. si vous avez plus d'une de ces classes, comment le gérerait-il?
la source