Como obter apenas parte numérica da propriedade CSS com jQuery?


157

Eu preciso fazer um cálculo numérico com base nas propriedades CSS. No entanto, quando eu uso isso para obter informações:

$(this).css('marginBottom')

retorna o valor '10px'. Existe um truque apenas para obter o número de peça do valor, não importa se é pxou %ou emou qualquer outra coisa?

Respostas:


163

Isso limpará todos os sem dígitos, sem pontos e sem sinal de menos da string:

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

ATUALIZADO para valores negativos


4
Isso é ótimo, desde que você não esteja lidando com números negativos. Eu não sou nenhum guru regex portanto, não pode fornecer uma amostra melhor :)
gary

39
Considere usar parseFloat, que lida com todos os caracteres permitidos em números de ponto flutuante e também retorna um número em vez de uma sequência - consulte a resposta de maximelebreton .
Oliver

6
Esta não deve ser a resposta aceita, pois não responde corretamente à pergunta. As soluções parseFloat / parseInt são melhores. A pergunta é feita em relação aos cálculos numéricos . Esta resposta retorna uma string. Isso significa que "20" + 20 = "2020", o que não é bom para ninguém envolvido.
mastaBlasta

@zakovyrya você poderia explicar o RegExp usado/[^-\d\.]/g
Alexander

1
Os colchetes @Alexander Square com sinal de intercalação significam NÃO: [^ <o que você colocar aqui>]. Nesse regex, ele corresponde a qualquer símbolo que NÃO seja sinal de menos, dígito ou ponto. Essencialmente exclui tudo o que não pode ser parte do número
zakovyrya

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

parseInt irá ignorar automaticamente as unidades.

Por exemplo:

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

1
Isso parece funcionar muito bem em todos os casos em que me deparei, e acho muito mais legível do que qualquer solução regexp.
Markus Amalthea Magnuson

3
convém adicionar o radix (10) ao parseInt se estiver usando esta solução.
precisa saber é o seguinte

47
Convém usar parseFloat em vez de parseIntconsiderar o caso em que você recebe um valor não inteiro - como na resposta de maximelebreton .
Oliver

3
Na verdade, parseInt não precisa do parâmetro radix ", 10", pois 10 é o padrão. Menos parâmetros = melhor legibilidade, código mais curto, menos bugs.
Ponteiro Nulo

2
10 é apenas o padrão para parseInt se o número não puder ser interpretado como um octal (por exemplo, '0700' analisaria como 448 em vez de 700, o que provavelmente é o desejado).
Robert C. Barth

122

Com o método de substituição, seu valor css é uma sequência e não um número.

Este método é mais limpo, simples e retorna um número:

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

2
Esta é a melhor solução, uma vez que OP está pedindo possíveis unidades não inteiros ( %, em)
Andre Figueiredo

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

Mesmo que marginBottom definido em em, o valor dentro de parseFloat acima será em px, pois é uma propriedade CSS calculada.


3
parseFloat possui apenas um argumento - a raiz (10) que você forneceu aqui será ignorada. Portanto, a resposta mais correta seria a de maximelebreton .
21712 Oliver

Ele precisa ser parseFloat ($ (this) .css ('marginBottom'), 10)
user1736947

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

2
Isso lidaria apenas com o caso 'px'. Então, acho que uma substituição separada deve ser feita para cada um dos 'sufixos' restantes.
Grzegorz Oledzki

3
Tenha cuidado - os outros sufixos não estão em pixels; portanto, se você espera, pxmas recebe, emprecisa converter.
Ariel

era isso que eu estava pensando - existem rotinas de biblioteca para isso? Como eu acho que é uma condição bastante razoável esperar px, mas para fins de robustez, quais são as nossas opções ...? (Just meditando, aqui - Eu não vou incomodar muito com isso desde que eu controlar os valores)
lol

5

Eu uso um plugin jQuery simples para retornar o valor numérico de qualquer propriedade CSS única.

Aplica-se parseFloatao valor retornado pelo cssmétodo padrão do jQuery .

Definição de Plugin:

$.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);

5

Vamos supor que você tenha uma propriedade na margem inferior definida como 20px / 20% / 20em. Para obter o valor como um número, existem duas opções:

Opção 1:

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

A função parseInt () analisa uma sequência e retorna um número inteiro. Não altere os 10 encontrados na função acima (conhecida como "raiz"), a menos que você saiba o que está fazendo.

A saída de exemplo será: 20 (se a margem inferior estiver definida em px) para% e em será exibida o número relativo com base no tamanho atual do elemento pai / fonte.

Opção 2 (eu pessoalmente prefiro esta opção)

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

A saída de exemplo será: 20 (se a margem inferior estiver definida em px) para% e em será exibida o número relativo com base no tamanho atual do elemento pai / fonte.

A função parseFloat () analisa uma sequência e retorna um número de ponto flutuante.

A função parseFloat () determina se o primeiro caractere na cadeia especificada é um número. Se for, analisa a sequência até chegar ao final do número e retorna o número como um número, não como uma sequência.

A vantagem da opção 2 é que, se você retornar números decimais (por exemplo, 20.32322px), receberá o número retornado com os valores atrás do ponto decimal. Útil se você precisar retornar números específicos, por exemplo, se sua margem inferior estiver definida em ou %


4

parseinttruncará quaisquer valores decimais (por exemplo, 1.5emfornece 1).

Tente uma replacefunção com regex, por exemplo

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

4

Id ir para:

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

Não é uma solução genérica. Na maioria dos casos, acho que vou querer saber que um marginé negativo ou positivo!
Andre Figueiredo

3

A maneira mais simples de obter a largura do elemento sem unidades é:

target.width()

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


Ótimo para largura e altura. $ (seletor) .width () e $ (seletor) .height () são realmente números. Não é útil para outros adereços css: margem, preenchimento.
eon 24/01

3

Você pode implementar este plugin jQuery muito simples :

Definição de Plugin:

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

É resistente a NaNvalores que podem ocorrer na versão antiga do IE (retornará 0)

Uso:

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

Aproveitar! :)


1
É uma boa ideia, mas lembre-se de observar os efeitos colaterais, como chamar uma função de custo desconhecido mais do que o necessário. var result; return isNaN(result = parseFloat(this.css(p))) ? 0 : result;
Nicole

2

Para melhorar a resposta aceita, use o seguinte:

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

2

Se for apenas para "px", você também pode usar:

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

0

Deve remover as unidades enquanto preserva os decimais.

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

-1

usar

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

que retornam uma matriz. o primeiro índice retorna o valor da margem inferior (exemplo 20 para 20 px ) e o segundo índice retorna a unidade da margem inferior (exemplo px para 20 px )


1
cssUnit é realmente uma parte do jQueryUI, não jQuery.
Cvkline 7/03/15
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.