JQuery ile CSS özelliğinin sadece sayısal bir parçası almak nasıl?


158

CSS özelliklerine dayalı sayısal bir hesaplama yapmak gerekiyor. Ancak, bilgi almak için bunu kullandığımda:

$(this).css('marginBottom')

'10px' değerini döndürür. Sadece değerin sayı kısmını almak için bir hile olduğunu fark etmeksizin var mı pxyoksa %ya emya da her neyse?

Yanıtlar:


163

Bu, dizeden tüm basamak olmayan, nokta olmayan ve eksi olmayan işaretleri temizler:

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

Negatif değerler için GÜNCELLENDİ


4
Negatif sayılarla uğraşmamanız koşuluyla bu harika bir şey. Ben hiç regex guru değilim daha iyi bir örnek veremez :)
Gary

39
Kayan nokta sayılarında izin verilen tüm karakterleri işleyen ve ayrıca dize yerine sayı döndüren parseFloat kullanmayı düşünün - bkz. Maximelebreton'un cevabı .
Oliver

6
Soruyu doğru cevaplamadığı için bu kabul edilen cevap olmamalıdır. ParseFloat / parseInt çözümleri daha iyidir. Soru, sayısal hesaplamalar ile ilgili olarak soruyor . Bu cevap bir dize döndürür. Bu, "20" + 20 = "2020" anlamına gelir ve bu da dahil olan herkes için iyi değildir.
mastaBlasta

@zakovyrya kullanılmış RegExp açıklayabilir misiniz/[^-\d\.]/g
Alexander

1
@Alexander Kareli köşeli parantez NOT: [^ <buraya koyduğunuz her şey>] anlamına gelir. Bu normal ifadede eksi işareti, rakam veya nokta DEĞİLDİR herhangi bir sembolle eşleşir. Aslında sayının bir parçası olamayacak her şeyi siler
zakovyrya

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

parseInt birimleri otomatik olarak yok sayar.

Örneğin:

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

1
Bu, tökezlediğim tüm durumlarda çok iyi çalışıyor ve herhangi bir regexp çözümünden çok daha okunabilir buluyorum.
Markus Amalthea Magnuson

3
bu çözümü kullanıyorsanız parseInt'e sayı tabanı (10) eklemek isteyebilirsiniz.
asawilliams

47
Tamsayı olmayan bir değer aldığınız durumu ( maximelebreton'un yanıtında olduğu gibi) hesaba katmak yerine parseFloat kullanmak isteyebilirsiniz . parseInt
Oliver

3
Aslında, 10 varsayılan olduğundan parseInt ", 10" radix parametresine ihtiyaç duymaz. Daha az parametre = daha iyi okunabilirlik, daha kısa kod, daha az hata.
Pointer Null

2
10, yalnızca bir sekizli olarak yorumlanamazsa (örneğin, '0700' 700 yerine 448 olarak ayrıştırılır, bu da büyük olasılıkla istenen) parseInt için varsayılan değerdir.
Robert C. Barth

122

Replace yöntemiyle, css değeriniz bir sayı değil, bir dizedir.

Bu yöntem daha temiz, basit ve bir sayı döndürüyor:

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

2
OP olası tamsayı olmayan birimler ( %, em) istediği için bu en iyi çözümdür
Andre Figueiredo

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

Em'de marginBottom tanımlanmış olsa bile, yukarıdaki parseFloat içindeki değer hesaplanan bir CSS özelliği olduğundan px cinsinden olacaktır.


3
parseFloat öğesinin yalnızca bir bağımsız değişkeni vardır; burada sağladığınız sayı tabanı (10) yok sayılır. Yani daha doğru cevap maksimelebreton olacaktır .
Oliver

ParseFloat ($ (this) .css ('marginBottom'), 10) olması gerekiyor mu
user1736947

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

2
Bu sadece 'px' durumunu ele alır. Bu yüzden kalan 'soneklerin her biri için ayrı bir değişiklik yapılması gerektiğini düşünüyorum.
Grzegorz Oledzki

3
Dikkatli olun - diğer sonekler piksel olarak değildir, bu yüzden beklerseniz pxancak verildiyseniz emdönüştürmeniz gerekir.
Ariel

Ben de öyle düşünüyordum - bunun için kütüphane rutinleri var mı? Sanırım px beklemek oldukça makul bir durum ama sağlamlık açısından seçeneklerimiz neler? (Sadece musing, here - Değerleri kontrol ettiğim için onunla çok fazla uğraşmayacağım)
lol

5

Herhangi bir tek CSS özelliğinin sayısal değerini döndürmek için basit bir jQuery eklentisi kullanın.

parseFloatJQuery'nin varsayılan cssyöntemiyle döndürülen değer için geçerlidir .

Eklenti Tanımı:

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

Kullanımı:

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

5

Diyelim ki kenar boşluğu alt özelliği 20 piksel /% 20 / 20em olarak ayarlanmış. Değeri sayı olarak almak için iki seçenek vardır:

Seçenek 1:

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

ParseInt () işlevi bir dizeyi ayrıştırır ve bir tam sayı döndürür. Ne yaptığınızı bilmiyorsanız, yukarıdaki işlevde bulunan 10 değerini ("sayı tabanı" olarak bilinir) değiştirmeyin.

Örnek Çıktı% olarak: 20 (kenar boşluğu piksel olarak ayarlanırsa) ve geçerli Üst Öğe / Yazı Tipi boyutuna bağlı olarak göreli sayı verir.

Seçenek 2 (Şahsen bu seçeneği tercih ediyorum)

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

Örnek Çıktı% olarak: 20 (kenar boşluğu piksel olarak ayarlanırsa) ve geçerli Üst Öğe / Yazı Tipi boyutuna bağlı olarak göreli sayı verir.

ParseFloat () işlevi bir dizeyi ayrıştırır ve bir kayan nokta sayısı döndürür.

ParseFloat () işlevi, belirtilen dizedeki ilk karakterin bir sayı olup olmadığını belirler. Öyleyse, dizeyi sayının sonuna ulaşıncaya kadar ayrıştırır ve sayıyı dize olarak değil sayı olarak döndürür.

Seçenek 2'nin avantajı, ondalık sayıları döndürürseniz (örn. 20.32322px), ondalık noktanın arkasındaki değerlerle döndürülen sayıyı elde etmenizdir. Döndürülen belirli sayılara ihtiyacınız varsa yararlıdır, örneğin kenar boşluğunuz em veya % olarak ayarlanmışsa


4

parseintondalık değerleri keser (örn. 1.5emverir 1).

Normal ifade ile bir replaceişlevi deneyin, ör.

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

4

Şunun için gidiyorum:

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

Genel bir çözüm değil. Çoğu durumda, bence, margina'nın negatif veya pozitif olduğunu bilmek isteyeceğim !
Andre Figueiredo

3

Birim genişliğini birimsiz almanın en basit yolu:

target.width()

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


Genişlik ve yükseklik için harika. $ (selector) .width () ve $ (selector) .height () gerçekten sayıdır. Diğer css sahne için yararlı değildir: kenar boşluğu, dolgu.
eon

3

Bu çok basit jQuery eklentisini uygulayabilirsiniz :

Eklenti Tanımı:

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

NaNEski IE sürümünde oluşabilecek değerlere dayanıklıdır ( 0bunun yerine geri döner )

Kullanımı:

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

Zevk almak! :)


1
Bu iyi bir fikir, ancak bilinmeyen bir işlevi gereğinden fazla çağırmak gibi yan etkilere dikkat etmeyi unutmayın. var result; return isNaN(result = parseFloat(this.css(p))) ? 0 : result;
Nicole

2

Kabul edilen cevabı geliştirmek için şunu kullanın:

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

2

Yalnızca "px" içinse şunları da kullanabilirsiniz:

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

0

Ondalık sayıları korurken birimleri kaldırmalıdır.

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

-1

kullanım

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

bir dizi döndürür. ilk dizin kenar boşluğu altının değerini döndürür ( 20 piksel için örnek 20 ) ve ikinci dizin kenar boşluğu altının birimini döndürür ( 20 piksel için örnek piksel)


1
cssUnit aslında jQuery değil, jQueryUI'nin bir parçasıdır.
cvkline
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.