¿Cómo obtener solo una parte numérica de la propiedad CSS con jQuery?

158

Necesito hacer un cálculo numérico basado en las propiedades CSS. Sin embargo, cuando uso esto para obtener información:

$(this).css('marginBottom')

devuelve el valor '10px'. ¿Hay un truco para conseguir justo el número de parte del valor, no importa si es pxo %o emo lo que sea?

Tim Sheiner
fuente

Respuestas:

163

Esto limpiará todos los dígitos, no puntos y no menos signos de la cadena:

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

ACTUALIZADO para valores negativos

zakovyrya
fuente
44
Esto es excelente siempre que no se trate de números negativos. No soy un gurú de expresiones regulares, así que no puedo proporcionar una mejor muestra :)
Gary
39
Considere usar parseFloat que maneja todos los caracteres permitidos en números de coma flotante y también devuelve un número en lugar de una cadena; consulte la respuesta de maximelebreton .
Oliver
66
Esta no debería ser la respuesta aceptada porque no responde la pregunta correctamente. Las soluciones parseFloat / parseInt son mejores. La pregunta se refiere a los cálculos numéricos . Esta respuesta devuelve una cadena. Eso significa que "20" + 20 = "2020", que no es bueno para las personas involucradas.
mastaBlasta
@zakovyrya, ¿podría explicar el RegExp usado/[^-\d\.]/g
Alexander
1
@Alexander Los corchetes con cursor significan NO: [^ <lo que sea que pongas aquí>]. En esta expresión regular coincide con cualquier símbolo que NO sea signo menos, dígito o punto. Esencialmente elimina todo lo que no puede ser parte del número
zakovyrya
284
parseInt($(this).css('marginBottom'), 10);

parseInt ignorará automáticamente las unidades.

Por ejemplo:

var marginBottom = "10px";
marginBottom = parseInt(marginBottom, 10);
alert(marginBottom); // alerts: 10
Beto
fuente
1
Esto parece funcionar muy bien en todos los casos con los que me he topado, y me parece mucho más legible que cualquier solución regexp.
Markus Amalthea Magnuson
3
es posible que desee agregar la raíz (10) a parseInt si está utilizando esta solución.
asawilliams
47
Es posible que desee usar parseFloat en lugar de parseInttener en cuenta el caso en el que recibe un valor no entero, como en la respuesta de maximelebreton .
Oliver
3
En realidad, parseInt no necesita el parámetro radix ", 10", ya que 10 es el valor predeterminado. Menos parámetros = mejor legibilidad, código más corto, menos errores.
Puntero nulo el
2
10 es solo el valor predeterminado para parseInt si el número no puede interpretarse como un octal (por ejemplo, '0700' se analizaría como 448 en lugar de 700, que es probablemente lo que se desea).
Robert C. Barth
122

Con el método replace, su valor css es una cadena y no un número.

Este método es más limpio, simple y devuelve un número:

parseFloat($(this).css('marginBottom'));
maximelebreton
fuente
2
Esta es la mejor solución, ya que OP está pidiendo posibles unidades no enteras ( %, em)
Andre Figueiredo
14
parseFloat($(this).css('marginBottom'))

Incluso si marginBottom se define en em, el valor dentro de parseFloat arriba estará en px, ya que es una propiedad CSS calculada.

Alex Pavlov
fuente
3
parseFloat solo tiene un argumento: se ignorará la raíz (10) que proporcionó aquí. Entonces la respuesta más correcta sería la de maximelebreton .
Oliver
¿Tiene que ser parseFloat ($ (this) .css ('marginBottom'), 10)
user1736947
9
$(this).css('marginBottom').replace('px','')
Diodeus - James MacFarlane
fuente
2
Eso solo manejaría el caso 'px'. Así que supongo que se debe hacer un reemplazo por separado para cada uno de los 'sufijos' restantes.
Grzegorz Oledzki
3
Tenga cuidado: los otros sufijos no están en píxeles, por lo que si espera pxpero se le da em, debe convertir.
Ariel
eso es lo que estaba pensando: ¿hay alguna rutina de biblioteca para esto? Como creo que es una condición bastante razonable esperar px, pero a efectos de robustez, ¿cuáles son nuestras opciones ...? (Solo reflexionando, aquí, no voy a molestarme demasiado con eso ya que controlo los valores)
jajaja
5

Utilizo un complemento jQuery simple para devolver el valor numérico de cualquier propiedad CSS individual.

Se aplica parseFloatal valor devuelto por el cssmétodo predeterminado de jQuery .

Definición de complemento:

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

Uso:

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

Supongamos que tiene una propiedad de margen inferior establecida en 20px / 20% / 20em. Para obtener el valor como un número, hay dos opciones:

Opción 1:

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

La función parseInt () analiza una cadena y devuelve un entero. No cambie los 10 que se encuentran en la función anterior (conocida como "radix") a menos que sepa lo que está haciendo.

El resultado de ejemplo será: 20 (si el margen inferior se establece en px) para% y em dará el número relativo en función del tamaño del elemento principal / fuente actual.

Opción 2 (personalmente prefiero esta opción)

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

El resultado de ejemplo será: 20 (si el margen inferior se establece en px) para% y em dará el número relativo en función del tamaño del elemento principal / fuente actual.

La función parseFloat () analiza una cadena y devuelve un número de coma flotante.

La función parseFloat () determina si el primer carácter de la cadena especificada es un número. Si es así, analiza la cadena hasta que alcanza el final del número y devuelve el número como un número, no como una cadena.

La ventaja de la opción 2 es que si obtiene números decimales devueltos (por ejemplo, 20.32322px) obtendrá el número devuelto con los valores detrás del punto decimal. Útil si necesita que se devuelvan números específicos, por ejemplo, si su margen inferior está configurado en em o %

Arman Nisch
fuente
4

parseinttruncará cualquier valor decimal (por ejemplo, 1.5emda 1).

Pruebe una replacefunción con regex, p. Ej.

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

Id por:

Math.abs(parseFloat($(this).css("property")));
mojo
fuente
No es una solución genérica. ¡En la mayoría de los casos, creo que querré saber que a margines negativo o positivo!
Andre Figueiredo
3

La forma más simple de obtener el ancho del elemento sin unidades es:

target.width()

Fuente: https://api.jquery.com/width/#width2

Paul Leclercq
fuente
Ideal para ancho y alto. $ (selector) .width () y $ (selector) .height () son de hecho números. No es útil para otros accesorios css: margen, relleno.
Eon
3

Puede implementar este complemento jQuery muy simple :

Definición de complemento:

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

Es resistente a los NaNvalores que pueden ocurrir en la versión anterior de IE (en su 0lugar, volverá )

Uso:

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

¡Disfrutar! :)

CodeGems
fuente
1
Esta es una buena idea, pero recuerde estar atento a los efectos secundarios, como llamar a una función de costo desconocido más de lo necesario. var result; return isNaN(result = parseFloat(this.css(p))) ? 0 : result;
Nicole
2

Para mejorar la respuesta aceptada, use esto:

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

Si es solo para "px", también puedes usar:

$(this).css('marginBottom').slice(0, -2);
Carli Beeli
fuente
0

Deben eliminar unidades mientras se conservan los decimales.

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

utilizar

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

que devuelven una matriz. el primer índice devuelve el valor del margen inferior (ejemplo 20 para 20px) y el segundo índice devuelve la unidad del margen inferior (ejemplo px para 20px)

morpheis camus
fuente
1
cssUnit es en realidad una parte de jQueryUI, no jQuery.
cvkline