2014-12-16 8 views
5

Betrachten wir die Folge HTML (JSFiddle link):Warum funktioniert getBoundingClientRect nur lokal?

<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> 

und CSS:

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

die Breite und Höhe des Elements Mess id=a mit .getBoundingClientRect()

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

die Dimensionen (320,91) gibt. Die gleiche Messung am Element id=b ergibt die transponierten Abmessungen (91,320). Wunderbar.

Wenn ich jedoch versuche, das Element id=c zu messen, das einfach die Drehung in einem inneren div nistet, bekomme ich die ursprünglichen Abmessungen (320,91)! Sollten die Bounding Boxes für b und c nicht gleich sein?

Wenn nicht, wie kann ich die Bounding Box von c korrekt melden?


Wenn relevant, ich bin mit Chromium, Version 37.0.2062.120 Ubuntu 12.04 (281580) (64-Bit).

+0

'$ (a) [0] .getBoundingClientRect()' ist eine wirklich umständliche Art, 'a.getBoundingClientRect()' zu schreiben. Wenn Sie sich auf die automatischen Globals verlassen wollen, können Sie sie auch verwenden. :-) –

+0

@ T.J.Crowder Danke für den Tipp! Dies war mein Versuch, ein minimales Arbeitsbeispiel von einem größeren Projekt, an dem ich gerade arbeite, zu versuchen. Ich bin sehr versiert im Webdesign und ich verlasse mich oft auf JQuery, um Dinge, die ich lerne, mit weniger Ausführlichkeit auszuführen. – Hooked

+0

@Hooked: In diesem Fall wäre die jQuery-Version '$ (" # a ") [0] .getBoundingClientRect();' Ich kann mich einfach nicht auf diese automatischen Globals verlassen. :-) –

Antwort

4

Nein, das rotierte Bit innerhalb c erstreckt sich aus c, ohne seine Größe zu ändern. Dadurch sollte es etwas klarer.

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>

(ich das Vertrauen auf die automatische Globals entfernt a, b und c oben Es macht einfach nervös mich auf automatische Globals zu verlassen, sie "So leicht beschattet."

BTW, können Sie Dinge wie diese mit den Chrom-Dev-Tools visualisieren: Klicken Sie mit der rechten Maustaste auf das Element und wählen Sie "Inspect element", und es öffnet das Bedienfeld Elemente in die Entwicklungswerkzeuge. Wenn sich der Cursor zu diesem Zeitpunkt über dem Markup für das Element im Bedienfeld des Elements befindet, markieren die Entwicklerwerkzeuge dieses Element (einschließlich seiner Begrenzungsbox) auf der Seite.

+0

In Ordnung, ich sehe, wie die grüne Box ist, was "c" meldet. Wie kann ich dann die "effektive" Bounding Box von c bekommen? – Hooked

+0

@Hooked: Ich habe gerade die Antwort aktualisiert, um das gedrehte Bit in 'c' deutlicher zu zeigen. Wenn Sie Ihre Frage oben stellen, ist das einzige, was Ihnen in den Sinn kommt, eine Vereinigung von '# c's Box und' #c .rotate's Box (aber mein transform-fu ist schwach). –

+0

Sie schlagen also einen rekursiven Abstieg in alle Kindobjekte vor, um die Vereinigung zu finden? Ich denke, dass ich das tun könnte - ich denke, dass ich dachte, dass dies schon etwas eingebautes wäre. – Hooked

Verwandte Themen