Bagaimana cara mendapatkan bagian numerik dari properti CSS dengan jQuery?

158

Saya perlu melakukan perhitungan numerik berdasarkan properti CSS. Namun, ketika saya menggunakan ini untuk mendapatkan info:

$(this).css('marginBottom')

mengembalikan nilai '10px'. Apakah ada trik untuk hanya mendapatkan nomor bagian dari nilai tidak peduli apakah itu pxatau %atau ematau apa pun?

Tim Sheiner
sumber

Jawaban:

163

Ini akan membersihkan semua non-digit, non-titik, dan bukan-minus-tanda dari string:

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

DIPERBARUI untuk nilai negatif

zakovyrya
sumber
4
Ini bagus asalkan Anda tidak berurusan dengan angka negatif. Saya bukan guru regex jadi tidak bisa memberikan sampel yang lebih baik :)
gary
39
Pertimbangkan menggunakan parseFloat yang menangani semua karakter yang diizinkan dalam angka floating point dan juga mengembalikan angka sebagai ganti string - lihat jawaban maximelebreton .
Oliver
6
Ini seharusnya bukan jawaban yang diterima karena tidak menjawab pertanyaan dengan benar. Solusi parseFloat / parseInt lebih baik. Pertanyaannya adalah tentang perhitungan numerik . Jawaban ini mengembalikan sebuah string. Itu berarti "20" + 20 = "2020" yang tidak baik untuk siapa pun yang terlibat.
mastaBlasta
@zakovyrya dapatkah Anda menjelaskan RegExp/[^-\d\.]/g
Alexander
1
@Alexander Square kurung dengan tanda sisipan berarti TIDAK: [^ <apa pun yang Anda masukkan di sini>]. Dalam regex ini cocok dengan simbol apa pun yang BUKAN tanda minus, digit, atau titik. Pada dasarnya menghapus semua yang tidak bisa menjadi bagian dari angka
zakovyrya
284
parseInt($(this).css('marginBottom'), 10);

parseInt akan secara otomatis mengabaikan unit.

Sebagai contoh:

var marginBottom = "10px";
marginBottom = parseInt(marginBottom, 10);
alert(marginBottom); // alerts: 10
Bob
sumber
1
Ini tampaknya bekerja dengan sangat baik dalam semua kasus yang saya temui, dan saya merasa jauh lebih mudah dibaca daripada solusi regexp.
Markus Amalthea Magnuson
3
Anda mungkin ingin menambahkan radix (10) ke parseInt jika Anda menggunakan solusi ini.
asawilliams
47
Anda mungkin ingin menggunakan parseFloat alih-alih parseIntmemperhitungkan kasus di mana Anda menerima nilai non-integer - seperti dalam jawaban maximelebreton .
Oliver
3
Sebenarnya, parseInt tidak perlu ", 10" parameter radix, karena 10 adalah default. Lebih sedikit params = lebih mudah dibaca, kode lebih pendek, lebih sedikit bug.
Pointer Null
2
10 hanya merupakan default untuk parseInt jika angka tidak dapat diartikan sebagai oktal (misal '0700' akan diuraikan sebagai 448 daripada 700, yang mungkin merupakan yang diinginkan).
Robert C. Barth
122

Dengan metode ganti, nilai css Anda adalah string, dan bukan angka.

Metode ini lebih bersih, sederhana, dan mengembalikan angka:

parseFloat($(this).css('marginBottom'));
Maximelebreton
sumber
2
Ini adalah solusi terbaik, karena OP meminta kemungkinan unit non-integer ( %, em)
Andre Figueiredo
14
parseFloat($(this).css('marginBottom'))

Bahkan jika marginBottom didefinisikan dalam mereka, nilai di dalam parseFloat di atas akan berada di px, karena itu adalah properti CSS yang dihitung.

Alex Pavlov
sumber
3
parseFloat hanya memiliki satu argumen - radix (10) yang Anda berikan di sini akan diabaikan. Jadi, jawaban yang lebih tepat adalah pepatah yang asli .
Oliver
Apakah harus parseFloat ($ (ini) .css ('marginBottom'), 10)
user1736947
9
$(this).css('marginBottom').replace('px','')
Diodeus - James MacFarlane
sumber
2
Itu hanya akan menangani kasus 'px'. Jadi saya kira penggantian yang terpisah harus dilakukan untuk masing-masing 'sufiks' yang tersisa.
Grzegorz Oledzki
3
Berhati-hatilah - sufiks lain tidak dalam piksel, jadi jika Anda berharap pxtetapi diberikan, emAnda perlu mengonversi.
Ariel
itulah yang saya pikirkan - apakah ada rutinitas perpustakaan untuk ini? Seperti saya pikir ini adalah kondisi yang cukup masuk akal untuk mengharapkan px, tetapi untuk tujuan ketahanan, apa saja pilihan kita ...? (Hanya merenung, di sini - saya tidak akan terlalu repot dengan itu karena saya mengendalikan nilai-nilai)
lol
5

Saya menggunakan plugin jQuery sederhana untuk mengembalikan nilai numerik properti CSS tunggal.

Ini berlaku parseFloatuntuk nilai yang dikembalikan oleh cssmetode default jQuery .

Definisi Plugin:

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

Pemakaian:

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

Mari kita asumsikan Anda memiliki properti margin-bawah yang diatur ke 20px / 20% / 20em. Untuk mendapatkan nilai sebagai angka ada dua opsi:

Pilihan 1:

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

Fungsi parseInt () mem-parsing string dan mengembalikan integer. Jangan mengubah 10 yang ditemukan dalam fungsi di atas (dikenal sebagai "radix") kecuali Anda tahu apa yang Anda lakukan.

Contoh Output akan menjadi: 20 (jika margin-bottom diatur dalam px) untuk% dan em itu akan menampilkan angka relatif berdasarkan Elemen Induk / ukuran Font saat ini.

Opsi 2 (Saya pribadi lebih suka opsi ini)

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

Contoh Output akan menjadi: 20 (jika margin-bottom diatur dalam px) untuk% dan em itu akan menampilkan angka relatif berdasarkan Elemen Induk / ukuran Font saat ini.

Fungsi parseFloat () mem-parsing string dan mengembalikan angka floating point.

Fungsi parseFloat () menentukan apakah karakter pertama dalam string yang ditentukan adalah angka. Jika ya, ia mem-parsing string hingga mencapai akhir angka, dan mengembalikan angka sebagai angka, bukan sebagai string.

Keuntungan Opsi 2 adalah jika Anda mendapatkan angka desimal yang dikembalikan (mis. 20,32322px), Anda akan mendapatkan angka yang dikembalikan dengan nilai di belakang titik desimal. Berguna jika Anda membutuhkan nomor tertentu yang dikembalikan, misalnya jika margin-bottom Anda ditetapkan dalam em atau %

Arman Nisch
sumber
4

parseintakan memotong nilai desimal apa pun (misalnya 1.5emmemberi 1).

Coba replacefungsi dengan regex misalnya

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

Id go for:

Math.abs(parseFloat($(this).css("property")));
mojo
sumber
Bukan solusi umum. Dalam kebanyakan kasus, saya pikir, saya ingin tahu marginapakah itu negatif atau positif!
Andre Figueiredo
3

Cara paling sederhana untuk mendapatkan lebar elemen tanpa unit adalah:

target.width()

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

Paul Leclercq
sumber
Bagus untuk lebar dan tinggi. $ (selector) .width () dan $ (selector) .height () memang angka. Tidak berguna untuk alat peraga css lainnya: margin, padding.
eon
3

Anda dapat menerapkan plugin jQuery yang sangat sederhana ini :

Definisi Plugin:

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

Ini tahan terhadap NaNnilai-nilai yang mungkin terjadi di versi IE lama (akan kembali 0sebagai gantinya)

Pemakaian:

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

Nikmati! :)

CodeGems
sumber
1
Ini adalah ide yang baik, tetapi ingat untuk berhati-hati terhadap efek samping seperti memanggil fungsi dengan biaya yang tidak diketahui lebih dari yang diperlukan. var result; return isNaN(result = parseFloat(this.css(p))) ? 0 : result;
Nicole
2

Untuk meningkatkan jawaban yang diterima, gunakan ini:

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

Jika hanya untuk "px", Anda juga dapat menggunakan:

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

Harus menghapus unit sambil mempertahankan desimal.

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

menggunakan

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

yang mengembalikan array. indeks pertama mengembalikan nilai margin bawah (contoh 20 untuk 20px) dan indeks kedua mengembalikan unit margin bawah (contoh px untuk 20px)

morpheis camus
sumber
1
cssUnit sebenarnya adalah bagian dari jQueryUI, bukan jQuery.
cvkline