There are many questions on SO about maintaining the aspect ratio of an element (with or without flexbox ).
However, my problem is somewhat different, because I want to override the aspect ratio of the child image.
Make sure the image completely covers the element (
object-fit: cover)Make sure the element is 1: 1 (i.e. Ideal Circle)
Make sure the
overflowing image is hidden
In other words, the image should behave as if it were the background of the element (I cannot use them as background images), of which the aspect ratio is always 1: 1 and adaptive.
In the example below, everything works fine, except that the <a> elements adapt images to their descendants. But I want them to support the 1: 1 ratio in order to get perfect circles. (The middle of the first row should be more than the others).
HTML cannot change, but I can use modern CSS properties like object-fit and flexbox . (So far this is supported by the latest versions of Chrome / Firefox)
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } .img-gallery { background: #fafafa; padding: 24px; min-width: 320px; width: 90%; margin: 0 auto; } .img-gallery .row { display: flex; flex-wrap: nowrap; justify-content: space-around; align-items: center; } .img-gallery a { display: block; text-decoration: none; background-image: linear-gradient(60deg, #004494 0%, #7db9e8 78%, #c2dfed 100%); overflow: hidden; border-radius: 50%; padding: 3px; flex: 1; margin: 0 24px; transition: padding 200ms; } .img-gallery a:hover, #s_country .img-gallery .row:first-of-type a:nth-child(2):hover { padding: 0; } .img-gallery a:hover span { transform: scale(1.25); } .img-gallery .row:first-of-type a:not(:nth-child(2)) { width: 30%; width: calc((60% - 96px) / 2); } .img-gallery .row:first-of-type a:nth-child(2) { flex: 2; padding: 4px; } .img-gallery span { width: 100%; height: 100%; display: block; border-radius: 50%; position: relative; overflow: hidden; transition: transform 250ms; z-index: 2; } .img-gallery img { width: 100%; height: 100%; object-fit: cover; } .img-gallery span::before { content: ""; background-image: linear-gradient(60deg, transparent 48%, #ffc5e7 100%); width: 100%; height: 100%; position: absolute; z-index: 2; border-radius: 50%; opacity: .72; } <div class="img-gallery"> <div class="row"> <a href="#" title="Show large image"><span><img itemprop="image" src="https://s-media-cache-ak0.pinimg.com/originals/b3/9c/54/b39c54776074d07ee0b567826768730a.jpg" id="img-1-3"></span></a> <a href="#" title="Show large image"><span><img itemprop="image" src="https://s-media-cache-ak0.pinimg.com/originals/d6/df/51/d6df512a2f15f517767b4d82d2d97a4c.jpg" id="img-1-4"></span></a> <a href="#" title="Show large image"><span><img itemprop="image" src="https://s-media-cache-ak0.pinimg.com/originals/ec/a9/dd/eca9dd106a04cdbee399870252ef711f.jpg" id="img-1-5"></span></a> </div> <div class="row"> <a href="#" title="Show large image"><span><img itemprop="image" src="https://s-media-cache-ak0.pinimg.com/originals/7d/01/19/7d0119a2fec989e208f288326c7cad0f.jpg" id="img-1-6"></span></a> <a href="#" title="Show large image"><span><img itemprop="image" src="https://s-media-cache-ak0.pinimg.com/originals/d8/c3/32/d8c332d09b03673845b2e92a48816233.jpg" id="img-1-7"></span></a> <a href="#" title="Show large image"><span><img itemprop="image" src="https://s-media-cache-ak0.pinimg.com/originals/88/3b/dd/883bddab14168f5f0807fec021002d8d.jpg" id="img-1-8"></span></a> </div> <div class="row"> <a href="#" title="Show large image"><span><img itemprop="image" src="https://s-media-cache-ak0.pinimg.com/originals/8e/4f/bb/8e4fbb89b155d15521b80d1baf9290d1.jpg" id="img-1-9"></span></a> </div> </div> Code illustrating when Terry's code does not work: landscape pictures .
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } .img-gallery { background: #fafafa; padding: 24px; min-width: 320px; width: 90%; margin: 0 auto; } .img-gallery .row { display: flex; flex-wrap: nowrap; justify-content: space-around; align-items: center; } .img-gallery a { display: block; text-decoration: none; background-image: linear-gradient(60deg, #004494 0%, #7db9e8 78%, #c2dfed 100%); overflow: hidden; border-radius: 50%; padding: 3px; flex: 1; margin: 0 24px; transition: padding 200ms; } .img-gallery .row:first-of-type a:not(:nth-child(2)) { width: 30%; width: calc((60% - 96px) / 2); } .img-gallery .row:first-of-type a:nth-child(2) { flex: 2; padding: 4px; } .img-gallery span { height: 0; display: block; border-radius: 50%; position: relative; padding-bottom: 100%; overflow: hidden; transition: transform 250ms; z-index: 2; } .img-gallery img { width: 100%; object-fit: cover; transition: transform 250ms; } .img-gallery a:hover img { transform: scale(1.25); } .img-gallery span::before { content: ""; background-image: linear-gradient(60deg, transparent 48%, #ffc5e7 100%); width: 100%; height: 100%; position: absolute; z-index: 2; border-radius: 50%; opacity: .72; } <div class="img-gallery"> <div class="row"> <a href="#" title="Show large image"><span><img itemprop="image" src="https://s-media-cache-ak0.pinimg.com/originals/b3/9c/54/b39c54776074d07ee0b567826768730a.jpg" id="img-1-3"></span></a> <a href="#" title="Show large image"><span><img itemprop="image" src="https://s-media-cache-ak0.pinimg.com/originals/d6/df/51/d6df512a2f15f517767b4d82d2d97a4c.jpg" id="img-1-4"></span></a> <a href="#" title="Show large image"><span><img itemprop="image" src="https://s-media-cache-ak0.pinimg.com/originals/ec/a9/dd/eca9dd106a04cdbee399870252ef711f.jpg" id="img-1-5"></span></a> </div> <div class="row"> <a href="#" title="Show large image"><span><img itemprop="image" src="https://s-media-cache-ak0.pinimg.com/originals/7d/01/19/7d0119a2fec989e208f288326c7cad0f.jpg" id="img-1-6"></span></a> <a href="#" title="Show large image"><span><img itemprop="image" src="https://s-media-cache-ak0.pinimg.com/originals/d8/c3/32/d8c332d09b03673845b2e92a48816233.jpg" id="img-1-7"></span></a> <a href="#" title="Show large image"><span><img itemprop="image" src="https://s-media-cache-ak0.pinimg.com/originals/13/7c/3d/137c3d3bd9f25aa9d2677136d9336d74.jpg" id="img-1-8"></span></a> </div> <div class="row"> <a href="#" title="Show large image"><span><img itemprop="image" src="https://s-media-cache-ak0.pinimg.com/originals/8e/4f/bb/8e4fbb89b155d15521b80d1baf9290d1.jpg" id="img-1-9"></span></a> </div> </div>