As a webdeveloper you probably know how image/media behavior sucks regarding responsive webdesign. Some quick CSS fixes solve your issues usually:
img {
max-width: 100%;
height: auto;
}
But there is more than that. You may want to set an foreground image to fill its wrapping element, containing its intrinsic aspect-ratio and also want it to be repositioned always to center. Or, if you ever wanted to resize an iframe responsively in its initial aspect-ratio you might got into real trouble. Of course there are fixes for that kind of problem, too, but they all in all one can say:
Media resizing behavior is outta control!
Let's fix that
Yes, we're going to fix this now. There's a webstandard for it, it's the CSS property called object-fit
. With that you'll set an media-element's size like you've been able to set for background images via background-size
for a long time now. object-fit
can have the following values:
img {
/* Fills image into the parent element so it's fully covered. Contains aspect-ratio. */
object-fit: cover;
/* Fills image into the parent element so the img is fully shown. Can create letterboxes. */
object-fit: contain;
/* Fills image into the parent element so it's fully covered. Shrinks image, not respecting aspect-ratio. */
object-fit: fill;
}
But browser support is as following:
Browser | natively? |
---|---|
Internet Explorer | - |
Google Chrome | v31+ |
Firefox | v36+ |
Safari OS X | 7.1+ |
Safari iOS | 8+ |
Opera | v19+ |
Fix the browser support
As the browser support is not that good I wanted to have a interim solution. If you wanna depend on jQuery there also is a polyfill. The problem is, this polyfill isn't that performant as it calculates the image sizing live at runtime.
When I started to write a vanilla JavaScript polyfill I realized the very same problem. While the solution I chose kind of worked, it didn't please me. Fortunately, when I asked Christian Schaefer for a code review, he came up with a much smarter idea.
Christian rewrote the whole code to work with CSS classes that are applied via JavaScript depending on the current 'situation' / 'state' of the image in a container. Additionally we wrap an x-tag around the image element to be able to apply a CSS-only style solution. This way there's no need to constantly calculate sizes of the image to drastically improve the performance of the polyfill.
Well, enough said—check out the object-fit
Polyfill on GitHub.
It's also available via bower and npm. Simply enter the following into your command line:
npm install object-fit
or
bower install object-fit
And this will get you the polyfill as a component. By the way, there is no need for Modernizr. We have a neat and very small feature-test baked right into the polyfill.
Thanks to Christian for his great support and contributions!
-Anselm