2011-08-29 28 views
5

Tôi cố gắng lấy chiều rộng của một phần tử theo các quy tắc CSS của nó Vấn đề là "getComputedStyle" trả về giá trị pixel thay vì "tự động" cho một phần tử không có giá trị độ rộng CSS. Trong Opera, "elem.currentStyle ['width']" trả về "tự động", nhưng trong firefox, nó phải sử dụng "getComputedStyle" trả về một cái gì đó như "1149px".Vấn đề Firefox với currentStyle vs getComputedStyle

Điều quan trọng là tôi phải biết quy tắc CSS thực sự là gì. Có cách nào để làm điều này bên cạnh việc bên cạnh getComputedStyle? The Firefox MDN làm cho nó rõ ràng "getComputedStyle" không phải là con đường để đi, nhưng tôi không thể tìm thấy bất kỳ tài liệu cho một Firefox tương đương với "currentStyle".

Nếu bạn muốn biết, mục tiêu cuối cùng của tôi là tìm phần tử chiều rộng tĩnh lớn nhất trên trang. Nếu tôi không thể đọc giá trị biểu định kiểu - chỉ các giá trị được hiển thị/tính toán - thì làm cách nào để tôi có thể đạt được điều này?

Trả lời

4

Nếu bạn bắt đầu với một phần tử, không có cách nào để biết quy tắc biểu định kiểu nào được áp dụng cho nó. getComputedStyle() chỉ cung cấp cho bạn giá trị kiểu hiệu quả và currentStyle không có nhiều khác biệt mặc dù nó sẽ cho bạn kết quả bạn mong đợi trong trường hợp cụ thể này và trình duyệt cụ thể này.

Điều bạn có thể cần làm là đi qua bảng định kiểu thay thế. Dọc theo dòng:

for (var i = 0; i < document.styleSheets.length; i++) 
{ 
    var styleSheet = document.styleSheets[i]; 
    for (var j = 0; j < styleSheet.cssRules.length; j++) 
    { 
    var rule = styleSheet.cssRules[j]; 
    if (rule.type == 1) // STYLE_RULE 
    { 
     // Do something with rule.style.width 
    } 
    } 
} 

Nếu sau đó bạn cần phải xác định vị trí các yếu tố phù hợp mà cai trị, bạn có thể sử dụng document.querySelectorAll() với rule.selectorText. Vấn đề còn lại là nhiều quy tắc kiểu có thể áp dụng cho cùng một phần tử và tính đặc trưng của quy tắc cần phải được tính toán. Tuy nhiên, không chắc chắn đây là vấn đề với bạn.

Tài liệu bổ sung:

+1

Tôi đã hy vọng để tránh đi xe đạp thông qua các stylesheets, vì điều này có thể cồng kềnh từ một quan điểm hiệu suất, nhưng tôi nghĩ rằng với một số trực giác tôi có thể thực hiện công việc này. – rburgenson

+1

P.S. bạn sẽ biết một cách nhanh chóng để tìm một quy tắc css (không có jquery) theo tên lớp, mà không đi xe đạp thông qua các bảng định kiểu tìm kiếm "className = 'bất cứ điều gì'"? Tức là, có một "document.getCSSRuleByClass()" hoặc một cái gì đó như vậy? – rburgenson

+0

Không, tôi không nghĩ có bất cứ điều gì như thế. –

0

nếu bạn chỉ muốn có được chiều của phần tử, tại sao không sử dụng

element.clientWidth hay element.clientHeight

các getcomputestyle không được thiết kế để lấy chiều rộng hoặc chiều cao của phần tử

+1

Các OP muốn tìm nếu một yếu tố đã được xác định chiều rộng, không chỉ có chiều rộng tính. –

1

Thật không may, như xa như tôi biết không có cách thực tế để đạt được điều này.

Chỉnh sửa: Câu trả lời ở trên lặp qua các tờ định kiểu là đặt cược tốt nhất của bạn. Ban đầu tôi nghĩ đến việc truy cập bảng định kiểu nhưng không nghĩ đến việc sử dụng querySelectorAll. Đội mũ Wladimir cho một giải pháp thiên tài.

-

Giải pháp duy nhất tôi có thể nghĩ đến là cho các yếu tố bạn đang thiết có chiều rộng tới, cũng thiết lập một số phong cách sử dụng khác thường khác để cái gì đó sẽ không thực sự ảnh hưởng đến bất cứ điều gì, vì vậy bạn có thể kiểm tra cho điều đó.

div { 
    width: 35px; 
    min-width: 1px; /* the flag */ 
    } 

Vì vậy, sau đó khi tìm kiếm các yếu tố có chiều rộng chỉ định, bạn có thể tìm kiếm [ComputedStyle] .minWidth == '1px' đầu tiên.

Khá một giải pháp hacky nhưng nó sẽ hoàn thành công việc.

Bạn cũng có thể đặt tên lớp ngẫu nhiên cho các phần tử có chiều rộng đã đặt, sau đó tất cả những gì bạn phải làm là truy vấn cho các phần tử có tên lớp đó. Mặc dù nó không phải là một giải pháp rất năng động.

+0

Đó là một ý tưởng hay, nhưng chắc chắn là hacky. Tôi nghĩ rằng Wladimir đề xuất lặp đi lặp lại thông qua các stylesheets là sạch hơn một chút – rburgenson

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