I need to set the zoom factor in an iframe. I knew exactly how much space should the embedded content fit into. And the scale needs to be adjustable. Here’s how I’d do it.
<div class="container">
<iframe
class="scaled-iframe"
src="https://example.com"
frameborder="0">
</iframe>
</div>
Container
The iframe has to be wrapped into a container div element, that can have any size. I set a css custom property on it, that can be changed with javascript later on.
.container {
--scale-factor: 0.5;
overflow: hidden;
/* props below are not mandatory */
width: 50%;
height: 500px;
border: 1px solid black;
}
The container’s width
and height
can be any reasonable value, the --scale-factor
should be a positive number around 1 (1 is 100%, zero does not make sense).
Since I’ll fit the iframe content to the container, I don’t need to show any possible overflows.
Iframe
The main trick is that in the iframe transform: scale
can change its contents’ size.
If I set width: 100%; height: 100%;
on the iframe to keep it fit into its container,
the scaling will change them as well.
I need to adjust the width and height of the iframe element so that it fits in its container.
I can calc
the necessary adjustments based on the custom property this way: calc(1/var(--scale-factor) * 100%)
.
.scaled-iframe {
transform: scale(var(--scale-factor));
width: calc(1/var(--scale-factor) * 100%);
height: calc(1/var(--scale-factor) * 100%);
}
In case I don’t want to fill the whole container, and I don’t like that it’s aligned to the middle,
I need to set the transform-origin
property to a different value.
E.g: 0 0;
will start to scale it up from the top left corner.
Browser support
As of now css variables are not supported in IE11, JS can be used instead of it.
Opera mini stays out of this game completely.
For up to date info check out caniuse.com: