วิธีสร้าง jQuery เป็นค่า not round ที่ส่งคืนโดย .width ()?


94

ฉันค้นหารอบ ๆ แล้วไม่พบสิ่งนี้ ฉันกำลังพยายามหาความกว้างของ div แต่ถ้ามีจุดทศนิยมมันจะปัดเศษตัวเลข

ตัวอย่าง:

#container{
    background: blue;
    width: 543.5px;
    height: 20px;
    margin: 0;
    padding: 0;
}

ถ้าฉันทำ$('#container').width();มันจะส่งกลับ 543 แทนที่จะเป็น 543.5 ฉันจะไม่ปัดเศษตัวเลขและส่งคืนเต็ม 543.5 ได้อย่างไร


2
เหตุใดคุณจึงมีความกว้างของพิกเซลทศนิยม พวกมันจะปัดเป็นจำนวนเต็ม คุณไม่สามารถมีครึ่งพิกเซลได้
Moin Zaman

ทำไมคุณถึงต้องการสิ่งนี้? หากไม่มีข้อมูลนั้นคำถามนี้ก็ไม่มีจุดหมาย
Juan Mendes

2
@JuanMendes ในกรณีของฉันบนจอแสดงผล HiDPI Chrome 38 จะคำนวณความกว้างของหน้าต่างที่ไม่ใช่จำนวนเต็ม ดังนั้นถ้า $ .width ปัดขึ้นกล่าวว่า 1250.6 ถึง 1251 และฉันคำนวณตาม 1251 แสดงว่าฉันมีปัญหา การปัดเศษลงไม่ใช่ปัญหามากนัก
JKS

คำตอบ:


197

ใช้เนทีฟElement.getBoundingClientRectแทนรูปแบบขององค์ประกอบ ได้รับการแนะนำใน IE4 และได้รับการสนับสนุนโดยเบราว์เซอร์ทั้งหมด:

$("#container")[0].getBoundingClientRect().width

หมายเหตุ: สำหรับ IE8 และต่ำกว่าโปรดดูหมายเหตุ "ความเข้ากันได้ของเบราว์เซอร์"ในเอกสาร MDN


9
+1 หากคุณตั้งค่าความกว้างขององค์ประกอบอื่นโปรดเปลี่ยนความกว้างด้วยวิธีนี้: $ ("# other"). css ("width", $ ('# container'). get (0) .getBoundingClientRect ( ) .width + "px"); หากคุณใช้ jQuery width () ค่าจะถูกปัดเศษ
lepe

1
จากคำถามที่คล้ายกันนี้IE widthและheightคุณสมบัติไม่ได้รับการสนับสนุนใน IE ทุกเวอร์ชันดังนั้นในบางกรณีจำเป็นต้องมีการคำนวณก่อนจึงจะใช้งานได้: stackoverflow.com/questions/11907514/…
flyingL123

ดี! คำถามเดียวกันสำหรับ outerWidth (จริง)? :) ข้อสังเกตเล็ก ๆ : ใน IE8 และต่ำกว่าวัตถุ DOMRect ส่งคืนโดย getBoundingClientRect () ไม่มีคุณสมบัติด้านความสูงและความกว้าง นอกจากนี้ยังไม่สามารถเพิ่มคุณสมบัติเพิ่มเติม (รวมถึงความสูงและความกว้าง) ลงในวัตถุ DOMRect เหล่านี้ได้ `
TecHunter

5
โปรดทราบว่าการgetBoundingClientRect()คำนวณขนาดหลังจากใช้แปลง CSS
user1620220

หลังจากการทดสอบฉันพบว่าวิธีนี้ใช้ไม่ได้กับองค์ประกอบที่ซ่อนอยู่ ( display: none)
Jory Hogeveen

10

คำตอบของ Ross Allenเป็นจุดเริ่มต้นที่ดี แต่การใช้getBoundingClientRect () ความกว้างจะรวมถึงช่องว่างภายในและความกว้างของเส้นขอบซึ่งไม่ใช่กรณีของฟังก์ชันความกว้างของ jquery :

วัตถุ TextRectangle ที่ส่งคืนมีช่องว่างภายในแถบเลื่อนและเส้นขอบ แต่ไม่รวมระยะขอบ ใน Internet Explorer พิกัดของสี่เหลี่ยมผืนผ้าล้อมรอบจะรวมขอบด้านบนและด้านซ้ายของพื้นที่ไคลเอ็นต์

หากเจตนาของคุณต้องการให้ได้widthค่าด้วยความแม่นยำคุณจะต้องลบช่องว่างภายในและเส้นขอบดังนี้:

var a = $("#container");
var width = a[0].getBoundingClientRect().width;

//Remove the padding width (assumming padding are px values)
width -= (parseInt(a.css("padding-left")) + parseInt(a.css("padding-right")));

//Remove the border width
width -= (a.outerWidth(false) - a.innerWidth());

คุณไม่ควร.replace("px", "")เป็นparseIntควรลบที่สำหรับคุณ
Steve Schrab

คำถามนี้เกี่ยวกับการป้องกันการปัดเศษฉันรู้สึกสับสนกับสมมติฐานที่ชัดเจนที่นี่ว่าการปัดเศษเป็นสิ่งที่ดีสำหรับค่าช่องว่างภายใน ทำไมคุณถึงถือว่าสิ่งนั้นแตกต่างจากค่าความกว้าง! ใช้parseFloat()บางที?
Phils

ในทำนองเดียวกันกับinnerWidth()การเป็นส่วนหนึ่งของปัญหาเดิมฉันกลัวว่าการคำนวณความกว้างของเส้นขอบที่นี่จะทำงานกับค่าที่โค้งมนด้วย
Phils

9

แค่อยากจะเพิ่มประสบการณ์ของฉันที่นี่แม้ว่าคำถามจะเก่า: ฉันทามติข้างต้นดูเหมือนว่าการปัดเศษของ jQuery นั้นมีประสิทธิภาพดีพอ ๆ กับการคำนวณที่ไม่มีเหตุผล - แต่ดูเหมือนจะไม่เป็นเช่นนั้นในสิ่งที่ฉันทำ .

องค์ประกอบของฉันมีความกว้างของของเหลวโดยทั่วไป แต่เนื้อหาที่เปลี่ยนแปลงแบบไดนามิกผ่าน AJAX ก่อนที่จะเปลี่ยนเนื้อหาฉันล็อกขนาดขององค์ประกอบไว้ชั่วคราวเพื่อไม่ให้เลย์เอาต์ของฉันเด้งไปมาระหว่างการเปลี่ยนแปลง ฉันพบว่าการใช้ jQuery เช่นนี้:

$element.width($element.width());

ทำให้เกิดความสนุกสนานเช่นมีความแตกต่างของพิกเซลย่อยระหว่างความกว้างจริงและความกว้างที่คำนวณได้ (โดยเฉพาะฉันจะเห็นคำกระโดดจากบรรทัดหนึ่งไปยังอีกบรรทัดหนึ่งซึ่งแสดงว่ามีการเปลี่ยนแปลงความกว้างไม่ใช่แค่ล็อก) จากคำถามอื่น - การรับความกว้างของจุดลอยตัวที่แท้จริงขององค์ประกอบ - ฉันพบ ซึ่งwindow.getComputedStyle(element).widthจะส่งคืนการคำนวณที่ไม่มีเหตุผล ดังนั้นฉันจึงเปลี่ยนรหัสด้านบนเป็นบางอย่างเช่น

var e = document.getElementById('element');
$('#element').width(window.getComputedStyle(e).width);

และด้วยรหัสนั้น - ไม่มีการตีกลับที่ตลก! ประสบการณ์นั้นดูเหมือนจะชี้ให้เห็นว่าค่าที่ไม่เกี่ยวข้องมีความสำคัญกับเบราว์เซอร์จริงไหม? (ในกรณีของฉันคือ Chrome เวอร์ชัน 26.0.1410.65)


เอกสารปัจจุบันสำหรับ. css () ของ jQuery ชี้ให้เห็นว่า getComputedStyle () เรียกว่า runtimeStyle () i IE และอ้างว่าข้อดีอย่างหนึ่งของ. css () คืออินเทอร์เฟซแบบรวมนี้
norwebian


-1

ใช้สิ่งต่อไปนี้เพื่อรับความกว้างที่ถูกต้อง:

var htmlElement=$('class or id');
var temp=htmlElement[0].style.width;

ทำไมคุณถึงต้องการ jquery เพื่อรับความกว้างที่คำนวณของคุณหากคุณตั้งค่าไว้จริงและมีให้ใช้งานในstyle.width
user151496
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.