2010-08-20 15 views
16

Beim Versuch, die Breite eines ausgeblendeten Elements zu berechnen, habe ich festgestellt, dass jquery.width() 0 für die Breite dieser Elemente zurückgibt.Convert css width string in reguläre Nummer

Ich fand heraus, dass die Verwendung von jquery.css ('width') die richtige Breite zurückgab, indem die angegebene Formatbreite verwendet wurde (auch wenn dieser Wert vom ursprünglichen Stylesheet abweicht). Das Problem ist, dass die Methode css ('width') eine Zeichenfolge zurückgibt, im Allgemeinen in einer "100px" -Methode. Meine Frage löst sich auf: Wie kann ich die Nummer aus der "100px" -Zeichenfolge abrufen? Gibt es einen einfachen Weg?

+0

Änderung: Das Element, das ich versuche, die Breite zu berechnen, ist in der Größe veränderbar und kann während der Ausführung ausgeblendet werden, daher wird sich seine Breite ändern. – vitorhsb

Antwort

23

Wenn es immer in Pixel-Format zurückgibt, "100px", "50px" usw. (also nicht "em" oder Prozent), konnte man nur ...

var width = parseInt($("#myelem").css("width"),10); // always use a radix 

oder

var width = parseInt(element.style.width,10); // always use a radix 

Es ignoriert das Suffix "px", also sollten Sie gut gehen.

Obwohl tief in mir denke ich, dass etwas nicht stimmt, wenn $ ("# myelem"). Width() funktioniert nicht.

Hinweis zu versteckten Elementen.

Wenn Sie jQuery hinzufügen, um Ihre Seite progressiv zu erweitern, sollte das Element, das Sie berechnen, beim ersten Laden der Seite sichtbar sein. Sie sollten also die Breite erhalten, bevor Sie das Element zunächst ausblenden. Auf diese Weise funktioniert $ ("# myelem"). Width().

var myWidth = 0; 

$(document).ready(function() { 
    myWidth = $("#myelem").width(); 
    $("#myelem").hide(); 
}); 
+1

Der Grund, warum '.width()' nicht funktioniert, ist, dass Objekte, die durch '.hide()' ('display: none') verdeckt werden, nicht zum Layout beitragen und daher keine Breite haben. –

+0

Ah. Ich werde dafür eine Lösung liefern ... – Fenton

+0

Das Element, das ich versuche, die Breite zu berechnen, ist in der Größe veränderbar und kann während der Ausführung ausgeblendet werden, daher wird sich seine Breite schließlich ändern. Also, wie Sie vorgeschlagen haben, kann ich eine Variable verwenden, um ihren Wert zu halten, der auf Seite '.ready()' Ereignis berechnet wird und in jedem Resize-Callback-Ereignis muss ich neu berechnen - mit '.width()' - und Wende den neuen Wert an. Daher, auch wenn das Element ausgeblendet ist, werde ich den aktuellen Wert haben. – vitorhsb

1

Oh, kam ich mit:
new Number($elem.css('width').slice(0, -2));
//to extract the 'px' and return a regular number

Jetzt habe ich nur hoffen, dass Jquery durchweg die gleiche Zeichenfolge Art und Weise zurückgibt: „100px“

+1

Es wird, wenn Sie sie alle als 'px' definiert haben. Wenn Sie jedoch einige Breiten als '%' haben, wird es als '50%' zurückkommen und Ihre Slice-Funktion schneidet die rechte Ziffer ab. Sie könnten 'indexOf' verwenden, um aus Sicherheitsgründen auf' px' zu prüfen. – Pat

+1

oder Sie könnten Nicht-Numerische mit einem regulären Ausdruck entfernen. Dies funktioniert unabhängig davon, wie Sie die Breite definieren ('px',' em', '%', 'pt') js:' Number (elem.style.width.replace (/ [^ \ d \.]/G, ')); 'oder jQuery:' Number ($ elem.css (' width '). replace (/ [^ \ d \.]/g,' ')); ' – hofnarwillie

0

ich .width() bleiben würde, weil es die tatsächlich bekommt berechnete Breite statt CSS-Breite. Anstatt es mit (display: none) zu verstecken, können Sie es mit .css('visible', 'hidden') verstecken, dann sollte .width() funktionieren.

von meinem Kommentar Wenn Sie wollen Sie nicht ändern Sie Ihre .hide() die dann visible: hidden anwenden könnten und danach .show() und dann die Höhe messen. Nachdem Sie es gemessen haben, kehren Sie das um. Objekte wirken sich immer noch auf das Seitenlayout aus, wenn sie von visible: hidden ausgeblendet werden - Vorsicht.

Um Tags zu vermeiden, die mit dem Layout verwechselt werden, können Sie die Position auf absolut setzen, sie zum Body-Tag bewegen und dann messen.

+0

Ich bin damit einverstanden, die berechnete Breite zu verwenden. In der Tat war das Element in der Load-Seite Ereignis versteckt, plus ein paar mehr .hide. Ich habe die CSS von "display: none" zu "visibility: hidden" geändert und dann konnte ich die gleichen Werte mit .width() lesen. Super. Jetzt muss ich nur alle Auszüge in Ihre vorgeschlagenen .css('visible', 'hidden') ändern. Ich vermute, dass ich auch die .show() in .css('visibility', 'visible') ändern muss. Danke. – vitorhsb

+0

Anstatt all diese Arbeit zu tun. Dann können Sie 'visible: hidden' und danach' .show() 'anwenden und dann die Breite messen. Nachdem Sie es gemessen haben, kehren Sie das um. Dann musst du dich nicht so viel ändern. Objekte wirken sich immer noch auf die Seite aus, wenn sie durch "sichtbar: versteckt" verborgen sind - Vorsicht. –

2

Sie könnten Nicht-Numerische mit einem regulären Ausdruck entfernen und dann nur in eine Zahl umwandeln. Dies funktioniert unabhängig von der Definition der Breite (px, em, %, pt). Behält auch Dezimalpunkte bei.

Vanille javascript

Number(elem.style.width.replace(/[^\d\.\-]/g, '')); 

jQuery

Number($elem.css('width').replace(/[^\d\.\-]/g, '')); 
0

Im Klar JavaScript:

parseInt('100px', 10) 

Werke mit "100em", "100%", und sogar mit : "100". Keine Notwendigkeit für irgendwelche regulären Ausdrucksmuster.