Wie bekomme ich mit jQuery nur einen numerischen Teil der CSS-Eigenschaft?


157

Ich muss eine numerische Berechnung basierend auf CSS-Eigenschaften durchführen. Wenn ich dies jedoch verwende, um Informationen zu erhalten:

$(this).css('marginBottom')

es gibt den Wert '10px' zurück. Gibt es einen Trick, um nur den Zahlenteil des Wertes zu erhalten, egal ob es ist pxoder %oder emoder was auch immer?

Antworten:


163

Dadurch werden alle Nicht-Ziffern, Nicht-Punkte und Nicht-Minus-Zeichen aus der Zeichenfolge entfernt:

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

AKTUALISIERT für negative Werte


4
Dies ist großartig, vorausgesetzt, Sie haben es nicht mit negativen Zahlen zu tun. Ich bin kein Regex-Guru, kann also keine bessere Probe liefern :)
Gary

39
Erwägen Sie die Verwendung von parseFloat, das alle in Gleitkommazahlen zulässigen Zeichen verarbeitet und anstelle einer Zeichenfolge auch eine Zahl zurückgibt - siehe die Antwort von maximelebreton .
Oliver

6
Dies sollte nicht die akzeptierte Antwort sein, da die Frage nicht richtig beantwortet wird. Die parseFloat / parseInt-Lösungen sind besser. Die Frage bezieht sich auf numerische Berechnungen . Diese Antwort gibt eine Zeichenfolge zurück. Das bedeutet "20" + 20 = "2020", was für alle Beteiligten nicht gut ist.
MastaBlasta

@ Zakovyrya könnten Sie die verwendeten RegExp/[^-\d\.]/g
Alexander

1
@Alexander Eckige Klammern mit Caret bedeuten NICHT: [^ <was auch immer Sie hier setzen>]. In diesem regulären Ausdruck entspricht es jedem Symbol, das NICHT Minuszeichen, Ziffer oder Punkt ist.
Löscht im

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

parseInt ignoriert automatisch die Einheiten.

Beispielsweise:

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

1
Dies scheint in allen Fällen, auf die ich gestoßen bin, sehr gut zu funktionieren, und ich finde es viel lesbarer als alle regulären Ausdruckslösungen.
Markus Amalthea Magnuson

3
Wenn Sie diese Lösung verwenden, möchten Sie möglicherweise den Radix (10) zu parseInt hinzufügen.
Asawilliams

47
Möglicherweise möchten Sie parseFloat verwenden, anstatt parseIntden Fall zu berücksichtigen, in dem Sie einen nicht ganzzahligen Wert erhalten - wie in der Antwort von maximelebreton .
Oliver

3
Tatsächlich benötigt parseInt keinen Radix-Parameter ", 10", da 10 die Standardeinstellung ist. Weniger Parameter = bessere Lesbarkeit, kürzerer Code, weniger Fehler.
Zeiger Null

2
10 ist nur dann die Standardeinstellung für parseInt, wenn die Zahl nicht als Oktal interpretiert werden kann (z. B. würde '0700' als 448 anstatt als 700 analysiert, was wahrscheinlich erwünscht ist).
Robert C. Barth

122

Bei der Ersetzungsmethode ist Ihr CSS-Wert eine Zeichenfolge und keine Zahl.

Diese Methode ist sauberer, einfacher und gibt eine Zahl zurück:

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

2
Dies ist die beste Lösung, da OP nach möglichen nicht ganzzahligen Einheiten ( %, em) fragt
Andre Figueiredo

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

Selbst wenn marginBottom in em definiert ist, wird der Wert in parseFloat oben in px angegeben, da es sich um eine berechnete CSS-Eigenschaft handelt.


3
parseFloat hat nur ein Argument - der hier angegebene Radix (10) wird ignoriert. Die richtigere Antwort wäre also die von Maximelebreton .
Oliver

Muss es parseFloat ($ (this) .css ('marginBottom'), 10) sein
user1736947

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

2
Das würde nur den 'px'-Fall behandeln. Ich denke, für jedes der verbleibenden 'Suffixe' sollte ein separater Austausch durchgeführt werden.
Grzegorz Oledzki

3
Seien Sie vorsichtig - die anderen Suffixe sind nicht in Pixel angegeben. Wenn Sie also erwarten, pxaber angegeben werden em, müssen Sie konvertieren.
Ariel

das habe ich mir gedacht - gibt es dafür bibliotheksroutinen? Wie ich denke, ist es eine ziemlich vernünftige Bedingung, px zu erwarten, aber was sind aus Gründen der Robustheit unsere Optionen ...? (Nur nachdenken, hier - ich werde mich nicht zu sehr damit beschäftigen, da ich die Werte kontrolliere)
lol

5

Ich verwende ein einfaches jQuery-Plugin, um den numerischen Wert einer einzelnen CSS-Eigenschaft zurückzugeben.

Dies gilt parseFloatfür den Wert, der von der Standardmethode von jQuery zurückgegeben csswird.

Plugin Definition:

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

Verwendung:

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

5

Nehmen wir an, Sie haben eine Margin-Bottom-Eigenschaft, die auf 20px / 20% / 20em festgelegt ist. Um den Wert als Zahl zu erhalten, gibt es zwei Möglichkeiten:

Option 1:

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

Die Funktion parseInt () analysiert eine Zeichenfolge und gibt eine Ganzzahl zurück. Ändern Sie die 10 in der obigen Funktion (als "Radix" bezeichnet) nur, wenn Sie wissen, was Sie tun.

Beispiel Die Ausgabe lautet: 20 (wenn der untere Rand in px festgelegt ist) für% und em gibt die relative Anzahl basierend auf der aktuellen Größe des übergeordneten Elements / der übergeordneten Schriftart aus.

Option 2 (Ich persönlich bevorzuge diese Option)

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

Beispiel Die Ausgabe lautet: 20 (wenn der untere Rand in px festgelegt ist) für% und em gibt die relative Anzahl basierend auf der aktuellen Größe des übergeordneten Elements / der übergeordneten Schriftart aus.

Die Funktion parseFloat () analysiert eine Zeichenfolge und gibt eine Gleitkommazahl zurück.

Die Funktion parseFloat () bestimmt, ob das erste Zeichen in der angegebenen Zeichenfolge eine Zahl ist. Wenn dies der Fall ist, wird die Zeichenfolge analysiert, bis das Ende der Zahl erreicht ist, und die Zahl wird als Zahl und nicht als Zeichenfolge zurückgegeben.

Der Vorteil von Option 2 besteht darin, dass bei Rückgabe von Dezimalzahlen (z. B. 20.32322px) die Zahl mit den Werten hinter dem Dezimalpunkt zurückgegeben wird. Nützlich, wenn Sie bestimmte Zahlen zurückgeben müssen, z. B. wenn Ihr Rand unten in em oder % festgelegt ist


4

parseintschneidet alle Dezimalwerte ab (zB 1.5emgibt 1).

Versuchen Sie eine replaceFunktion mit Regex, z

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

4

Ich würde gehen für:

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

Keine generische Lösung. In den meisten Fällen, denke ich, möchte ich wissen, dass a marginnegativ oder positiv ist!
Andre Figueiredo

3

Der einfachste Weg, um die Elementbreite ohne Einheiten zu erhalten, ist:

target.width()

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


Ideal für Breite und Höhe. $ (Selektor) .width () und $ (Selektor) .height () sind in der Tat Zahlen. Nicht nützlich für andere CSS-Requisiten: Rand, Polsterung.
Äon

3

Sie können dieses sehr einfache jQuery- Plugin implementieren :

Plugin Definition:

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

Es ist resistent gegen NaNWerte, die in der alten IE-Version auftreten können (wird 0stattdessen zurückgegeben)

Verwendung:

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

Genießen! :) :)


1
Dies ist eine gute Idee, aber denken Sie daran, auf Nebenwirkungen wie das Aufrufen einer Funktion mit unbekannten Kosten mehr als nötig zu achten. var result; return isNaN(result = parseFloat(this.css(p))) ? 0 : result;
Nicole

2

Verwenden Sie Folgendes, um die akzeptierte Antwort zu verbessern:

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

2

Wenn es nur für "px" ist, können Sie auch verwenden:

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

0

Sollte Einheiten unter Beibehaltung der Dezimalstellen entfernen.

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

-1

verwenden

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

die ein Array zurückgeben. Der erste Index gibt den Wert des unteren Randes zurück (Beispiel 20 für 20 Pixel) und der zweite Index gibt die Einheit des unteren Randes zurück (Beispiel px für 20 Pixel).


1
cssUnit ist eigentlich ein Teil von jQueryUI, nicht von jQuery.
cvkline
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.