Come ottenere solo una parte numerica della proprietà CSS con jQuery?


158

Devo fare un calcolo numerico basato sulle proprietà CSS. Tuttavia, quando lo utilizzo per ottenere informazioni:

$(this).css('marginBottom')

restituisce il valore '10px'. C'è un trucco per ottenere solo la parte numerica del valore, indipendentemente dal fatto che sia pxo %o emo qualunque cosa?

Risposte:


163

Questo pulirà tutte le non cifre, non punti e segni non negativi dalla stringa:

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

AGGIORNATO per valori negativi


4
Questo è fantastico se non hai a che fare con numeri negativi. Non sono un guru dei regex, quindi non posso fornire un campione migliore :)
gary

39
Prendi in considerazione l'uso di parseFloat che gestisce tutti i caratteri consentiti nei numeri in virgola mobile e restituisce anche un numero anziché una stringa - vedi la risposta di maximelebreton .
Oliver,

6
Questa non dovrebbe essere la risposta accettata perché non risponde correttamente alla domanda. Le soluzioni parseFloat / parseInt sono migliori. La domanda si pone per quanto riguarda i calcoli numerici . Questa risposta restituisce una stringa. Ciò significa che "20" + 20 = "2020" non è un bene per nessuno.
mastaBlasta,

@zakovyrya potresti spiegare il RegExp usato/[^-\d\.]/g
Alexander

1
@Alexander Square tra parentesi quadre significa NOT: [^ <qualunque cosa tu metta qui>]. In questa regex corrisponde a qualsiasi simbolo che NON sia segno meno, cifra o punto. Elimina essenzialmente tutto ciò che non può far parte del numero
zakovyrya,

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

parseInt ignorerà automaticamente le unità.

Per esempio:

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

1
Questo sembra funzionare molto bene in tutti i casi in cui mi sono imbattuto, e lo trovo molto più leggibile rispetto a qualsiasi soluzione regexp.
Markus Amalthea Magnuson,

3
potresti voler aggiungere radix (10) a parseInt se stai usando questa soluzione.
asawilliams,

47
Potresti voler usare parseFloat invece di parseInttenere conto del caso in cui ricevi un valore non intero, come nella risposta di maximelebreton .
Oliver,

3
In realtà, parseInt non ha bisogno del parametro radix ", 10", poiché 10 è predefinito. Meno parametri = migliore leggibilità, codice più breve, meno bug.
Puntatore Null

2
10 è solo il valore predefinito per parseInt se il numero non può essere interpretato come un ottale (ad esempio '0700' analizzerebbe 448 anziché 700, che è probabilmente ciò che si desidera).
Robert C. Barth,

122

Con il metodo di sostituzione, il valore css è una stringa e non un numero.

Questo metodo è più pulito, semplice e restituisce un numero:

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

2
Questa è la soluzione migliore, poiché OP richiede possibili unità non intere ( %, em)
Andre Figueiredo,

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

Anche se marginBottom è definito in em, il valore all'interno di parseFloat sopra sarà in px, in quanto è una proprietà CSS calcolata.


3
parseFloat ha solo un argomento: il radix (10) che hai fornito qui verrà ignorato. Quindi la risposta più corretta sarebbe quella di maximelebreton .
Oliver,

Deve essere parseFloat ($ (this) .css ('marginBottom'), 10)
user1736947

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

2
Gestirebbe solo il caso "px". Quindi immagino che dovrebbe essere fatto un rimpiazzo separato per ciascuno dei restanti "suffissi".
Grzegorz Oledzki l'

3
Fai attenzione: gli altri suffissi non sono in pixel, quindi se ti aspetti pxma ti viene dato emdevi convertire.
Ariel,

questo è quello che stavo pensando - ci sono delle routine di libreria per questo? Come penso che sia una condizione abbastanza ragionevole aspettarsi px, ma ai fini della robustezza, quali sono le nostre opzioni ...? (Sto solo riflettendo, qui - non mi preoccuperò troppo da quando controllo i valori)
lol

5

Uso un semplice plugin jQuery per restituire il valore numerico di ogni singola proprietà CSS.

Si applica parseFloatal valore restituito dal valore predefinito di jQuerycss metodo .

Definizione del 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

Supponiamo che tu abbia una proprietà margin-bottom impostata su 20px / 20% / 20em. Per ottenere il valore come numero ci sono due opzioni:

Opzione 1:

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

La funzione parseInt () analizza una stringa e restituisce un numero intero. Non modificare i 10 trovati nella funzione sopra (nota come "radix") se non sai cosa stai facendo.

Esempio di output sarà: 20 (se il margine inferiore è impostato in px) per% ed em produrrà il numero relativo in base alla dimensione dell'elemento / carattere padre corrente.

Opzione 2 (preferisco personalmente questa opzione)

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

Esempio di output sarà: 20 (se il margine inferiore è impostato in px) per% ed em produrrà il numero relativo in base alla dimensione dell'elemento / carattere padre corrente.

La funzione parseFloat () analizza una stringa e restituisce un numero in virgola mobile.

La funzione parseFloat () determina se il primo carattere nella stringa specificata è un numero. In tal caso, analizza la stringa fino a raggiungere la fine del numero e restituisce il numero come numero, non come stringa.

Il vantaggio dell'opzione 2 è che se si ottengono i numeri decimali restituiti (ad es. 20.32322px) si otterrà il numero restituito con i valori dietro il punto decimale. Utile se è necessario restituire numeri specifici, ad esempio se il margine inferiore è impostato in em o %


4

parseinttroncerà tutti i valori decimali (ad es. 1.5emrestituisce 1).

Prova una replacefunzione con regex ad es

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

4

Id per:

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

Non è una soluzione generica. Nella maggior parte dei casi, penso, vorrò sapere che un marginè negativo o positivo!
Andre Figueiredo,

3

Il modo più semplice per ottenere la larghezza dell'elemento senza unità è:

target.width()

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


Ottimo per larghezza e altezza. $ (selettore) .width () e $ (selettore) .height () sono in effetti numeri. Non utile per altri oggetti di scena CSS: margine, imbottitura.
eone,

3

Puoi implementare questo jQuery molto semplice plugin :

Definizione del plugin:

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

È resistente ai NaNvalori che possono verificarsi nella vecchia versione di IE (tornerà 0invece)

Uso:

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

Godere! :)


1
Questa è una buona idea, ma ricorda di fare attenzione agli effetti collaterali come chiamare una funzione di costo sconosciuto più del necessario. var result; return isNaN(result = parseFloat(this.css(p))) ? 0 : result;
Nicole,

2

Per migliorare la risposta accettata usare questo:

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

2

Se è solo per "px" puoi anche usare:

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

0

Dovrebbe rimuovere le unità preservando i decimali.

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

-1

uso

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

che restituiscono un array. il primo indice restituisce il valore del margine inferiore (esempio 20 per 20 px ) e il secondo indice restituisce l'unità del margine inferiore (esempio px per 20 px )


1
cssUnit è in realtà una parte di jQueryUI, non jQuery.
cvkline
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.