2010-08-20 28 views
16

Trong khi cố tính toán chiều rộng của một phần tử ẩn, tôi thấy rằng jquery.width() trả về 0 cho chiều rộng của các phần tử đó.Chuyển đổi chuỗi chiều rộng css thành số thường là

Tôi phát hiện ra rằng việc sử dụng jquery.css ('width') sẽ trả lại chiều rộng chính xác bằng cách sử dụng chiều rộng kiểu được khai báo (ngay cả khi giá trị đó khác với biểu định kiểu ban đầu). Vấn đề là phương thức css ('width') trả về một chuỗi, thường là theo kiểu "100px". Câu hỏi của tôi giải quyết vào: làm thế nào để lấy số từ chuỗi "100px"? Có cách nào dễ dàng không?

+0

Sửa đổi: Phần tử tôi đang cố tính toán chiều rộng có thể thay đổi kích thước và có thể bị ẩn trong khi thực thi, do đó chiều rộng của nó cuối cùng sẽ thay đổi. – vitorhsb

Trả lời

23

Nếu nó luôn luôn trả về ở định dạng px, "100px", "50px" vv (tức là không phải là "em" hoặc phần trăm), bạn có thể chỉ ...

var width = parseInt($("#myelem").css("width"),10); // always use a radix 

hoặc

var width = parseInt(element.style.width,10); // always use a radix 

Nó bỏ qua hậu tố "px", do đó bạn nên làm tốt.

Mặc dù sâu xuống Tôi nghĩ rằng có điều gì đó không đúng nếu $ ("# myelem"). Width() không hoạt động.

Lưu ý về các yếu tố bị ẩn.

Nếu bạn đang thêm jQuery để tăng dần trang của bạn, phần tử bạn đang tính sẽ hiển thị khi trang tải lần đầu tiên. Vì vậy, bạn sẽ nhận được chiều rộng trước khi ban đầu ẩn phần tử. Bằng cách này, $ ("# myelem"). Width() sẽ hoạt động.

var myWidth = 0; 

$(document).ready(function() { 
    myWidth = $("#myelem").width(); 
    $("#myelem").hide(); 
}); 
+1

Lý do tại sao '.width()' không hoạt động là nếu các đối tượng bị ẩn bởi '.hide()' ('display: none') chúng không đóng góp vào layout và do đó không có chiều rộng. –

+0

Ah. Tôi sẽ cung cấp một giải pháp cho điều đó ... – Fenton

+0

Yếu tố tôi đang cố gắng tính toán chiều rộng có thể thay đổi kích thước và có thể được ẩn trong quá trình thực hiện, do đó chiều rộng của nó cuối cùng sẽ thay đổi. Vì vậy, như bạn đã đề xuất, tôi có thể sử dụng một biến để giữ giá trị của nó được tính toán trên trang '.ready()' event và trong mọi sự kiện gọi lại kích thước tôi phải tính lại - bằng cách sử dụng '.width()' - và áp dụng giá trị mới. Vì vậy, ngay cả khi phần tử bị ẩn, tôi sẽ có giá trị hiện tại. – vitorhsb

1

Ồ, tôi đã đưa ra:
new Number($elem.css('width').slice(0, -2));
//to extract the 'px' and return a regular number

Bây giờ tôi chỉ hy vọng rằng jquery allways trả về cùng một chuỗi thời trang: "100px"

+1

Nó sẽ nếu bạn đã xác định tất cả chúng là 'px'. Tuy nhiên, nếu bạn có một số chiều rộng là '%', nó sẽ trở lại là '50%' và hàm slice của bạn sẽ cắt bỏ chữ số ngoài cùng bên phải. Bạn có thể sử dụng 'indexOf' để kiểm tra' px' cho an toàn. – Pat

+1

hoặc bạn có thể xóa các số không bằng một cụm từ thông dụng. Điều này làm việc không có vấn đề làm thế nào bạn xác định chiều rộng ('px',' em', '%', 'pt') js:' Số (elem.style.width.replace (/ [^ \ d \.]/G, '')); 'hoặc jQuery:' Số ($ elem.css ('width'). thay thế (/ [^ \ d \.]/g, '')); ' – hofnarwillie

0

tôi sẽ dính vào .width() bởi vì nó thực sự nhận được chiều rộng được tính thay vì chiều rộng css. Thay vì ẩn nó bằng .hide() (display: none), bạn có thể ẩn nó bằng .css('visible', 'hidden') sau đó .width() sẽ hoạt động.

từ nhận xét của tôi Nếu bạn không muốn thay đổi bạn .hide() của sau đó bạn có thể áp dụng visible: hidden và sau đó .show() và sau đó đo chiều cao. Sau khi bạn đã đo nó, đảo ngược điều đó. Các đối tượng vẫn ảnh hưởng đến bố cục trang khi chúng bị ẩn bởi visible: hidden - hãy cẩn thận về điều đó.

Để tránh các thẻ gây rối với bố cục, bạn có thể đặt vị trí thành tuyệt đối, di chuyển nó đến thẻ body và sau đó đo.

+0

Tôi đồng ý sử dụng chiều rộng được tính toán. Trên thực tế, phần tử đã bị ẩn trong sự kiện trang tải, cộng thêm một số ít hơn .hide. Tôi đã thay đổi css từ "display: none" thành "visibility: hidden" và sau đó tôi có thể đọc các giá trị giống nhau bằng cách sử dụng .width(). Siêu. Bây giờ, tất cả những gì tôi phải làm là thay đổi tất cả các đoạn trích .hide() thành đề xuất .css('visible', 'hidden') của bạn. Tôi nghi ngờ rằng tôi cũng cần thay đổi số .show() thành .css('visibility', 'visible'). Cảm ơn. – vitorhsb

+0

Thay vì làm tất cả công việc đó. Sau đó, bạn có thể áp dụng 'visible: hidden' và sau đó là' .show() 'và sau đó đo chiều rộng. Sau khi bạn đã đo nó, đảo ngược điều đó. Sau đó, bạn không phải thay đổi quá nhiều. Các đối tượng vẫn ảnh hưởng đến trang khi chúng bị ẩn bởi 'visible: hidden' - hãy cẩn thận về điều đó. –

2

Bạn có thể xóa các số không bằng một cụm từ thông dụng và sau đó chỉ chuyển đổi thành một số. Tính năng này hoạt động bất kể bạn xác định chiều rộng như thế nào (px, em, %, pt). Bảo tồn các điểm thập phân quá.

vani javascript

Number(elem.style.width.replace(/[^\d\.\-]/g, '')); 

jQuery

Number($elem.css('width').replace(/[^\d\.\-]/g, '')); 
0

Trong đồng bằng JavaScript:

parseInt('100px', 10) 

trình với "100em", "100%", và ngay cả với : "100". Không cần bất kỳ mẫu biểu thức chính quy nào.

Các vấn đề liên quan