如何使jQuery不舍入.width()返回的值?


94

我到处搜寻,却找不到。我正在尝试获取div的宽度,但是如果它有小数点,则将数字四舍五入。

例:

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

如果我这样做$('#container').width();,它将返回543而不是543.5。我如何不对数字取整并返回完整的543.5(或任何数字)。


2
为什么会有小数像素宽度?无论如何,它们都会四舍五入为整数。您不能有半像素。
Moin Zaman 2010年

你为什么需要这个?没有这些信息,这个问题就毫无意义。
Juan Mendes 2013年

2
@JuanMendes就我而言,在HiDPI显示器上,Chrome 38计算出非整数的窗口宽度。因此,如果$ .width向上取整,例如从1250.6到1251,并且我基于1251进行计算,则将遇到问题。四舍五入并不是一个大问题。
JKS 2014年

Answers:


198

使用本机Element.getBoundingClientRect而不是元素的样式。它是IE4中引入的,并且受所有浏览器支持:

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

注意:对于IE8及以下版本,请参阅MDN文档中的“浏览器兼容性”注释


9
+1如果要设置另一个元素的宽度,请确保以这种方式更改其宽度:$(“#other”)。css(“ width”,$('#container')。get(0).getBoundingClientRect( ).width +“ px”); 如果使用jQuery width(),则该值将被四舍五入。
lepe 2014年

1
根据这个类似的问题,并非所有版本的IE都支持widthheight属性,因此在某些情况下,需要先进行计算,然后才能使用它们: stackoverflow.com/questions/11907514/…–
flyingL123

真好!相同的问题,问outerWidth(true)?:)小注:`在IE8及以下版本中,由getBoundingClientRect()返回的DOMRect对象缺少height和width属性。此外,不能将其他属性(包括高度和宽度)添加到这些DOMRect对象上。–
TecHunter,2015年

5
请注意,在应用CSS转换后getBoundingClientRect()计算尺寸。
user1620220 '16

经过测试后,我发现此方法不适用于隐藏的元素(display: none)。
Jory Hogeveen '17

10

罗斯·艾伦(Ross Allen)的答案是一个很好的起点,但使用getBoundingClientRect()。width还将包括填充和边框宽度,而jQuery的width函数则不是这样:

返回的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删除它。
史蒂夫·施拉布

这个问题全都与防止舍入有关,这里的明确假设令我感到困惑,因为对于填充值来说舍入是可以的。您为什么要与宽度值区别对待呢?使用parseFloat()吗?
菲尔(Philips)'18 -10-9

同样,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()在IE中称为runtimeStyle(),并且声称.css()的优点之一是该统一接口。
norwebian 2013年


-1

使用以下命令获得准确的宽度:

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

为什么您会想让jquery获得您实际计算的宽度,如果您实际对其进行设置并使其可用style.width
user151496
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.