2014-12-16 22 views
5

Cân nhắc HTML sau (JSFiddle link):Tại sao getBoundingClientRect chỉ hoạt động cục bộ?

<div id="a" class="box">cat</div> 
<div id="b" class="box rotate">cat</div> 
<div id="c" class="box"><div class="rotate">cat</div></div> 

và CSS:

.box { font-size:500%; } 
.rotate { transform: rotate(-90deg); } 

đo chiều rộng và chiều cao của nguyên tố id=a sử dụng .getBoundingClientRect()

$(a)[0].getBoundingClientRect().width 
$(a)[0].getBoundingClientRect().height 

cho kích thước của (320,91). Đo cùng một thứ trên phần tử id=b cho các kích thước được chuyển đổi (91,320). Tuyệt vời.

Tuy nhiên, khi tôi cố gắng đo yếu tố id=c chỉ đơn giản là tổ chức vòng quay bên trong div bên trong, tôi nhận được kích thước ban đầu (320,91)! Các hộp giới hạn cho bc có giống nhau hay không?

Nếu không, làm thế nào tôi có thể nhận được hộp giới hạn c để báo cáo chính xác?


Nếu có liên quan, tôi đang sử dụng Chromium, Phiên bản 37.0.2062.120 Ubuntu 12.04 (281580) (64-bit).

+0

'$ (a) [0] .getBoundingClientRect()' là một cách thực sự xoay vòng để viết 'a.getBoundingClientRect()'. Nếu bạn định dựa vào các hình cầu tự động, bạn cũng có thể sử dụng chúng. :-) –

+0

@ T.J.Crowder Cảm ơn bạn đã tip! Đây là nỗ lực của tôi tại một ví dụ làm việc tối thiểu từ một dự án lớn hơn mà tôi đang làm việc. Tôi rất thành thạo trong thiết kế web và tôi thường dựa vào JQuery để nâng những thứ mà tôi đang học có thể được thực hiện với độ chi tiết ít hơn. – Hooked

+0

@Hooked: Trong trường hợp này, phiên bản jQuery sẽ là '$ (" # a ") [0] .getBoundingClientRect();' Tôi không thể tự mình dựa vào những hình cầu tự động đó. :-) –

Trả lời

4

Không, bit được xoay trong phạm vi c kéo dài ra khỏi c mà không thay đổi kích thước của nó. Điều này sẽ làm cho nó một chút rõ ràng hơn:.

var bbox_a = document.getElementById("a").getBoundingClientRect(); 
 
snippet.log("a: " + bbox_a.width + "x" + bbox_a.height); 
 

 
var bbox_b = document.getElementById("b").getBoundingClientRect(); 
 
snippet.log("b: " + bbox_b.width + "x" + bbox_b.height); 
 

 
var bbox_c = document.getElementById("c").getBoundingClientRect(); 
 
snippet.log("c: " + bbox_c.width + "x" + bbox_c.height);
.box { 
 
    font-size:500%; 
 
} 
 
.rotate { 
 
    transform: rotate(-90deg); 
 
} 
 
#a { 
 
    border: 1px solid black; 
 
} 
 
#b { 
 
    border: 1px solid red; 
 
} 
 
#c { 
 
    border: 1px solid green; 
 
} 
 
#c .rotate { 
 
    border: 2px solid yellow; 
 
}
<div id="a" class="box">cat</div> 
 
<div id="b" class="box rotate">cat</div> 
 
<div id="c" class="box"> 
 
    <div class="rotate">cat</div> 
 
</div> 
 
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 --> 
 
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

(tôi loại bỏ sự phụ thuộc vào globals tự động a, bc trên Nó chỉ khiến tôi bồn chồn dựa vào globals tự động, họ Để dễ dàng bị che khuất.)

BTW, bạn có thể hình dung những thứ như thế này bằng công cụ dev của Chromium: Nhấp chuột phải vào phần tử và chọn "Kiểm tra phần tử" và nó sẽ mở bảng điều khiển Yếu tố trong các công cụ dev. Tại thời điểm đó, khi con trỏ của bạn vượt quá đánh dấu cho phần tử trong bảng điều khiển của phần tử, công cụ dev sẽ làm nổi bật phần tử đó (bao gồm cả hộp giới hạn của nó) trên trang.

+0

Được rồi, tôi thấy hộp màu xanh là gì "c" đang báo cáo là. Làm thế nào sau đó, tôi có thể nhận được "hiệu quả" bounding hộp c? – Hooked

+0

@Hooked: Tôi vừa cập nhật câu trả lời để hiển thị bit được xoay trong 'c' rõ ràng hơn. Trả lời câu hỏi của bạn ở trên, điều duy nhất mà bạn nghĩ đến là liên kết hộp '# c' và hộp' #c .rotate' (nhưng biến đổi-fu của tôi yếu). –

+0

Vì vậy, bạn đang gợi ý một nguồn gốc đệ quy vào tất cả các đối tượng trẻ em để tìm liên minh? Tôi nghĩ rằng tôi có thể làm điều đó - tôi đoán tôi đã nghĩ rằng điều này có thể đã được tích hợp sẵn. – Hooked

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