I found this thread — How do you stretch an image to fill a <div> while keeping the image's aspect-ratio? — that is not entirely the thing that I want.
I have a div with a certain size and an image inside of it. I want to always fill-out the div with the image regardless if the image is landscape or portrait. And it doesn't matter if the image is cut-off (the div itself has overflow hidden).
So if the image is portrait I want the width
to be 100%
and the height:auto
so it stays in proportion. If the image is landscape I want the height
to be 100%
and the width to be
auto`. Sounds complicated right?
<div class="container">
<img src="some-image.jpg" alt="Could be portrait or landscape"/>
</div>
Since I don't know how to do it I simply created a quick image of what I mean. I can't even properly describe it.
So, I guess I'm not the first one asking this. However I couldn't really find a solution to this. Maybe there is some new CSS3 way of doing this - I'm thinking of flex-box. Any idea? Maybe it's even easier than I expect it to be?
The CSS
object-fit: cover
andobject-position: left center
property values now address this issue.Here you have my working example. I have used a trick that is setting the image as background of the div container with background-size:cover and background-position:center center
I have placed the image with width:100% and opacity:0 making it invisible. Note that I am showing my image only because I have an special interest on calling the child click event.
Please note that altought I am ussing angular it is completely irrelevant.
The result is the one that you define as optimal in all cases
An old question but deserves an update as now there is a way.
The correct CSS based answer is to use
object-fit: cover
, which works likebackground-size: cover
. Positioning would be taken care of byobject-position
attribute, which defaults to centering.But there is no support for it in any IE / Edge browsers, or Android < 4.4.4. Also,
object-position
is not supported by Safari, iOS or OSX. Polyfills do exist, object-fit-images seems to give best support.For more details on how the property works, see CSS Tricks article on
object-fit
for explanation and demo.All answers below have fixed width and height, which makes solution "not responsive".
To achieve the result but keep image responsive I used following:
HTML:
You can achieve this using css flex properties. Please see the code below
If I correctly understand what you want, you may leave the width and height attributes off the image to maintain aspect ratio and use flexbox to do the centering for you.
JSFiddle here
I tested this successfully in IE9, Chrome 31, and Opera 18. But no other browsers were tested. As always you must consider your particular support requirements.