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ę).


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.


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());

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.)


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)

-1

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

var htmlElement=$('class or id');
var temp=htmlElement[0].style.width;

dlaczego miałbyś chcieć, żeby jquery dostał twoją obliczoną szerokość, jeśli faktycznie ją ustawisz i masz ją dostępną wstyle.width
user151496
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.