Làm thế nào để làm cho jQuery không làm tròn giá trị được trả về bởi .width ()?


94

Tôi đã tìm kiếm xung quanh và không thể tìm thấy điều này. Tôi đang cố gắng lấy chiều rộng của một div, nhưng nếu nó có dấu thập phân, nó sẽ làm tròn số.

Thí dụ:

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

Nếu tôi thực hiện $('#container').width();nó sẽ trả về 543 thay vì 543.5. Làm cách nào để tôi không làm tròn số và trả về toàn bộ 543,5 (hoặc bất kỳ số nào).


2
Tại sao bạn có độ rộng pixel thập phân? Dù sao thì chúng cũng được làm tròn thành số nguyên. Bạn không thể có nửa pixel.
Moin Zaman

Tại sao bạn cần cái này? Nếu không có thông tin đó, câu hỏi này là vô nghĩa.
Juan Mendes

2
@JuanMendes Trong trường hợp của tôi, trên màn hình HiDPI, Chrome 38 tính chiều rộng cửa sổ không phải số nguyên. Vì vậy, nếu $ .width làm tròn, giả sử, 1250,6 thành 1251 và tôi thực hiện các phép tính dựa trên 1251, thì tôi gặp sự cố. Làm tròn xuống không phải là một vấn đề.
JKS

Câu trả lời:


196

Sử dụng kiểu gốc Element.getBoundingClientRectthay vì kiểu của phần tử. Nó đã được giới thiệu trong IE4 và được hỗ trợ bởi tất cả các trình duyệt:

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

Lưu ý: Đối với IE8 trở xuống, hãy xem ghi chú "Tương thích trình duyệt" trong tài liệu MDN.


9
+1 Nếu bạn đang đặt chiều rộng của một phần tử khác, hãy đảm bảo thay đổi chiều rộng của nó theo cách này: $ ("# other"). Css ("width", $ ('# container'). Get (0) .getBoundsClientRect ( ). width + "px"); Nếu bạn sử dụng jQuery width () giá trị sẽ được làm tròn.
lepe

1
Theo câu hỏi tương tự này widthheightthuộc tính không được hỗ trợ trong tất cả các phiên bản của trình duyệt IE, vì vậy trong một số trường hợp họ cần phải được tính toán trước khi chúng có thể được sử dụng: stackoverflow.com/questions/11907514/...
flyingL123

Đẹp! câu hỏi tương tự cho bên ngoài (true)? :) nhận xét nhỏ: `Trong IE8 trở xuống, đối tượng DOMRect được trả về bởi getBoundsClientRect () thiếu các thuộc tính chiều cao và chiều rộng. Ngoài ra, bổ sung tài sản (bao gồm cả chiều cao và chiều rộng) không thể được thêm vào những DOMRect objects.`
TecHunter

5
Lưu ý rằng getBoundingClientRect()tính toán các kích thước sau khi áp dụng các phép biến đổi CSS .
user1620220

Sau khi thử nghiệm, tôi thấy rằng phương pháp này không hoạt động đối với các phần tử ẩn ( display: none).
Jory Hogeveen

9

Tôi chỉ muốn thêm kinh nghiệm của tôi ở đây, mặc dù câu hỏi đã cũ: Sự đồng thuận ở trên dường như là cách làm tròn của jQuery hiệu quả cũng tốt như một phép tính không có xung quanh - nhưng điều đó dường như không đúng trong trường hợp tôi đang làm .

Nói chung, phần tử của tôi có chiều rộng linh hoạt, nhưng nội dung thay đổi động thông qua AJAX. Trước khi chuyển đổi nội dung, tôi tạm thời khóa các kích thước của phần tử để bố cục của tôi không bị trả lại trong quá trình chuyển đổi. Tôi thấy rằng sử dụng jQuery như thế này:

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

đang gây ra một số điều thú vị, như có sự khác biệt về pixel phụ giữa chiều rộng thực tế và chiều rộng được tính toán. (Cụ thể, tôi sẽ thấy một từ nhảy từ dòng văn bản này sang dòng văn bản khác, cho biết chiều rộng đã được thay đổi, không chỉ bị khóa.) Từ một câu hỏi khác - Lấy chiều rộng thực tế, dấu phẩy động của một phần tử - Tôi tìm thấy ra điều đó window.getComputedStyle(element).widthsẽ trả về một phép tính không được bao quanh. Vì vậy, tôi đã thay đổi mã trên thành một cái gì đó như

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

Và với mã RẰNG - không bị trả lại buồn cười! Trải nghiệm đó dường như cho thấy rằng giá trị không được bao quanh thực sự quan trọng đối với trình duyệt, phải không? (Trong trường hợp của tôi, Phiên bản Chrome 26.0.1410.65.)


Tài liệu hiện tại cho .css () của jQuery chỉ ra rằng getComputedStyle () được gọi là runtimeStyle () i IE và tuyên bố một trong những ưu điểm của .css () là giao diện thống nhất này.
norwebian

9

Câu trả lời của Ross Allen là một điểm khởi đầu tốt nhưng sử dụng getBoundsClientRect (). Width cũng sẽ bao gồm phần đệm và chiều rộng của đường viền mà không phải là trường hợp của hàm width của jquery :

Đối tượng TextRectangle được trả về bao gồm phần đệm, thanh cuộn và đường viền, nhưng không bao gồm lề. Trong Internet Explorer, tọa độ của hình chữ nhật bao gồm các đường viền trên cùng và bên trái của vùng máy khách.

Nếu mục đích của bạn là nhận được widthgiá trị với độ chính xác, bạn sẽ phải xóa phần đệm và đường viền như sau:

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());

Bạn không nên .replace("px", "")như parseIntnên loại bỏ điều đó cho bạn.
Steve Schrab

Câu hỏi này là tất cả về việc ngăn chặn việc làm tròn, tôi bối rối bởi giả định rõ ràng ở đây rằng việc làm tròn là tốt cho các giá trị đệm. Tại sao bạn lại xử lý điều đó khác với giá trị chiều rộng ?! Sử dụng parseFloat()có lẽ?
phils

Tương tự như vậy, với innerWidth()việc là một phần của bài toán ban đầu, tôi sợ rằng phép tính chiều rộng đường viền ở đây cũng đang hoạt động trên các giá trị được làm tròn.
phils

2

Bạn có thể sử dụng getComputedStylecho nó:

parseFloat(window.getComputedStyle($('#container').get(0)).width)

-1

Sử dụng thông tin sau để có được chiều rộng chính xác:

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

tại sao bạn evne jquery muốn để có được chiều rộng tính của bạn nếu bạn thực sự thiết lập nó và có nó có sẵn trongstyle.width
user151496
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.