Given a set of different images with different ratios but all having a side (either height or width) of 400px, I wish I could control how much elements per row could be seen, or, said differently, control the moment when the browser would rather shrink elements, rather than keeping growing them.
Constraints:
- The image shown are totally random images, not knowing in advance their size/ratio.
- There should be no visible space between images.
- Solution should preferably be in CSS and portable.
- The images must be displayed in order, from left to right, columns (
column-count: x
) don't make this possible (AFAIK).
My markup is the following:
#images {
flex-flow: row wrap;
display: flex;
}
#images a {
flex: auto;
}
#images img {
object-fit: cover;
width: 100%;
height: 100%;
vertical-align: middle;
max-width: 100%;
}
<!DOCTYPE html>
<html>
<body>
<h1>Gallery of different sized images</h1>
<section id="images">
<a href="https://placekitten.com/"><img src="https://placekitten.com/400/315" alt="kitty"></a>
<a href="https://placekitten.com/"><img src="https://placekitten.com/400/156" alt="kitty"></a>
<a href="https://placekitten.com/"><img src="https://placekitten.com/400/305" alt="kitty"></a>
<a href="https://placekitten.com/"><img src="https://placekitten.com/331/400" alt="kitty"></a>
<a href="https://placekitten.com/"><img src="https://placekitten.com/291/400" alt="kitty"></a>
<a href="https://placekitten.com/"><img src="https://placekitten.com/400/244" alt="kitty"></a>
<a href="https://placekitten.com/"><img src="https://placekitten.com/295/400" alt="kitty"></a>
<a href="https://placekitten.com/"><img src="https://placekitten.com/400/203" alt="kitty"></a>
<a href="https://placekitten.com/"><img src="https://placekitten.com/255/400" alt="kitty"></a>
<a href="https://placekitten.com/"><img src="https://placekitten.com/304/400" alt="kitty"></a>
<a href="https://placekitten.com/"><img src="https://placekitten.com/400/321" alt="kitty"></a>
<a href="https://placekitten.com/"><img src="https://placekitten.com/375/400" alt="kitty"></a>
<a href="https://placekitten.com/"><img src="https://placekitten.com/249/400" alt="kitty"></a>
<a href="https://placekitten.com/"><img src="https://placekitten.com/272/400" alt="kitty"></a>
<a href="https://placekitten.com/"><img src="https://placekitten.com/400/400" alt="kitty"></a>
<a href="https://placekitten.com/"><img src="https://placekitten.com/400/199" alt="kitty"></a>
<a href="https://placekitten.com/"><img src="https://placekitten.com/400/211" alt="kitty"></a>
<a href="https://placekitten.com/"><img src="https://placekitten.com/295/400" alt="kitty"></a>
<a href="https://placekitten.com/"><img src="https://placekitten.com/400/329" alt="kitty"></a>
<a href="https://placekitten.com/"><img src="https://placekitten.com/400/287" alt="kitty"></a>
<a href="https://placekitten.com/"><img src="https://placekitten.com/400/237" alt="kitty"></a>
<a href="https://placekitten.com/"><img src="https://placekitten.com/214/400" alt="kitty"></a>
<a href="https://placekitten.com/"><img src="https://placekitten.com/263/400" alt="kitty"></a>
<a href="https://placekitten.com/"><img src="https://placekitten.com/400/373" alt="kitty"></a>
<a href="https://placekitten.com/"><img src="https://placekitten.com/388/400" alt="kitty"></a>
<a href="https://placekitten.com/"><img src="https://placekitten.com/400/312" alt="kitty"></a>
<a href="https://placekitten.com/"><img src="https://placekitten.com/282/400" alt="kitty"></a>
<a href="https://placekitten.com/"><img src="https://placekitten.com/400/300" alt="kitty"></a>
<a href="https://placekitten.com/"><img src="https://placekitten.com/400/400" alt="kitty"></a>
<a href="https://placekitten.com/"><img src="https://placekitten.com/180/400" alt="kitty"></a>
<a href="https://placekitten.com/"><img src="https://placekitten.com/165/400" alt="kitty"></a>
<a href="https://placekitten.com/"><img src="https://placekitten.com/400/350" alt="kitty"></a>
<a href="https://placekitten.com/"><img src="https://placekitten.com/380/400" alt="kitty"></a>
<a href="https://placekitten.com/"><img src="https://placekitten.com/400/301" alt="kitty"></a>
<a href="https://placekitten.com/"><img src="https://placekitten.com/281/400" alt="kitty"></a>
</section>
</body>
</html>
Rendering is currently great for small width: ~300px width window:
When the size is bigger, e.g. ~800px width, the first image is enlarged a lot, almost 2x:
The browser only starts putting 2 elements on a same row when reaching ~840px width:
I wish to trigger this flex-rearrangement sooner so that images gets enlarged as less as possible (I even wish I could use flex: 0 1 auto
to only allow shrinking and no growing).
The only solution I found so far, but looks hacky and do not work on Firefox, is to change the zoom factor, setting for example: zoom: 0.7
on #images
. This gives a desired result:
[
Any clean and portable CSS solution that exists?