วิธีรับส่วนตัวเลขของคุณสมบัติ CSS ด้วย jQuery


158

ฉันต้องทำการคำนวณตัวเลขตามคุณสมบัติ CSS อย่างไรก็ตามเมื่อฉันใช้สิ่งนี้เพื่อรับข้อมูล:

$(this).css('marginBottom')

มันคืนค่า '10px' มีเคล็ดลับที่จะเพียงแค่ได้รับส่วนจำนวนของค่าไม่ว่าไม่ว่าจะเป็นpxหรือ%หรือemหรืออะไรก็ตาม?

คำตอบ:


163

วิธีนี้จะล้างข้อมูลที่ไม่ใช่ตัวเลขไม่ใช่จุดและเครื่องหมายลบทั้งหมดจากสตริง:

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

อัปเดตสำหรับค่าลบ


4
นี่เป็นสิ่งที่ยอดเยี่ยมหากคุณไม่ได้ติดต่อกับจำนวนลบ ฉันไม่ guru regex จึงไม่สามารถให้ตัวอย่างที่ดีกว่า :)
แกรี่

39
พิจารณาใช้parseFloatซึ่งจัดการทุกตัวละครที่ได้รับอนุญาตในตัวเลขทศนิยมและส่งกลับจำนวนแทนสตริง - ดูคำตอบของ maximelebreton
โอลิเวอร์

6
สิ่งนี้ไม่ควรเป็นคำตอบที่ยอมรับได้เพราะไม่สามารถตอบคำถามได้อย่างถูกต้อง โซลูชัน parseFloat / parseInt ดีกว่า คำถามที่ถามในเรื่องที่เกี่ยวกับการคำนวณตัวเลข คำตอบนี้ส่งคืนสตริง นั่นหมายความว่า "20" + 20 = "2020" ซึ่งไม่ดีสำหรับทุกคนที่เกี่ยวข้อง
mastaBlasta

@zakovyrya คุณสามารถอธิบาย RegExp ที่ใช้แล้ว/[^-\d\.]/g
Alexander

1
@ วงเล็บเหลี่ยมอเล็กซานเดอร์ที่มีคาเร็ตหมายถึงไม่: [^ <สิ่งที่คุณใส่ที่นี่>] ใน regex นี้ตรงกับสัญลักษณ์ใด ๆ ที่ไม่ใช่เครื่องหมายลบ, หลักหรือจุด เป็นหลักลบทุกอย่างที่ไม่สามารถเป็นส่วนหนึ่งของจำนวน
zakovyrya

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

parseInt จะละเว้นหน่วยโดยอัตโนมัติ

ตัวอย่างเช่น:

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

1
ดูเหมือนว่าจะทำงานได้ดีในทุกกรณีที่ฉันสะดุดและฉันคิดว่ามันอ่านได้ดีกว่าโซลูชัน regexp
Markus Amalthea Magnuson

3
คุณอาจต้องการเพิ่ม radix (10) ในการแยกวิเคราะห์หากคุณใช้โซลูชันนี้
asawilliams

47
คุณอาจต้องการที่จะใช้parseFloatแทนparseIntไปยังบัญชีสำหรับกรณีที่คุณได้รับค่าที่ไม่ใช่จำนวนเต็ม - ในคำตอบของ maximelebreton
โอลิเวอร์

3
ที่จริงแล้ว parseInt ไม่ต้องการพารามิเตอร์ ", 10" radix เนื่องจาก 10 เป็นค่าเริ่มต้น พารามิเตอร์น้อยลง = อ่านง่ายขึ้น, รหัสสั้นลง, มีข้อบกพร่องน้อยลง
ตัวชี้ Null

2
10 เป็นค่าเริ่มต้นสำหรับการแยกวิเคราะห์หากหมายเลขไม่สามารถตีความได้ว่าเป็นฐานแปด (เช่น '0700' จะแยกเป็น 448 แทนที่จะเป็น 700 ซึ่งอาจเป็นสิ่งที่ต้องการ)
Robert C. Barth

122

ด้วยเมธอด replace ค่า css ของคุณจะเป็นสตริงไม่ใช่ตัวเลข

วิธีนี้สะอาดง่ายขึ้นและคืนค่าตัวเลข:

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

2
นี่เป็นทางออกที่ดีที่สุดเนื่องจาก OP ขอหน่วยที่ไม่ใช่จำนวนเต็ม ( %, em)
Andre Figueiredo

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

แม้ว่า marginBottom ที่กำหนดไว้ใน em ค่าภายใน parseFloat ด้านบนจะอยู่ใน px เนื่องจากเป็นคุณสมบัติ CSS ที่คำนวณได้


3
parseFloatมีเพียงหนึ่งอาร์กิวเมนต์ - Radix (10) ที่คุณให้ไว้ที่นี่จะถูกละเว้น ดังนั้นคำตอบที่ถูกต้องมากขึ้นจะเป็น maximelebreton
โอลิเวอร์

จำเป็นต้องใช้ parseFloat ($ (นี้) .css ('marginBottom'), 10) หรือไม่
1736947

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

2
ที่จะจัดการเฉพาะกรณี 'px' ดังนั้นฉันเดาว่าควรจะทำการแทนที่แบบแยกสำหรับ 'ส่วนต่อท้าย' ที่เหลือแต่ละรายการ
Grzegorz Oledzki

3
โปรดใช้ความระมัดระวัง - ส่วนต่อท้ายอื่น ๆ ไม่ได้อยู่ในหน่วยพิกเซลดังนั้นหากคุณคาดหวังpxแต่จะได้รับemคุณต้องแปลง
Ariel

นั่นคือสิ่งที่ฉันคิด - มีงานประจำห้องสมุดสำหรับนี้หรือไม่ เช่นฉันคิดว่ามันเป็นเงื่อนไขที่เหมาะสมที่จะคาดหวัง px แต่สำหรับจุดประสงค์ของความแข็งแกร่งตัวเลือกของเราคืออะไร ... ? (แค่ musing ที่นี่ - ฉันจะไม่ไปยุ่งกับมันมากเกินไปตั้งแต่ฉันควบคุมค่า)
lol

5

ฉันใช้ปลั๊กอิน jQuery ง่าย ๆ เพื่อคืนค่าตัวเลขของคุณสมบัติ CSS เดียว

มันใช้parseFloatกับค่าที่ส่งคืนโดยcssวิธีการเริ่มต้นของ jQuery

คำจำกัดความปลั๊กอิน:

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

การใช้งาน:

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

5

ให้เราสมมติว่าคุณตั้งค่าคุณสมบัติขอบด้านล่างเป็น 20px / 20% / 20em ในการรับค่าเป็นตัวเลขมีสองตัวเลือก:

ตัวเลือกที่ 1:

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

ฟังก์ชัน parseInt () แยกวิเคราะห์สตริงและส่งคืนจำนวนเต็ม อย่าเปลี่ยน 10 รายการที่พบในฟังก์ชั่นด้านบน (เรียกว่า "radix") เว้นแต่คุณจะรู้ว่าคุณกำลังทำอะไรอยู่

ตัวอย่างเอาต์พุตจะเป็น: 20 (หากตั้งค่าระยะขอบด้านล่างเป็น px) สำหรับ% และ em จะส่งออกจำนวนสัมพัทธ์ตามองค์ประกอบหลัก / ขนาดตัวอักษรปัจจุบัน

ตัวเลือก 2 (โดยส่วนตัวแล้วฉันชอบตัวเลือกนี้)

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

ตัวอย่างเอาต์พุตจะเป็น: 20 (หากตั้งค่าระยะขอบด้านล่างเป็น px) สำหรับ% และ em จะส่งออกจำนวนสัมพัทธ์ตามองค์ประกอบหลัก / ขนาดตัวอักษรปัจจุบัน

ฟังก์ชั่น parseFloat () แยกวิเคราะห์สตริงและส่งกลับจำนวนจุดลอยตัว

ฟังก์ชัน parseFloat () กำหนดว่าอักขระตัวแรกในสตริงที่ระบุเป็นตัวเลขหรือไม่ หากเป็นเช่นนั้นจะแยกวิเคราะห์สตริงจนกว่าจะถึงจุดสิ้นสุดของตัวเลขและส่งกลับตัวเลขเป็นตัวเลขไม่ใช่เป็นสตริง

ข้อดีของตัวเลือกที่ 2 คือถ้าคุณได้รับตัวเลขทศนิยมที่ส่งคืน (เช่น 20.32322px) คุณจะได้รับตัวเลขที่ส่งคืนพร้อมค่าที่อยู่หลังจุดทศนิยม มีประโยชน์หากคุณต้องการตัวเลขเฉพาะที่ส่งคืนตัวอย่างเช่นถ้าขอบล่างของคุณตั้งค่าเป็นemหรือ%


4

parseintจะตัดทอนค่าทศนิยมใด ๆ (เช่น1.5emให้1)

ลองreplaceฟังก์ชั่นด้วย regex เช่น

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

4

รหัสไปสำหรับ:

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

ไม่ใช่ทางออกทั่วไป ในกรณีส่วนใหญ่ฉันคิดว่าฉันจะต้องการทราบว่าmarginเป็นลบหรือบวก!
Andre Figueiredo

3

วิธีที่ง่ายที่สุดในการรับความกว้างขององค์ประกอบโดยไม่มีหน่วยคือ:

target.width()

ที่มา: https://api.jquery.com/width/#width2


เหมาะสำหรับความกว้างและความสูง $ (selector) .width () และ $ (selector) .height () เป็นตัวเลขจริง ๆ ไม่มีประโยชน์สำหรับอุปกรณ์ css อื่น ๆ : margin, padding
กัป

3

คุณสามารถใช้ปลั๊กอินjQuery ที่ง่ายมากนี้:

คำจำกัดความปลั๊กอิน:

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

มันทนต่อNaNค่าที่อาจเกิดขึ้นใน IE เวอร์ชั่นเก่า (จะกลับมา0แทน)

การใช้งาน:

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

สนุก! :)


1
นี่เป็นความคิดที่ดี แต่อย่าลืมระวังผลข้างเคียงเช่นการเรียกใช้ฟังก์ชันที่ไม่ทราบค่าใช้จ่ายเกินความจำเป็น var result; return isNaN(result = parseFloat(this.css(p))) ? 0 : result;
นิโคล

2

สำหรับการปรับปรุงคำตอบที่ยอมรับใช้สิ่งนี้:

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



-1

ใช้

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

ซึ่งส่งกลับอาร์เรย์ ดัชนีแรกคืนค่าขอบล่างของขอบ (ตัวอย่าง20สำหรับ 20px) และดัชนีที่สองส่งคืนหน่วยของขอบล่าง (ตัวอย่างpxสำหรับ 20px)


1
cssUnit เป็นส่วนหนึ่งของ jQueryUI ไม่ใช่ jQuery
cvkline
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.