在jQuery中获取CSS规则的百分比值


98

假设规则如下:

.largeField {
    width: 65%;
}

有没有办法以某种方式获得“ 65%”的回报,而不是像素值?

谢谢。

编辑:不幸的是,在我的情况下,使用DOM方法是不可靠的,因为我有一个导入其他样式表的样式表,因此cssRules参数最终以null未定义的值结尾。

但是,这种方法在大多数直接情况下都可以使用(一个样式表,文档的head标记内的多个单独的样式表声明)。


1
最好将这些数据植入元素本身,然后跟踪其将来的变化。
特拉维斯·J

Answers:


51

恐怕没有内置的方法。您可以执行以下操作:

var width = ( 100 * parseFloat($('.largeField').css('width')) / parseFloat($('.largeField').parent().css('width')) ) + '%';

19
只是要清楚一点,这并不能告诉您样式中的值,而是为您提供计算值
Anthony Johnston

2
@shevski工作正常,您必须添加class="largeField"到跨度,当前您正在选择一个空集。
亚当·拉瑟克

我知道其中什么不起作用,这就是为什么这是一个反例。
shevski 2012年

2
正如安东尼一年前指出的那样,@shevski我的示例给出了页面上现有元素的计算值。您的评论是多余的。
亚当·拉瑟克

@AdamLassek,安东尼没有说它最存在。
shevski 2012年

116

最简单的方法

$('.largeField')[0].style.width

// >>> "65%"

50
请注意:仅适用于直接应用于元素的CSS(例如style="width:65%")。
brianreavis 2012年

3
大!!只返回数字:parseInt($('。largeField')[0] .style.width,10);
Tiago

4
Tiago,您可以只使用parseFloat()。
加文2013年

如@brianreavis所说,这仅适用于内联样式。
阿肯什(Akansh)'17年

84

这绝对是可能的!

您必须首先hide()父元素。这将阻止JavaScript计算子元素的像素。

$('.parent').hide();
var width = $('.child').width();
$('.parent').show();
alert(width);

看我的例子

现在...我想知道我是否是第一个发现这种黑客:)

更新:

一线

element.clone().appendTo('body').wrap('<div style="display: none"></div>').css('width');

它将在</body>标签之前留在隐藏元素之后,您可能希望这样做.remove()

请参阅单线示例

我愿意接受更好的主意!


1
这应该是公认的解决方案。在其他答案未获得最初分配的百分比值的情况下,我也可以确认它对我有用。
EricP

1
为避免闪烁,请克隆子项,隐藏父项,然后获取宽度。var clone = $('。child')。clone();
user1491819 2014年

3
更新:函数getCssWidth(childSelector){return jQuery(childSelector).parent()。clone()。hide()。find(childSelector).width(); } console.log('child width:'+ getCssWidth('。child'));;
user1491819 2014年

1
很棒的解决方案!这是脚本jsfiddle.net/Sjeiti/2qkftdjd
2015年

1
如果$(...)[0] .style.width答案有效,那这不是公认的解决方案吗?该解决方案虽然优雅,但确实存在一些性能缺陷。
Mihai Danila

44

您可以访问该document.styleSheets对象:

<style type="text/css">
    .largeField {
        width: 65%;
    }
</style>
<script type="text/javascript">
    var rules = document.styleSheets[0].rules || document.styleSheets[0].cssRules;
    for (var i=0; i < rules.length; i++) {
        var rule = rules[i];
        if (rule.selectorText.toLowerCase() == ".largefield") {
            alert(rule.style.getPropertyValue("width"));
        }
    }
</script>

8
+1正确使用DOM方法(有时jQuery不能解决问题)
bobince

1
+1我与您在一起是为了确保准确性。我很好奇每个浏览器如何支持此功能,但这是正确的答案。
cgp

在FF和IE7的简单情况下都能很好地工作,但不适用于我(请参见上面的EDIT)。
蒙特利尔,

1
您是否也尝试过所有样式表?我的示例仅使用第一个(styleSheets[0])。
Gumbo

抱歉,如果这是一个菜鸟问题,那怎么for (var i=0; rules.length; i++)办?不应该for (var i=0; i<rules.length; i++)

18

较晚,但对于较新的用户,如果css样式包含百分比,请尝试以下操作:

$element.prop('style')['width'];

像CSS字体大小的魅力一样工作。$ element.prop('style')['font-size];
杰森

10

一个基于Adams的jQuery插件:

(function ($) {

    $.fn.getWidthInPercent = function () {
        var width = parseFloat($(this).css('width'))/parseFloat($(this).parent().css('width'));
        return Math.round(100*width)+'%';
    };

})(jQuery);

$('body').html($('.largeField').getWidthInPercent());​​​​​

将返回“ 65%”。如果您喜欢if(width =='65%'),则仅返回四舍五入的数字才能更好地工作。如果您直接使用Adams的答案,那将是行不通的(我得到类似64.93288590604027的信息)。:)


3

基于timofey出色且令人惊讶的解决方案,这是一个纯Javascript实现:

function cssDimensions(element)
  var cn = element.cloneNode();
  var div = document.createElement('div');
  div.appendChild(cn);
  div.style.display = 'none';
  document.body.appendChild(div);
  var cs = window.getComputedStyle
    ? getComputedStyle(cn, null)
    : cn.currentStyle;
  var ret = { width: cs.width, height: cs.height };
  document.body.removeChild(div);
  return ret;
}

希望它对某人有帮助。


语法错误,您{在第一行末尾忘记了。
阿肯什(Akansh)'17年

只有当未设置div的宽度时,此解决方案才能正确显示“自动”,jQuery css('width')返回“ 0px”。所有其他答案都不正确...
Alexey Obukhov '18 -10-17


0

您可以将您需要使用jQuery访问的样式放在以下任意一种中:

  1. 文件头直接
  2. 在一个include中,然后将哪个服务器端脚本放在首位

然后应该有可能(尽管不一定很容易)编写一个js函数来解析文档头中样式标签中的所有内容并返回所需的值。



0

jQuery中没有任何内容,即使在javascript中也没有任何直接的内容。以timofey的答案并运行它,我创建了此函数,该函数可用于获取您想要的任何属性:

// gets the style property as rendered via any means (style sheets, inline, etc) but does *not* compute values
// domNode - the node to get properties for 
// properties - Can be a single property to fetch or an array of properties to fetch
function getFinalStyle(domNode, properties) {
    if(!(properties instanceof Array)) properties = [properties]

    var parent = domNode.parentNode
    if(parent) {
        var originalDisplay = parent.style.display
        parent.style.display = 'none'
    }
    var computedStyles = getComputedStyle(domNode)

    var result = {}
    properties.forEach(function(prop) {
        result[prop] = computedStyles[prop]
    })

    if(parent) {
        parent.style.display = originalDisplay
    }

    return result
}

0

使用交叉乘法将像素转换为百分比

公式设置:

1.)(element_width_pixels / parent_width_pixels)=(element_width_percentage / 100)

2.)element_width_percentage =(100 * element_width_pixels)/ parent_width_pixels

实际代码:

<script>

   var $width_percentage = (100 * $("#child").width()) / $("#parent").width();

</script>
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.