Jak sprawić, by jQuery nie zaokrąglała wartości zwracanej przez .width ()?

94

Szukałem wokół i nie mogłem tego znaleźć. Próbuję uzyskać szerokość elementu div, ale jeśli ma przecinek dziesiętny, zaokrągla liczbę.

Przykład:

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

Jeśli to zrobię $('#container').width();, zwróci 543 zamiast 543,5. Jak sprawić, żeby nie zaokrąglił liczby i zwrócił pełne 543,5 (lub jakąkolwiek inną liczbę).

MoDFoX
źródło
2
Dlaczego masz dziesiętne szerokości pikseli? I tak są zaokrąglane do liczb całkowitych. Nie możesz mieć pół piksela.
Moin Zaman
Dlaczego tego potrzebujesz? Bez tych informacji to pytanie jest bezcelowe.
Juan Mendes,
2
@JuanMendes W moim przypadku Chrome 38 na wyświetlaczu HiDPI oblicza niecałkowitą szerokość okna. Tak więc, jeśli $ .width zaokrągla się w górę, powiedzmy, 1250,6 do 1251 i wykonuję obliczenia w oparciu o 1251, mam problemy. Zaokrąglanie w dół nie stanowi większego problemu.
JKS

Odpowiedzi:

198

Użyj natywnego Element.getBoundingClientRectzamiast stylu elementu. Został wprowadzony w IE4 i jest obsługiwany przez wszystkie przeglądarki:

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

Uwaga: W przypadku IE8 i starszych, zobacz uwagi „Zgodność z przeglądarkami” w dokumentacji MDN.

Ross Allen
źródło
9
+1 Jeśli ustawiasz szerokość innego elementu, pamiętaj, aby zmienić jego szerokość w ten sposób: $ ("# other"). Css ("width", $ ('# container'). Get (0) .getBoundingClientRect ( ) .width + „px”); Jeśli używasz jQuery width (), wartość zostanie zaokrąglona.
lepe
1
Zgodnie z tym podobnym pytaniem właściwości widthi heightnie są obsługiwane we wszystkich wersjach IE, więc w niektórych przypadkach należy je obliczyć, zanim będą mogły zostać użyte: stackoverflow.com/questions/11907514/…
flyingL123
Miły! to samo pytanie dla externalWidth (true)? :) mała uwaga: `` W IE8 i niższych, obiekt DOMRect zwrócony przez getBoundingClientRect () nie ma właściwości wysokości i szerokości. Ponadto, dodatkowe właściwości (w tym wysokość i szerokość) nie mogą być dodawane do tych obiektów DOMRect. "
TecHunter
5
Zauważ, że getBoundingClientRect()oblicza wymiary po zastosowaniu transformacji CSS .
user1620220
Po przetestowaniu stwierdziłem, że ta metoda nie działa dla ukrytych elementów ( display: none).
Jory Hogeveen
10

Odpowiedź Rossa Allena jest dobrym punktem wyjścia, ale użycie getBoundingClientRect (). Width będzie również obejmować dopełnienie i szerokość obramowania, co nie jest w przypadku funkcji width jquery :

Zwrócony obiekt TextRectangle zawiera dopełnienie, pasek przewijania i obramowanie, ale wyklucza margines. W programie Internet Explorer współrzędne prostokąta ograniczającego obejmują górną i lewą granicę obszaru roboczego.

Jeśli Twoim zamiarem jest uzyskanie widthwartości z precyzją, musisz usunąć wypełnienie i obramowanie w następujący sposób:

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
źródło
Państwo nie powinno .replace("px", "")jak parseIntpowinien usunąć to za Ciebie.
Steve Schrab
To pytanie dotyczy zapobiegania zaokrąglaniu, jestem zdumiony wyraźnym założeniem, że zaokrąglanie jest w porządku dla wartości dopełnienia. Dlaczego miałbyś traktować to inaczej niż wartości szerokości ?! Użyj parseFloat()może?
phils
Podobnie, innerWidth()będąc częścią pierwotnego problemu, obawiam się, że obliczanie szerokości obramowania działa tutaj również na wartościach zaokrąglonych.
phils
9

Chciałem tylko dodać tutaj moje doświadczenie, chociaż pytanie jest stare: powyższy konsensus wydaje się być taki, że zaokrąglanie jQuery jest tak samo dobre jak niezaokrąglone obliczenia - ale nie wydaje się, aby tak było w przypadku czegoś, co robiłem .

Mój element ma ogólnie płynną szerokość, ale zawartość zmienia się dynamicznie za pośrednictwem AJAX. Przed przełączeniem zawartości tymczasowo blokuję wymiary elementu, aby mój układ nie podskakiwał podczas przejścia. Odkryłem, że używając jQuery w następujący sposób:

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

powoduje to trochę zabawne, na przykład różnice między rzeczywistą szerokością a obliczoną szerokością są subpikselowe. (Konkretnie, zobaczę, jak słowo przeskakuje z jednego wiersza tekstu do drugiego, wskazując, że szerokość została zmieniona, a nie tylko zablokowana.) Z innego pytania - Pobieranie rzeczywistej, zmiennoprzecinkowej szerokości elementu - znalazłem to window.getComputedStyle(element).widthzwróci niezaokrąglone obliczenia. Więc zmieniłem powyższy kod na coś takiego

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

A z TYM kodem - bez zabawnego odbijania! To doświadczenie wydaje się sugerować, że niezaokrąglona wartość ma znaczenie dla przeglądarki, prawda? (W moim przypadku Chrome w wersji 26.0.1410.65.)

davidtheclark
źródło
Bieżący dokument dotyczący .css () jQuery wskazuje, że getComputedStyle () nazywa się runtimeStyle () i IE, i twierdzi, że jedną z zalet .css () jest ten ujednolicony interfejs.
norweska
2

Możesz użyć getComputedStyledo tego:

parseFloat(window.getComputedStyle($('#container').get(0)).width)
Anton Chukanov
źródło
-1

Użyj poniższych, aby uzyskać dokładną szerokość:

var htmlElement=$('class or id');
var temp=htmlElement[0].style.width;
Ali Hasan
źródło
dlaczego miałbyś chcieć, żeby jquery dostał twoją obliczoną szerokość, jeśli faktycznie ją ustawisz i masz ją dostępną wstyle.width
user151496