Get Element Dimensions After CSS Transform
I've been playing a lot with meta viewports recently due to seeing many HTML5 TV apps coded explicitly for 1280x720 which you'll see on many HD televisions. We all know that it's a much better practice to use responsive design than hardcode dimensions but, that aside, meta viewports are meant to do the scaling. So it's CSS transforms, specifically scale()
, to the rescue.
In creating a meta viewport shim, I needed to calculate an element's dimensions after it had been scaled. Properties like clientWidth
and innerWidth
will return the element's original width, ignoring the transform. To get the scaled size you must use getBoundingClientRect
:
var originalWidth = myElement.innerWidth; // 1280 var originalHeight = myElement.innerHeight; // 720 originalElement.style.transform = 'scale(1.5)'; console.log(originalElement.getBoundingClientRect()); /* ClientRect { bottom: 1080 height: 1080 left: 0 right: 1920 top: 0 width: 1920 } */
The example above sets the scale and returns different desired height and width dimensions based on the scale. getBoundingClientRect
returns more than just height and width by position coordinates as well.
I was worried I wouldn't be able to accomplish this feat but getBoundingClientRect
was the perfect solution!
Hello, David,
I want to remind you, that only Gecko is adding
height
andwidth
as can be read in the note at https://developer.mozilla.org/en-US/docs/Web/API/Element/getBoundingClientRect#Return_value.Compare it to MSDN: https://msdn.microsoft.com/en-us/library/ms536433%28VS.85%29.aspx
So your solution is not cross-browser-compatible.
I’d look for whether jQuery can solve it and then inspect their solution ;-)
Chrome is also providing
width
andheight
This is a good solution but it has limited application. I guess we need to work a bit more on looking for answers that may be applied to multiple scenarios instead of specific ones.
This might be a very simple question but wondered if you could help.
Is it possible to calculate the scale factor based on the height and width of an element, I think its the math I’m struggling with.
If I know my element is 1280 x 720 to begin with …
… and after scaling the element I know the dimensions are: 1920 x 1080
How do I calculate the scale (1.5)?
Dan, it’s just “1920 / 1280 = 1.5”, or “1080 / 720 = 1.5”. The scale is just the ratio between the height of one to the height of the other, or the width of one to the width of the other.