在Firefox中检索百分比CSS值

12

我在使用火狐浏览器时遇到了一个问题,无法精确地获取CSS属性值(以“%”为单位)。

假设我们有这个非常简单的标记:

<div id="box">box</div>

以及这段 CSS 代码:

#box{
    width:200px;
    height:200px;
    left:10%;
    position:absolute;
    background:red;
}

我想使用JavaScript获取左侧位置的百分比(%)。

使用MooTools很容易实现(示例->http://jsfiddle.net/steweb/AWdzB/):

var left = $('box').getStyle('left');

或者使用jQuery(示例 -> http://jsfiddle.net/steweb/RaVyU/):

var left = $('#box').css('left');

或者通过纯JavaScript(示例->http://jsfiddle.net/steweb/tUAKA/):

function getStyle(el,styleProp){ //from ppk's quirksmode
    var x = document.getElementById(el);
    if (x.currentStyle)
        var y = x.currentStyle[styleProp];
    else if (window.getComputedStyle)
        var y = document.defaultView.getComputedStyle(x,null).getPropertyValue(styleProp);
    return y;
}

var left = getStyle('box','left');

但是如果你在Firefox(8.0.1)上尝试它,你会发现结果不正确(应该是10%,但实际上是91px)。问题是:这个新版本的Firefox有bug吗?是否有人知道这是一个已知的bug?我做错了什么吗?

谢谢:)

更新:我还在旧版的Firefox上尝试了一下,结果也不正确(它总是返回像素值)...为了完整起见,在IE上它可以正确运行。


好问题,旧版本是否报告正确的“%”值? - Chad
我在运行ffox 5.0的虚拟机上尝试了一下,它记录了67.7px..:/..在IE上是正确的(10%)...稍后我会尝试使用ff 6-7,但我不认为它会起作用。 - stecb
我在Windows XP上使用Firefox 7.0,获得了10%的结果。 - Emre Erkan
@EmreErkan 谢谢!我在Mac OS上试了ffox 7.0,但是结果只有47px...这真的很奇怪。 - stecb
@EmreErkan 根据窗口的宽度,可能是47像素,这很奇怪,因为这应该是一个已知的(如果自5.0以来存在)并且已修复的错误 :) - stecb
4个回答

6

这是文件中的记录:

CSS属性的使用值是在执行所有计算后得到的最终值。可以通过调用window.getComputedStyle来获取使用值。尺寸(例如宽度,行高)都是以像素为单位...等等

似乎没有办法访问给定元素的“指定”CSS值,除非您确切地知道应用哪个CSS规则并使用document.stylesheets或类似接口解析出该规则。


我不明白...为什么在其他浏览器上可以得到百分比值呢?而且(正如@EmreErkan所报告的那样)为什么在Windows上的Firefox 7中也可以得到百分比值呢? - stecb
这可能是因为规范(http://www.w3.org/TR/DOM-Level-2-Style/css)没有预见到获取指定值的任何方法。还可以参考类似的问题:http://stackoverflow.com/questions/1013478/mapping-computed-css-styles-to-specified-ones - georg
我在家用我的个人电脑(Windows 7,Firefox 7)尝试并获取了“px”值。 - Emre Erkan

3
正确答案是我在bugzilla上提交的错误报告的评论。

https://bugzilla.mozilla.org/show_bug.cgi?id=707691#c7

为了在 Firefox 中正确获取百分比值,元素(或其父元素之一)的 display 属性应设置为 none。
测试:http://jsfiddle.net/4RKsM/ 不清楚的是:为什么在相同的浏览器/版本上(例如,在 XP/win7 上的 Firefox 7 或 Mac OSX / Ubuntu 上的 Opera 11.5),但在不同的操作系统上,行为不同?
顺便说一句,@thg435 发布的规范(并在 MDN 上报告)仍在变化中。

1

据我所知,它从未显示过百分比(我使用ff、opera和chrome)。因此,我认为这不仅是Firefox的问题。

然而,您可以手动计算,但如果浏览器窗口很小,它只能接近定义的值。

parseInt($('#box').css('left'))/ $(window).width()*100;

我使用ff/chrome/opera浏览器,我得到了%的值... 我不想进行计算,我只想知道是否可以获取CSS属性(以%表示)的值 :) - stecb
好的,我已经在我的设备上尝试过了,在Opera中也得到了像素大小。 - tildy
这太糟糕了 :) .. 我的意思是,同一版本但不同的操作系统,它有完全不同的行为.. 奇怪.. 顺便说一下 :) - stecb
请问,您能解释一下这个计算吗?为什么是 css(left) / window.width * 100?这个计算公式从哪里来的? - gedamial

0

在 Chrome 上,它取决于定位值。固定和绝对定位始终给出像素值,而其他值则输出输入的内容。例如,如果您给了它 10% 的值,则会输出 10%,如果您输入了 100px,则会输出 100px。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接