.width ()에서 반환 된 값을 반올림하지 않도록 jQuery를 만드는 방법은 무엇입니까?


94

나는 주위를 수색했지만 이것을 찾을 수 없었다. div의 너비를 얻으려고하는데 소수점이 있으면 숫자를 반올림합니다.

예:

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

그렇게 $('#container').width();하면 543.5 대신 543이 반환됩니다. 숫자를 반올림하지 않고 전체 543.5 (또는 숫자가 무엇이든)를 반환하려면 어떻게해야합니까?


2
십진수 픽셀 너비가있는 이유는 무엇입니까? 어쨌든 정수로 반올림됩니다. 반 픽셀을 가질 수 없습니다.
— Moin Zaman

왜 이것이 필요합니까? 그 정보가 없으면이 질문은 무의미합니다.
— Juan Mendes 2013

2
@JuanMendes 필자의 경우 HiDPI 디스플레이에서 Chrome 38은 정수가 아닌 창 너비를 계산합니다. 따라서 $ .width가 1250.6에서 1251로 반올림되고 1251을 기준으로 계산하면 문제가 있습니다. 반올림은 큰 문제가 아닙니다.
— JKS

답변:


198

Element.getBoundingClientRect요소의 스타일보다는 기본을 사용하십시오 . IE4에서 도입되었으며 모든 브라우저에서 지원됩니다.

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

참고 : IE8 이하의 경우 MDN 문서 의 "브라우저 호환성"참고 사항 을 참조하십시오 .


9
+1 다른 요소의 너비를 설정하는 경우 다음과 같이 너비를 변경해야합니다. $ ( "# other"). css ( "width", $ ( '# container'). get (0) .getBoundingClientRect ( ) .width + "px"); jQuery width ()를 사용하면 값이 반올림됩니다.
— 레페

1
이 유사한 질문에 따르면 width및 height속성은 모든 버전의 IE에서 지원되지 않으므로 경우에 따라 사용하기 전에 계산해야하는 경우가 있습니다. stackoverflow.com/questions/11907514/…
— flyingL123

좋은! outerWidth (true)에 대한 동일한 질문? :) 작은 설명 :`IE8 이하에서는 getBoundingClientRect ()가 반환하는 DOMRect 객체에 height 및 width 속성이 없습니다. 이러한 DOMRect가 objects.`에 또한, (높이와 폭을 포함)을 추가 속성이 추가 될 수 없다
— TecHunter

5
CSS 변환을 적용한 후getBoundingClientRect() 치수 를 계산합니다 .
— user1620220

테스트 후이 방법이 숨겨진 요소 ( display: none)에 대해 작동하지 않음을 발견했습니다 .
— Jory Hogeveen

10

Ross Allen의 대답 은 좋은 시작점이지만 getBoundingClientRect (). width를 사용 하면 jquery의 너비 함수 가 아닌 패딩과 테두리 너비도 포함 됩니다 .

반환 된 TextRectangle 객체에는 패딩, 스크롤 막대 및 테두리가 포함되지만 여백은 제외됩니다. Internet Explorer에서 경계 사각형의 좌표에는 클라이언트 영역의 위쪽 및 왼쪽 테두리가 포함됩니다.

width정밀도로 값 을 얻으려면 다음 과 같이 패딩과 테두리를 제거해야합니다.

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

당신은하지해야 .replace("px", "")아니라 parseInt당신을 위해 제거해야합니다.
— Steve Schrab

이 질문은 반올림 방지에 관한 것입니다. 여기서 반올림이 패딩 값에 적합하다는 명시적인 가정에 놀랐습니다. 너비 값과 다르게 취급하는 이유는 무엇입니까?! parseFloat()아마도 사용 하시겠습니까?
— phils

마찬가지로 innerWidth()원래 문제의 일부이기 때문에 여기에서 테두리 너비 계산이 반올림 된 값에서도 작동하는 것이 두렵습니다.
— phils

9

질문은 오래되었지만 여기에 내 경험을 추가하고 싶었습니다. 위의 합의는 jQuery의 반올림이 반올림되지 않은 계산만큼 효과적이라는 것 같습니다. .

내 요소는 일반적으로 유동적이지만 AJAX를 통해 동적으로 변경되는 콘텐츠입니다. 콘텐츠를 전환하기 전에 일시적으로 요소의 크기를 잠 가서 전환 중에 레이아웃이 튀지 않도록합니다. 다음과 같이 jQuery를 사용하는 것을 발견했습니다.

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

실제 너비와 계산 된 너비 사이에 하위 픽셀 차이가있는 것처럼 재미를 유발합니다. (특히, 텍스트의 한 줄에서 다른 줄로 단어가 이동하는 것을 볼 수 있는데, 이는 단지 잠긴 것이 아니라 너비가 변경되었음을 나타냅니다.) 다른 질문에서- 요소의 실제 부동 소수점 너비 가져 오기 -발견했습니다 그 밖으로 window.getComputedStyle(element).width반올림 계산을 반환합니다. 그래서 위의 코드를 다음과 같이 변경했습니다.

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

그리고 그 코드를 사용 하면 재미있는 바운싱이 없습니다! 그 경험은 반올림 값이 실제로 제안 것 같다 않는 오른쪽 브라우저에 문제? (제 경우에는 Chrome 버전 26.0.1410.65입니다.)


jQuery의 .css ()에 대한 현재 문서는 getComputedStyle ()이 runtimeStyle () i IE라고하며 .css ()의 장점 중 하나가이 통합 인터페이스라고 주장합니다.
— norwebian

2

다음과 같이 사용할 수 있습니다 getComputedStyle.

parseFloat(window.getComputedStyle($('#container').get(0)).width)

-1

정확한 너비를 얻으려면 다음을 사용하십시오.

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

실제로 설정하고 사용할 수있는 경우 jquery가 계산 된 너비를 얻는 이유는 무엇입니까?style.width
— user151496
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.