Jak uzyskać tylko numeryczną część właściwości CSS za pomocą jQuery?

158

Muszę wykonać obliczenia numeryczne na podstawie właściwości CSS. Jednak kiedy używam tego, aby uzyskać informacje:

$(this).css('marginBottom')

zwraca wartość „10px”. Czy jest jakiś trik tylko coraz udział liczby wartości bez względu na to czy jest to pxlub %lub emlub cokolwiek?

Tim Sheiner
źródło

Odpowiedzi:

163

Spowoduje to wyczyszczenie wszystkich znaków niebędących cyframi, kropkami i znakami nie-minus z ciągu:

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

ZAKTUALIZOWANO dla wartości ujemnych

zakovyrya
źródło
4
Jest to świetne, pod warunkiem, że nie masz do czynienia z liczbami ujemnymi. Nie jestem guru regex, więc nie mogę podać lepszej próbki :)
gary
39
Rozważ użycie parseFloat, który obsługuje wszystkie znaki dozwolone w liczbach zmiennoprzecinkowych, a także zwraca liczbę zamiast ciągu - zobacz odpowiedź maximelebreton .
Oliver
6
Nie powinna to być akceptowana odpowiedź, ponieważ nie odpowiada poprawnie na pytanie. Rozwiązania parseFloat / parseInt są lepsze. Pytanie dotyczy obliczeń numerycznych . Ta odpowiedź zwraca ciąg. Oznacza to, że „20” + 20 = „2020”, co nie jest dobre dla wszystkich zaangażowanych.
mastaBlasta,
@zakovyrya, czy mógłbyś wyjaśnić użyte RegExp/[^-\d\.]/g
Alexander
1
@Alexander Nawiasy kwadratowe z daszkiem oznaczają NIE: [^ <cokolwiek tu wstawisz>]. W tym wyrażeniu regularnym pasuje do dowolnego symbolu, który NIE jest znakiem minus, cyfrą ani kropką. Zasadniczo usuwa wszystko, co nie może być częścią numeru
zakovyrya
284
parseInt($(this).css('marginBottom'), 10);

parseInt automatycznie zignoruje jednostki.

Na przykład:

var marginBottom = "10px";
marginBottom = parseInt(marginBottom, 10);
alert(marginBottom); // alerts: 10
Pion
źródło
1
Wydaje się, że działa to bardzo dobrze we wszystkich przypadkach, na które się natknąłem, i uważam, że jest o wiele bardziej czytelne niż jakiekolwiek rozwiązania regexp.
Markus Amalthea Magnuson
3
możesz chcieć dodać radix (10) do parseInt, jeśli używasz tego rozwiązania.
asawilliams
47
Możesz chcieć użyć parseFloat zamiast parseIntuwzględniać przypadek, w którym otrzymujesz wartość inną niż całkowita - jak w odpowiedzi maximelebreton .
Oliver
3
Właściwie parseInt nie potrzebuje parametru radix ", 10", ponieważ 10 jest domyślnym. Mniej parametrów = lepsza czytelność, krótszy kod, mniej błędów.
Pointer Null
2
10 jest wartością domyślną dla parseInt tylko wtedy, gdy liczba nie może być zinterpretowana jako ósemkowa (np. '0700' przeanalizowałoby jako 448 zamiast 700, co jest prawdopodobnie pożądane).
Robert C. Barth
122

W przypadku metody replace Twoja wartość css jest łańcuchem, a nie liczbą.

Ta metoda jest bardziej przejrzysta, prosta i zwraca liczbę:

parseFloat($(this).css('marginBottom'));
maximelebreton
źródło
2
To najlepsze rozwiązanie, ponieważ OP prosi o możliwe jednostki nie będące liczbami całkowitymi ( %, em)
Andre Figueiredo
14
parseFloat($(this).css('marginBottom'))

Nawet jeśli marginBottom zdefiniowano w em, wartość wewnątrz parseFloat powyżej będzie w px, ponieważ jest to obliczona właściwość CSS.

Alex Pavlov
źródło
3
parseFloat ma tylko jeden argument - podana tutaj radix (10) zostanie zignorowana. Więc bardziej poprawną odpowiedzią będzie Maxelebreton .
Oliver
Czy musi być parseFloat ($ (this) .css ('marginBottom'), 10)
user1736947
9
$(this).css('marginBottom').replace('px','')
Diodeus - James MacFarlane
źródło
2
To obsługuje tylko przypadek „px”. Myślę więc, że dla każdego z pozostałych „przyrostków” należy wykonać osobne zastąpienie.
Grzegorz Oledzki
3
Uważaj - pozostałe przyrostki nie są w pikselach, więc jeśli spodziewasz się, pxale otrzymasz em, musisz przekonwertować.
Ariel
właśnie o tym myślałem - czy są do tego jakieś procedury biblioteczne? Wydaje mi się, że to całkiem rozsądny warunek, aby oczekiwać px, ale ze względu na solidność, jakie mamy opcje ...? (Tylko rozmyślam, tutaj - nie będę się tym zbytnio przejmować, ponieważ kontroluję wartości)
lol
5

Używam prostej wtyczki jQuery, aby zwrócić wartość liczbową dowolnej pojedynczej właściwości CSS.

Dotyczy parseFloatwartości zwracanej przez domyślną cssmetodę jQuery .

Definicja wtyczki:

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

Stosowanie:

var element = $('.selector-class');
var numericWidth = element.cssNum('width') * 10 + 'px';
element.css('width', numericWidth);
Quickredfox
źródło
5

Załóżmy, że masz właściwość najniższego marginesu ustawioną na 20px / 20% / 20em. Aby uzyskać wartość jako liczbę, istnieją dwie opcje:

Opcja 1:

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

Funkcja parseInt () analizuje ciąg znaków i zwraca liczbę całkowitą. Nie zmieniaj liczby 10 znalezionej w powyższej funkcji (znanej jako „podstawa”), chyba że wiesz, co robisz.

Przykładowe dane wyjściowe wyniesie: 20 (jeśli dolny margines jest ustawiony w pikselach) dla% i em, wyświetli liczbę względną w oparciu o bieżący rozmiar elementu nadrzędnego / czcionki.

Opcja 2 (osobiście wolę tę opcję)

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

Przykładowe dane wyjściowe wyniesie: 20 (jeśli dolny margines jest ustawiony w pikselach) dla% i em, wyświetli liczbę względną w oparciu o bieżący rozmiar elementu nadrzędnego / czcionki.

Funkcja parseFloat () analizuje łańcuch i zwraca liczbę zmiennoprzecinkową.

Funkcja parseFloat () określa, czy pierwszy znak w określonym ciągu jest liczbą. Jeśli tak, analizuje ciąg, aż osiągnie koniec liczby i zwraca liczbę jako liczbę, a nie jako ciąg.

Zaletą Opcji 2 jest to, że jeśli zwrócone zostaną liczby dziesiętne (np. 20,32322px), otrzymasz liczbę zwróconą z wartościami po przecinku. Przydatne, jeśli potrzebujesz konkretnych liczb, na przykład jeśli dolny margines jest ustawiony w em lub %

Arman Nisch
źródło
4

parseintobetnie wszelkie wartości dziesiętne (np. 1.5emdaje 1).

Wypróbuj replacefunkcję z wyrażeniem regularnym, np

$this.css('marginBottom').replace(/([\d.]+)(px|pt|em|%)/,'$1');
miednice
źródło
4

Idę na:

Math.abs(parseFloat($(this).css("property")));
mojo
źródło
Nie jest to ogólne rozwiązanie. Myślę, że w większości przypadków będę chciał wiedzieć, że a marginjest negatywne lub pozytywne!
Andre Figueiredo,
3

Najprostszym sposobem uzyskania szerokości elementu bez jednostek jest:

target.width()

Źródło: https://api.jquery.com/width/#width2

Paul Leclercq
źródło
Doskonały do ​​szerokości i wysokości. $ (selector) .width () i $ (selector) .height () są rzeczywiście liczbami. Nieprzydatne w przypadku innych właściwości CSS: margines, wypełnienie.
eon
3

Możesz zaimplementować ten bardzo prosty jQuery wtyczkę :

Definicja wtyczki:

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

Jest odporny na NaNwartości, które mogą wystąpić w starej wersji IE ( 0zamiast tego zwróci )

Stosowanie:

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

Cieszyć się! :)

CodeGems
źródło
1
To dobry pomysł, ale pamiętaj, aby uważać na skutki uboczne, takie jak wywołanie funkcji o nieznanym koszcie bardziej niż to konieczne. var result; return isNaN(result = parseFloat(this.css(p))) ? 0 : result;
Nicole,
2

Aby poprawić zaakceptowaną odpowiedź, użyj tego:

Number($(this).css('marginBottom').replace(/[^-\d\.]/g, ''));
ATR
źródło
2

Jeśli chodzi tylko o „px”, możesz też użyć:

$(this).css('marginBottom').slice(0, -2);
Carli Beeli
źródło
0

Powinien usuwać jednostki, zachowując ułamki dziesiętne.

var regExp = new RegExp("[a-z][A-Z]","g");
parseFloat($(this).css("property").replace(regExp, ""));
Tyler
źródło
-1

posługiwać się

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

które zwracają tablicę. pierwszy indeks zwraca wartość dolnej krawędzi marginesu (przykład 20 dla 20 pikseli), a drugi indeks zwraca jednostkę dołu marginesu (przykład px dla 20 pikseli)

morpheis camus
źródło
1
cssUnit jest w rzeczywistości częścią jQueryUI, a nie jQuery.
cvkline