Wie kann man jQuery dazu bringen, den von .width () zurückgegebenen Wert nicht zu runden?

94

Ich habe mich umgesehen und konnte das nicht finden. Ich versuche, die Breite eines Div zu ermitteln, aber wenn es einen Dezimalpunkt hat, rundet es die Zahl.

Beispiel:

#container{
    background: blue;
    width: 543.5px;
    height: 20px;
    margin: 0;
    padding: 0;
}

Wenn ich das tue $('#container').width();, wird 543 statt 543.5 zurückgegeben. Wie kann ich erreichen, dass die Zahl nicht gerundet wird und die volle 543.5 (oder welche Zahl auch immer) zurückgegeben wird?

MoDFoX
quelle
2
Warum haben Sie dezimale Pixelbreiten? Sie werden sowieso auf ganze Zahlen gerundet. Sie können kein halbes Pixel haben.
Moin Zaman
Warum brauchst du das? Ohne diese Informationen ist diese Frage sinnlos.
Juan Mendes
2
@JuanMendes In meinem Fall berechnet Chrome 38 auf einem HiDPI-Display eine nicht ganzzahlige Fensterbreite. Wenn also $ .width auf 1250,6 bis 1251 aufgerundet wird und ich Berechnungen basierend auf 1251 durchführe, habe ich Probleme. Abrunden ist weniger ein Problem.
JKS

Antworten:

196

Verwenden Sie den nativen Element.getBoundingClientRectund nicht den Stil des Elements. Es wurde in IE4 eingeführt und wird von allen Browsern unterstützt:

$("#container")[0].getBoundingClientRect().width

Hinweis: Informationen zu IE8 und niedriger finden Sie in den Hinweisen zu "Browserkompatibilität" in den MDN-Dokumenten.

Ross Allen
quelle
9
+1 Wenn Sie die Breite eines anderen Elements festlegen, müssen Sie dessen Breite folgendermaßen ändern: $ ("# other"). CSS ("width", $ ('# container'). Get (0) .getBoundingClientRect ( ) .width + "px"); Wenn Sie jQuery width () verwenden, wird der Wert gerundet.
Lepe
1
Entsprechend dieser ähnlichen Frage werden die Eigenschaften widthund heightnicht in allen IE-Versionen unterstützt. In einigen Fällen müssen sie daher berechnet werden, bevor sie verwendet werden können: stackoverflow.com/questions/11907514/…
flightL123
Nett! gleiche Frage für OuterWidth (wahr)? :) kleine Bemerkung: `In IE8 und darunter fehlen dem von getBoundingClientRect () zurückgegebenen DOMRect-Objekt die Eigenschaften für Höhe und Breite. Außerdem können diesen DOMRect-Objekten keine zusätzlichen Eigenschaften (einschließlich Höhe und Breite) hinzugefügt werden. "
TecHunter
5
Beachten Sie, dass getBoundingClientRect()die Dimensionen nach dem Anwenden von CSS-Transformationen berechnet werden .
user1620220
Nach dem Testen stellte ich fest, dass diese Methode für versteckte Elemente ( display: none) nicht funktioniert .
Jory Hogeveen
9

Ich wollte hier nur meine Erfahrung hinzufügen, obwohl die Frage alt ist: Der obige Konsens scheint zu sein, dass die Rundung von jQuery genauso gut ist wie eine ungerundete Berechnung - aber das scheint bei etwas, das ich getan habe, nicht der Fall zu sein .

Mein Element hat im Allgemeinen eine flüssige Breite, aber der Inhalt ändert sich dynamisch über AJAX. Vor dem Wechseln des Inhalts sperre ich vorübergehend die Abmessungen des Elements, damit mein Layout während des Übergangs nicht herumspringt. Ich habe festgestellt, dass mit jQuery wie folgt:

$element.width($element.width());

verursacht etwas Spaß, als ob es Subpixel-Unterschiede zwischen der tatsächlichen Breite und der berechneten Breite gibt. (Insbesondere wird ein Wort von einer Textzeile zur nächsten springen, das angibt, dass die Breite geändert und nicht nur gesperrt wurde.) Aus einer anderen Frage - Ermitteln der tatsächlichen Gleitkommabreite eines Elements - habe ich herausgefunden out, window.getComputedStyle(element).widthdas eine ungerundete Berechnung zurückgibt. Also habe ich den obigen Code in so etwas wie geändert

var e = document.getElementById('element');
$('#element').width(window.getComputedStyle(e).width);

Und mit DIESEM Code - kein lustiges Hüpfen! Diese Erfahrung scheint darauf hinzudeuten , dass der unrounded Wert tatsächlich tut Angelegenheit an den Browser, nicht wahr? (In meinem Fall Chrome Version 26.0.1410.65.)

davidtheclark
quelle
Das aktuelle Dokument für .css () von jQuery weist darauf hin, dass getComputedStyle () als runtimeStyle () i IE bezeichnet wird, und behauptet, einer der Vorteile von .css () sei diese einheitliche Schnittstelle.
Norwebian
9

Die Antwort von Ross Allen ist ein guter Ausgangspunkt, aber bei Verwendung von getBoundingClientRect (). Width werden auch die Auffüllung und die Rahmenbreite berücksichtigt, was bei der Breitenfunktion der Abfrage nicht der Fall ist :

Das zurückgegebene TextRectangle-Objekt enthält den Abstand, die Bildlaufleiste und den Rand, schließt jedoch den Rand aus. In Internet Explorer umfassen die Koordinaten des Begrenzungsrechtecks ​​den oberen und linken Rand des Clientbereichs.

Wenn Sie den widthWert präzise ermitteln möchten, müssen Sie die Polsterung und den Rand folgendermaßen entfernen:

var a = $("#container");
var width = a[0].getBoundingClientRect().width;

//Remove the padding width (assumming padding are px values)
width -= (parseInt(a.css("padding-left")) + parseInt(a.css("padding-right")));

//Remove the border width
width -= (a.outerWidth(false) - a.innerWidth());
The_Black_Smurf
quelle
Sie sollten das nicht .replace("px", "")als parseIntsollte das für Sie entfernen.
Steve Schrab
Da es bei dieser Frage nur darum geht, Rundungen zu verhindern, amüsiert mich die explizite Annahme, dass Rundungen für die Füllwerte in Ordnung sind. Warum würden Sie das anders behandeln als Breitenwerte?! Verwenden Sie parseFloat()vielleicht?
Phils
In ähnlicher Weise mit innerWidth()Teil des ursprünglichen Problems zu sein, fürchte ich , dass die Rahmenbreite hier Berechnung auch auf gerundeten Werten arbeitet.
Phils
2

Sie können dafür verwenden getComputedStyle:

parseFloat(window.getComputedStyle($('#container').get(0)).width)
Anton Tschukanow
quelle
-1

Verwenden Sie Folgendes, um eine genaue Breite zu erhalten:

var htmlElement=$('class or id');
var temp=htmlElement[0].style.width;
Ali Hasan
quelle
Warum sollten Sie nicht wollen, dass jquery Ihre berechnete Breite erhält, wenn Sie sie tatsächlich einstellen und instyle.width
user151496