0

I try to build a grid image galery like the one you can find on AirBnb web site. But I would like do it on a row not column.

I could perfectly reproduce the grid in column but when I try to make it fit in a row (100% of container) my images don't keep their ratio.

This question was closed 2 days ago with reference to this question here but like Airbnb, my grid is fully dynamic I do not know in advance what kind of images will be display ( portrait, landscape) and their order.

As each gridPart container could have 3 images maximum, I could predetermine four templates that could be see in the snippet below. The way I will determine the display will be perform using some javascript by counting the number of portrait and landscape in set of three images.

.container {
  max-width: 800px;
  margin: 0 auto;
}

.grid {
  display: grid !important;
  gap: 8px !important;
  grid-auto-columns: 1fr !important;
  grid-template-rows: 1fr !important;
}

.gridPart {
  display: grid !important;
  gap: 8px !important;
  grid-auto-columns: 1fr !important;
  grid-auto-rows: 1fr !important;
}

.imgWrapper {
  height: 100%;
  position: relative;
  width: 100%;
}

.imgWrapper img {
  position: absolute;
  top: 0;
  color: white;
  width: 100%;
  vertical-align: bottom;
  max-width: 100% !important;
}
<div class="container">
  <div class="grid">
    <div class="gridPart" style="grid-area: 1 / 1 / auto/ auto">
      <div style="grid-area: 1 / 1 / span 2 / 2;border:solid green 1px;">
        <div class="imgWrapper">
          <div style="padding-bottom:142.857142857142857%"></div>
          <img src="http://placekitten.com/g/140/200" />
        </div>
      </div>
      <div style="grid-area: 1 / 2 / 1 / 2;border:solid orange 1px;">
        <div class="imgWrapper">
          <div style="padding-bottom:70%"></div>
          <img src="http://placekitten.com/g/200/140" />
        </div>
      </div>
      <div style="grid-area: 2 / 2 / auto / auto;border:solid violet 1px;">
        <div class="imgWrapper">
          <div style="padding-bottom:70%"></div>
          <img src="http://placekitten.com/g/200/140" />
        </div>
      </div>
    </div>
    <div class="gridPart" style="grid-area: 1 / 2 / auto/ auto">
      <div style="grid-area: 1 / 1 / 1 / 1;border:solid green 1px;">
        <div class="imgWrapper">
          <div style="padding-bottom:142.857142857142857%"></div>
          <img src="http://placekitten.com/g/140/200" />
        </div>
      </div>
      <div style="grid-area: 1 / 2 / 1 / 3;border:solid orange 1px;">
        <div class="imgWrapper">
          <div style="padding-bottom:70%"></div>
          <img src="http://placekitten.com/g/140/200" />
        </div>
      </div>
      <div style="grid-area: 1 / 3 / 1 / 4;border:solid violet 1px;">
        <div class="imgWrapper">
          <div style="padding-bottom:70%"></div>
          <img src="http://placekitten.com/g/140/200" />
        </div>
      </div>
    </div>
    <div class="gridPart" style="grid-area: 1 / 3 / auto/ auto">
      <div style="grid-area: 1 / 1 / span 1 / 2;border:solid green 1px;">
        <div class="imgWrapper">
          <div style="padding-bottom:142.857142857142857%"></div>
          <img src="http://placekitten.com/g/140/200" />
        </div>
      </div>
      <div style="grid-area: 1 / 2 / span 1 / 2;border:solid orange 1px;">
        <div class="imgWrapper">
          <div style="padding-bottom:142.857142857142857%"></div>
          <img src="http://placekitten.com/g/140/200" />
        </div>
      </div>
      <div style="grid-area: 2 / span 2 / auto / auto;border:solid violet 1px;">
        <div class="imgWrapper">
          <div style="padding-bottom:70%"></div>
          <img src="http://placekitten.com/g/200/140" />
        </div>
      </div>
    </div>
    <div class="gridPart" style="grid-area: 1 / 4 / auto/ auto">
      <div style="grid-area: 1 / 1 / 1 / 1;border:solid green 1px;">
        <div class="imgWrapper">
          <div style="padding-bottom:70%"></div>
          <img src="http://placekitten.com/g/200/140" />
        </div>
      </div>
      <div style="grid-area: 2 / 1 / 2 / 1;border:solid orange 1px;">
        <div class="imgWrapper">
          <div style="padding-bottom:70%"></div>
          <img src="http://placekitten.com/g/200/140" />
        </div>
      </div>
      <div style="grid-area: 3 / 1 / 3 / 1;border:solid violet 1px;">
        <div class="imgWrapper">
          <div style="padding-bottom:70%"></div>
          <img src="http://placekitten.com/g/200/140" />
        </div>
      </div>
    </div>
  </div>
</div>

expected enter image description here

akio
  • 851
  • 9
  • 29

1 Answers1

0

.container {
      max-width: 800px;
      margin: 0 auto;
    }
  
    .grid {
      display: grid !important;
      gap: 8px !important;
      grid-auto-columns: 1fr !important;
      grid-template-rows: 1fr !important;
      height: 450px;
    }
  
    .gridPart {
      display: grid !important;
      gap: 8px !important;
      grid-auto-columns: 1fr !important;
      grid-auto-rows: 1fr !important;
    }
  
    .imgWrapper {
      height: 100%;
      position: relative;
      width: 100%;
    }
  
    .imgWrapper img {
      position: absolute;
      top: 0;
      left: 0; /* Align the image to the top-left corner */
      width: 100%;
      height: 100%;
      object-fit: cover; /* Make the image cover the entire container */
    }
  <div class="container">
    <div class="grid">
      <div class="gridPart" style="grid-area: 1 / 1 / auto / auto">
        <div style="grid-area: 1 / 1 / span 2 / 2; border: solid green 1px;">
          <div class="imgWrapper">
            <img src="http://placekitten.com/g/140/200" />
          </div>
        </div>
        <div style="grid-area: 1 / 2 / 1 / 2; border: solid orange 1px;">
          <div class="imgWrapper">
            <img src="http://placekitten.com/g/200/140" />
          </div>
        </div>
        <div style="grid-area: 2 / 2 / auto / auto; border: solid violet 1px;">
          <div class="imgWrapper">
            <img src="http://placekitten.com/g/200/140" />
          </div>
        </div>
      </div>
      <div class="gridPart" style="grid-area: 1 / 2 / auto / auto">
        <div style="grid-area: 1 / 1 / 1 / 1; border: solid green 1px;">
          <div class="imgWrapper">
            <img src="http://placekitten.com/g/140/200" />
          </div>
        </div>
        <div style="grid-area: 1 / 2 / 1 / 3; border: solid orange 1px;">
          <div class="imgWrapper">
            <img src="http://placekitten.com/g/140/200" />
          </div>
        </div>
        <div style="grid-area: 1 / 3 / 1 / 4; border: solid violet 1px;">
          <div class="imgWrapper">
            <img src="http://placekitten.com/g/140/200" />
          </div>
        </div>
      </div>
      <div class="gridPart" style="grid-area: 1 / 3 / auto / auto">
        <div style="grid-area: 1 / 1 / span 1 / 2; border: solid green 1px;">
          <div class="imgWrapper">
            <img src="http://placekitten.com/g/140/200" />
          </div>
        </div>
        <div style="grid-area: 1 / 2 / span 1 / 2; border: solid orange 1px;">
          <div class="imgWrapper">
            <img src="http://placekitten.com/g/140/200" />
          </div>
        </div>
        <div style="grid-area: 2 / span 2 / auto / auto; border: solid violet 1px;">
          <div class="imgWrapper">
            <img src="http://placekitten.com/g/200/140" />
          </div>
        </div>
      </div>
      <div class="gridPart" style="grid-area: 1 / 4 / auto / auto">
        <div style="grid-area: 1 / 1 / 1 / 1; border: solid green 1px;">
          <div class="imgWrapper">
            <img src="http://placekitten.com/g/200/140" />
          </div>
        </div>
        <div style="grid-area: 2 / 1 / 2 / 1; border: solid orange 1px;">
          <div class="imgWrapper">
            <img src="http://placekitten.com/g/200/140" />
          </div>
        </div>
        <div style="grid-area: 3 / 1 / 3 / 1; border: solid violet 1px;">
          <div class="imgWrapper">
            <img src="http://placekitten.com/g/200/140" />
          </div>
        </div>
      </div>
    </div>
  </div>
  
  • Thank you but as you can see images are not conserving their original aspect ratio and are deformed – akio Jul 31 '23 at 12:53