Làm thế nào để chỉ lấy một phần số của thuộc tính CSS với jQuery?


157

Tôi cần thực hiện một phép tính số dựa trên các thuộc tính CSS. Tuy nhiên, khi tôi sử dụng điều này để có được thông tin:

$(this).css('marginBottom')

nó trả về giá trị '10px'. Có một mẹo để chỉ nhận được một phần số giá trị dù cho dù đó là pxhoặc %hoặc emhoặc bất cứ điều gì?

Câu trả lời:


163

Điều này sẽ dọn sạch tất cả các chữ số không có chữ số, không dấu chấm và không dấu trừ khỏi chuỗi:

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

CẬP NHẬT cho các giá trị âm


4
Điều này là tuyệt vời cung cấp cho bạn không phải đối phó với số âm. Tôi không phải là bậc thầy regex nên không thể cung cấp một mẫu tốt hơn :)
gary

39
Cân nhắc sử dụng parseFloat để xử lý tất cả các ký tự được phép trong các số dấu phẩy động và cũng trả về một số thay vì một chuỗi - xem câu trả lời của maximelebreton .
Oliver

6
Đây không phải là câu trả lời được chấp nhận vì nó không trả lời đúng câu hỏi. Các giải pháp parseFloat / parseInt là tốt hơn. Câu hỏi liên quan đến tính toán số . Câu trả lời này trả về một chuỗi. Điều đó có nghĩa là "20" + 20 = "2020" không tốt cho bất kỳ ai tham gia.
mastaBlasta

@zakovyrya bạn có thể giải thích về RegExp đã sử dụng/[^-\d\.]/g
Alexander

1
@Alexander Dấu ngoặc vuông có dấu mũ có nghĩa là KHÔNG: [^ <bất cứ điều gì bạn đặt ở đây>]. Trong regex này, nó khớp với bất kỳ ký hiệu nào KHÔNG phải là dấu, chữ số hoặc dấu chấm. Về cơ bản xóa mọi thứ không thể là một phần của số
zakovyrya

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

parseInt sẽ tự động bỏ qua các đơn vị.

Ví dụ:

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

1
Điều này dường như hoạt động rất tốt trong tất cả các trường hợp tôi đã vấp ngã, và tôi thấy nó dễ đọc hơn bất kỳ giải pháp regrec nào.
Markus Amalthea Magnuson

3
bạn có thể muốn thêm cơ số (10) vào parseInt nếu bạn đang sử dụng giải pháp này.
asawilliams

47
Bạn có thể muốn sử dụng parseFloat thay vì tính parseIntđến trường hợp bạn nhận được giá trị không nguyên - như trong câu trả lời của maximelebreton .
Oliver

3
Trên thực tế, parseInt không cần tham số radix ", 10", vì 10 là mặc định. Ít thông số hơn = khả năng đọc tốt hơn, mã ngắn hơn, ít lỗi hơn.
Con trỏ Null

2
10 chỉ là mặc định cho parseInt nếu số không thể được hiểu là một số bát phân (ví dụ: '0700' sẽ phân tích thành 448 thay vì 700, có lẽ là điều mong muốn).
Robert C. Barth

122

Với phương thức thay thế, giá trị css của bạn là một chuỗi chứ không phải là một số.

Phương pháp này sạch hơn, đơn giản và trả về một số:

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

2
Đây là giải pháp tốt nhất, vì OP là yêu cầu đối với đơn vị số nguyên thể ( %, em)
Andre Figueiredo

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

Ngay cả khi marginBottom được xác định trong em, giá trị bên trong parseFloat ở trên sẽ bằng px, vì đó là thuộc tính CSS được tính toán.


3
parseFloat chỉ có một đối số - cơ số (10) bạn cung cấp ở đây sẽ bị bỏ qua. Vì vậy, câu trả lời đúng hơn sẽ là maximelebreton's .
Oliver

Có cần phải là parseFloat ($ (this) .css ('marginBottom'), 10)
user1736947

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

2
Điều đó sẽ chỉ xử lý trường hợp 'px'. Vì vậy, tôi đoán một sự thay thế riêng biệt nên được thực hiện cho mỗi 'hậu tố' còn lại.
Grzegorz Oledzki

3
Hãy cẩn thận - các hậu tố khác không có pixel, vì vậy nếu bạn mong đợi pxnhưng được cung cấp, embạn cần phải chuyển đổi.
Ariel

đó là những gì tôi đã nghĩ - có bất kỳ thói quen thư viện nào cho việc này không? Giống như tôi nghĩ rằng đó là một điều kiện khá hợp lý để mong đợi px, nhưng với mục đích mạnh mẽ, lựa chọn của chúng ta là gì ...? (Chỉ cần suy ngẫm, ở đây - Tôi sẽ không bận tâm quá nhiều với nó vì tôi kiểm soát các giá trị)
lol

5

Tôi sử dụng một plugin jQuery đơn giản để trả về giá trị số của bất kỳ thuộc tính CSS nào.

Nó áp dụng parseFloatcho giá trị được trả về bởi cssphương thức mặc định của jQuery .

Định nghĩa Plugin:

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

Sử dụng:

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

5

Giả sử bạn có một thuộc tính dưới lề được đặt thành 20px / 20% / 20em. Để lấy giá trị dưới dạng số, có hai tùy chọn:

Lựa chọn 1:

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

Hàm parseInt () phân tích một chuỗi và trả về một số nguyên. Không thay đổi 10 được tìm thấy trong chức năng trên (được gọi là "cơ số") trừ khi bạn biết bạn đang làm gì.

Ví dụ đầu ra sẽ là: 20 (nếu đặt lề dưới được đặt ở px) cho% và em sẽ xuất số tương đối dựa trên kích thước Phần tử / Phông chữ gốc hiện tại.

Tùy chọn 2 (Cá nhân tôi thích tùy chọn này)

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

Ví dụ đầu ra sẽ là: 20 (nếu đặt lề dưới được đặt ở px) cho% và em sẽ xuất số tương đối dựa trên kích thước Phần tử / Phông chữ gốc hiện tại.

Hàm parseFloat () phân tích cú pháp một chuỗi và trả về số dấu phẩy động.

Hàm parseFloat () xác định nếu ký tự đầu tiên trong chuỗi được chỉ định là một số. Nếu có, nó phân tích chuỗi cho đến khi đến cuối số và trả về số dưới dạng số, không phải là chuỗi.

Ưu điểm của Tùy chọn 2 là nếu bạn nhận được các số thập phân được trả về (ví dụ: 20.32322px), bạn sẽ nhận được số được trả về với các giá trị phía sau dấu thập phân. Hữu ích nếu bạn cần trả về các số cụ thể, ví dụ: nếu phần dưới lề của bạn được đặt thành em hoặc %


4

parseintsẽ cắt bất kỳ giá trị thập phân (ví dụ như 1.5emcho1 ).

Hãy thử một replacehàm với regex, vd

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

4

Id đi cho:

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

Không phải là một giải pháp chung chung. Trong hầu hết các trường hợp, tôi nghĩ, tôi sẽ muốn biết a marginlà tiêu cực hay tích cực!
Andre Figueiredo

3

Cách đơn giản nhất để có được chiều rộng phần tử không có đơn vị là:

target.width()

Nguồn: https://api.jquery.com/ thong / # thong2


Tuyệt vời cho chiều rộng và chiều cao. $ (bộ chọn). thong () và $ (bộ chọn) .height () thực sự là những con số. Không hữu ích cho các đạo cụ css khác: lề, đệm.
eon

3

Bạn có thể thực hiện jQuery rất đơn giản này plugin :

Định nghĩa Plugin:

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

Nó chống lại NaNcác giá trị có thể xảy ra trong phiên bản IE cũ (sẽ trả về0 thay thế)

Sử dụng:

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

Thưởng thức! :)


1
Đây là một ý tưởng tốt, nhưng hãy nhớ coi chừng các tác dụng phụ như gọi một chức năng không rõ chi phí nhiều hơn mức cần thiết. var result; return isNaN(result = parseFloat(this.css(p))) ? 0 : result;
Nicole

2

Để cải thiện câu trả lời được chấp nhận, hãy sử dụng:

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

2

Nếu nó chỉ dành cho "px", bạn cũng có thể sử dụng:

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

0

Nên loại bỏ các đơn vị trong khi bảo quản số thập phân.

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

-1

sử dụng

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

trong đó trả về một mảng. chỉ mục đầu tiên trả về giá trị của lề dưới (ví dụ 20 cho 20px) và chỉ mục thứ hai trả về đơn vị dưới cùng của lề (ví dụ px cho 20px)


1
cssUnit thực sự là một phần của jQueryUI, không phải jQuery.
cvkline 7/03/2015
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.