Ich versuche, die Textbreite mit jQuery zu berechnen. Ich bin mir nicht sicher was, aber ich mache definitiv etwas falsch.
Also, hier ist der Code:
var c = $('.calltoaction');
var cTxt = c.text();
var cWidth = cTxt.outerWidth();
c.css('width' , cWidth);
Antworten:
Das hat bei mir besser funktioniert:
quelle
'</span>'
ein Semikolon fehlt , obwohl es keinen Unterschied zu machen scheint (mit oder ohne FF9).Hier ist eine Funktion, die besser ist als andere, weil
<input>
,<span>
oder"string"
.Demo: http://jsfiddle.net/philfreo/MqM76/
quelle
Meine Lösung
Grundsätzlich eine Verbesserung gegenüber Runes, die nicht
.html
so leichtfertig genutzt wirdquelle
/
vor der schließenden Klammer des<span>
Tags fehlen :calculator = $('<span style="display: inline-block;" />'),
Die
textWidth
in den Antworten angegebenen Funktionen, die astring
als Argument akzeptieren, berücksichtigen keine führenden und nachfolgenden Leerzeichen (diese werden nicht im Dummy-Container gerendert). Sie funktionieren auch nicht, wenn der Text ein HTML-Markup enthält (eine Unterzeichenfolge<br>
erzeugt keine Ausgabe und
gibt die Länge eines Leerzeichens zurück).Dies ist nur ein Problem für die
textWidth
Funktionen, die a akzeptierenstring
, denn wenn ein DOM-Element angegeben ist und.html()
auf das Element aufgerufen wird, besteht wahrscheinlich keine Notwendigkeit, dies für einen solchen Anwendungsfall zu beheben.Wenn Sie beispielsweise die Breite des Texts berechnen, um die Breite eines Textelements
input
während der Benutzertypen dynamisch zu ändern (mein aktueller Anwendungsfall), möchten Sie wahrscheinlich führende und nachfolgende Leerzeichen durch
die Zeichenfolge ersetzen und diese codieren zu html.Ich habe die Lösung von philfreo verwendet. Hier ist eine Version davon, die dies behebt (mit Kommentaren zu Ergänzungen):
quelle
font-size
. Ich musste hinzufügen,css('font-size'), this.css('font-size'))
damit es funktioniert. Irgendwelche Ideen, warumfont
allein dieser Wert nicht kopiert wird?.css
Methode, aber ich sehe, dass meine Klammern falsch sind. Sollte seincss('font-size', this.css('font-size'))
.Die Breitenfunktionen von jQuery können aufgrund inkonsistenter Boxmodelle etwas zwielichtig sein, wenn versucht wird, die Textbreite zu bestimmen. Der sichere Weg wäre, div in Ihr Element einzufügen, um die tatsächliche Textbreite zu bestimmen:
Um dieses Mini-Plugin zu verwenden, einfach:
quelle
span
Sie nur Null. Versuchte diese Lösung auf einemH2
, wo übergeordnete Elemente Überlauf versteckt haben, und ich bekomme nur die abgeschnittene Länge des Textes. Vielleicht würde eine Erklärung, wie dies funktionieren soll, dazu beitragen, dass es besser funktioniert?Ich fand, dass diese Lösung gut funktioniert und die Ursprungsschriftart vor der Größenänderung erbt:
quelle
org.css("font-weight")
. Ich würde auch sagen, dass derif(!text)
Teil nicht intuitiv ist. Wenn ich zB verwendejQuery("#someContainer").textWidth("Lorem ipsum")
, möchte ich die Textbreite von "Lorem ipsum" wissen, wenn es in diesem bestimmten Container angewendet wird.Weder Runes noch Brains arbeiteten für mich, falls das Element, das den Text enthielt, eine feste Breite hatte. Ich habe etwas Ähnliches wie Okamera gemacht. Es werden weniger Selektoren verwendet.
BEARBEITEN: Es wird wahrscheinlich nicht für Elemente funktionieren, die relative verwenden
font-size
, da der folgende Code einhtmlCalc
Element einfügt ,body
wodurch die Informationen über die Elternbeziehung verloren gehen.quelle
this
ist bereits ein jQuery-Objekt vorhanden, daher$(this)
ist es redundant.Wenn Sie versuchen, dies mit Text in einem Auswahlfeld zu tun, oder wenn diese beiden nicht funktionieren, versuchen Sie stattdessen Folgendes:
oder
Wenn Sie zuerst den Text abrufen möchten
quelle
Die Sache, die Sie falsch machen, ist, dass Sie eine Methode für cTxt aufrufen, die eine einfache Zeichenfolge und kein jQuery-Objekt ist. cTxt ist wirklich der enthaltene Text.
quelle
Leichte Änderung an Nico, da .children () eine leere Menge zurückgibt, wenn wir auf ein Textelement wie h1 oder p verweisen . Also verwenden wir stattdessen .contents () und dies anstelle von $ (this), da wir eine Methode für ein jQuery-Objekt erstellen.
quelle
Nachdem ich zwei Tage lang einem Geist nachgejagt hatte, um herauszufinden, warum die Breite eines Textes falsch war, wurde mir klar, dass Leerzeichen in der Textzeichenfolge die Breitenberechnung stoppen würden.
Ein weiterer Tipp ist, zu überprüfen, ob die Leerzeichen Probleme verursachen. verwenden
nicht unterbrechender Raum und sehen Sie, ob dies das Problem behebt.
Die anderen Funktionen, die die Leute vorgeschlagen hatten, funktionierten ebenfalls gut, aber es waren die Leerzeichen, die Probleme verursachten.
quelle
white-space: nowrap
das Inline-CSS nur vorübergehend hinzu , um dies zu vermeiden.Wenn Sie versuchen, die Breite einer Mischung aus Textknoten und Elementen innerhalb eines bestimmten Elements zu bestimmen, müssen Sie den gesamten Inhalt mit wrapInner () umbrechen , die Breite berechnen und dann den Inhalt auspacken.
* Hinweis: Sie müssen jQuery auch erweitern, um eine unwrapInner () -Funktion hinzuzufügen, da diese nicht standardmäßig bereitgestellt wird.
quelle
Erweiterung der Antwort von @ philfreo:
Ich habe die Möglichkeit hinzugefügt, nach zu suchen
text-transform
, da Dinge wietext-transform: uppercase
normalerweise dazu neigen, den Text breiter zu machen.quelle
quelle
Rufen Sie getColumnWidth () auf, um den Text abzurufen. Das funktioniert einwandfrei.
Hinweis: - Wenn Sie Inline-CSS möchten, übergeben Sie die Schriftdetails nur im Stil.
quelle
Ich habe Nicos Code so geändert, dass er meinen Anforderungen entspricht.
Ich verwende .contents (), da .children () keine von mir benötigten Textknoten zurückgibt. Ich habe auch festgestellt, dass die zurückgegebene Breite durch die Breite des Ansichtsfensters beeinflusst wurde, was zu einem Umbruch führte. Daher verwende ich Leerzeichen: nowrap; um die richtige Breite unabhängig von der Breite des Ansichtsfensters zu erhalten.
quelle
fast ein Einzeiler. Gibt dir das mit des ersten Charakters
quelle
Ich konnte keine der aufgelisteten Lösungen zu 100% zum Laufen bringen und entwickelte diesen Hybrid , basierend auf Ideen von @chmurson (der wiederum auf @Okamera basierte) und auch von @philfreo:
Anmerkungen:
this
In einer jQuery-Erweiterungsmethode befindet sich bereits ein jQuery-Objekt, sodass nicht all das Extra benötigt wird$(this)
, das viele Beispiele haben.white-space: nowrap
, nur um sicherzustellen, dass es als einzelne Zeile gemessen wird (und nicht als Zeilenumbruch basierend auf einem anderen Seitenstil).font
alleine zum Laufen bringen und musste auch explizit kopierenfont-size
. Ich weiß noch nicht warum (untersucht noch).@philfreo
.quelle
Manchmal müssen Sie zusätzlich die Höhe und nicht nur den Text , sondern auch die HTML-Breite messen . Ich nahm die Antwort von @philfreo und machte sie flexibler und nützlicher:
quelle
Die Textbreite kann für verschiedene Eltern unterschiedlich sein. Wenn Sie beispielsweise einen Text in das h1-Tag einfügen, ist dieser breiter als div oder label. Meine Lösung lautet also wie folgt:
quelle
Ich hatte Probleme mit Lösungen wie @ rune-kaagaard für große Textmengen. Ich habe folgendes entdeckt:
JSFiddle GitHub
quelle
Ich denke, Sie sollten verwenden
$('.calltoaction').val;
Außerdem würde ich dafür id (#) anstelle einer Klasse verwenden. Wenn Sie mehr als eine dieser Klassen haben, wie würde es damit umgehen?
quelle