如何使用jQuery获取CSS属性的数字部分?


158

我需要根据CSS属性进行数值计算。但是,当我使用它来获取信息时:

$(this).css('marginBottom')

它返回值“ 10px”。有没有窍门刚开值的数字部分无论是px%em或什么?

Answers:


163

这将清除字符串中的所有非数字,非点和非减号:

$(this).css('marginBottom').replace(/[^-\d\.]/g, '');

更新为负值


4
如果您不处理负数,这很好。我不是regex专家,所以无法提供更好的示例:)
gary

39
考虑使用parseFloat来处理浮点数中允许的所有字符,并且还返回数字而不是字符串-请参见maximelebreton的答案
奥利弗(Oliver)

6
这不应被接受,因为它不能正确回答问题。parseFloat / parseInt解决方案更好。关于数值计算问题。该答案返回一个字符串。这意味着“ 20” + 20 =“ 2020”,这对任何参与的人都是不利的。
mastaBlasta

@zakovyrya您能解释一下使用过的RegExp- /[^-\d\.]/g
亚历山大

1
@亚历山大带有尖号的方括号表示NOT:[^ <无论您在此处放置什么>]。在此正则表达式中,它匹配不是减号,数字或点的任何符号。本质上删除了所有不能包含在数字中的内容
zakovyrya

284
parseInt($(this).css('marginBottom'), 10);

parseInt 将自动忽略单位。

例如:

var marginBottom = "10px";
marginBottom = parseInt(marginBottom, 10);
alert(marginBottom); // alerts: 10

1
在我偶然发现的所有情况下,这似乎都很好用,并且我发现它比任何正则表达式解决方案都更具可读性。
Markus Amalthea Magnuson

3
如果使用此解决方案,则可能需要将基数(10)添加到parseInt。
asawilliams 2011年

47
您可能要使用parseFloat而不是parseInt考虑收到非整数值的情况-如maximelebreton的答案
奥利弗(Oliver)

3
实际上,因为默认值为10,所以parseInt不需要“,10”基数参数。更少的参数=更好的可读性,更短的代码,更少的错误。
指针为空

2
如果不能将数字解释为八进制,则10仅是parseInt的默认值(例如,“ 0700”将解析为448而不是700,这可能是需要的)。
罗伯特·C·巴斯

122

使用replace方法时,css值是一个字符串,而不是数字。

此方法更干净,更简单,并返回一个数字:

parseFloat($(this).css('marginBottom'));

2
这是最好的解决方案,因为OP要求使用可能的非整数单位(%em
Andre Figueiredo 2013年


9
$(this).css('marginBottom').replace('px','')

2
那只会处理“ px”的情况。因此,我想应该对其余的每个“后缀”进行单独的替换。
2009年

3
请谨慎考虑-其他后缀不是以像素为单位,因此,如果您希望px得到后缀,则em需要进行转换。
Ariel

那就是我在想的-是否有任何库例程可用于此?就像我认为期望px是一个相当合理的条件,但是出于鲁棒性的目的,我们有什么选择...?(只是在沉思,在这里-因为我控制了值,所以我不会太在意它)
哈哈

5

我使用一个简单的jQuery插件返回任何单个CSS属性的数值。

它适用parseFloat于jQuery默认值返回的值css方法。

插件定义:

$.fn.cssNum = function(){
  return parseFloat($.fn.css.apply(this,arguments));
}

用法:

var element = $('.selector-class');
var numericWidth = element.cssNum('width') * 10 + 'px';
element.css('width', numericWidth);

5

让我们假设您将margin-bottom属性设置为20px / 20%/ 20em。要获得数字值,有两种选择:

选项1:

parseInt($('#some_DOM_element_ID').css('margin-bottom'), 10);

parseInt()函数解析一个字符串并返回一个整数。除非您知道自己在做什么,否则不要更改在上述函数中找到的10(称为“基数”)。

示例输出将是:%(如果在px中设置了margin-bottom的底部),则输出20,并且em将根据当前的父元素/字体大小输出相对数字。

选项2 (我个人更喜欢此选项)

parseFloat($('#some_DOM_element_ID').css('margin-bottom'));

示例输出将是:%(如果在px中设置了margin-bottom的底部),则输出20,并且em将根据当前的父元素/字体大小输出相对数字。

parseFloat()函数解析字符串并返回浮点数。

parseFloat()函数确定指定字符串中的第一个字符是否为数字。如果是,它将解析字符串直到到达数字的末尾,然后将数字作为数字而不是字符串返回。

选项2的优点是,如果您获得返回的十进制数字(例如20.32322px),则将获得带有小数点后的值的返回数字。如果您需要返回特定的数字,例如,如果您的下边距设置为em%,则很有用


4

parseint将截断任何十进制值(例如1.5em1)。

尝试replace使用正则表达式的功能,例如

$this.css('marginBottom').replace(/([\d.]+)(px|pt|em|%)/,'$1');

4

请输入:

Math.abs(parseFloat($(this).css("property")));

不是通用的解决方案。我认为,在大多数情况下,我想知道a margin是负数还是正数!
Andre Figueiredo 2013年


3

您可以实现这个非常简单的jQuery插件:

插件定义:

(function($) {
   $.fn.cssValue = function(p) {
      var result;
      return isNaN(result = parseFloat(this.css(p))) ? 0 : result;
   };
})(jQuery);

它可以抵抗NaN旧版IE中可能出现的值(将返回0

用法:

$(this).cssValue('marginBottom');

请享用!:)


1
这是一个好主意,但请记住要小心一些副作用,例如调用未知成本的函数比必要的多。 var result; return isNaN(result = parseFloat(this.css(p))) ? 0 : result;
妮可2015年

2

为了改善可接受的答案,请使用以下命令:

Number($(this).css('marginBottom').replace(/[^-\d\.]/g, ''));


0

应该在保留小数的同时删除单位。

var regExp = new RegExp("[a-z][A-Z]","g");
parseFloat($(this).css("property").replace(regExp, ""));

-1

$(this).cssUnit('marginBottom');

返回一个数组。第一个索引返回边距底部的值(例如20表示20像素),第二个索引返回边距底部的单位(例如px表示20px)


1
cssUnit实际上是jQueryUI的一部分,而不是jQuery。
cvkline 2015年
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.