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?

Tim Sheiner
fonte

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

zakovyrya
fonte
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
Prumo
fonte
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'));
maximelebreton
fonte
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.

Alex Pavlov
fonte
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','')
Diodeus - James MacFarlane
fonte
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);
Quickredfox
fonte
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 %

Arman Nisch
fonte
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');
peles
fonte
4

Id ir para:

Math.abs(parseFloat($(this).css("property")));
mojo
fonte
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

Paul Leclercq
fonte
Ó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! :)

CodeGems
fonte
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, ''));
ATR
fonte
2

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

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

Deve remover as unidades enquanto preserva os decimais.

var regExp = new RegExp("[a-z][A-Z]","g");
parseFloat($(this).css("property").replace(regExp, ""));
Tyler
fonte
-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 )

morpheis camus
fonte
1
cssUnit é realmente uma parte do jQueryUI, não jQuery.
Cvkline 7/03/15