Сохранить соотношение сторон div, содержащего изображение во flexbox - PullRequest
2 голосов
/ 22 марта 2019

У меня есть несколько изображений, разделенных на две строки шириной, которые растут и уменьшаются вместе с контейнером при изменении размера окна браузера.

Однако изображения могут иметь любое соотношение сторон, и я должен ограничить ихв ширину 80: соотношение высоты 53.Я почти целый день пробовал разные вещи, но безрезультатно.Как мне достичь этого?

body {
  background-color: #666;
  display: flex;
  justify-content: center;
}

.container {
  background-color: white;
  display: flex;
  flex-wrap: wrap;
  width: 90%;
}

.img-box {
  flex-basis: 50%;
}

img {
  display: block;
  width: 100%;
}
<!DOCTYPE html>
<html>
  <head>
    <title>Parcel Sandbox</title>
    <meta charset="UTF-8" />
    <link rel="stylesheet" href="./src/styles.css" />
  </head>

  <body>
    <div class="container">
      <div class="img-box">
        <img
          src="https://images.unsplash.com/photo-1553155905-b94ab6f10bc8?ixlib=rb-1.2.1&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=400&fit=max&ixid=eyJhcHBfaWQiOjU1Nzk4fQ"
        />
      </div>
      <div class="img-box">
        <img
          src="https://images.unsplash.com/photo-1553174975-8b6c0a0d8fc9?ixlib=rb-1.2.1&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=400&fit=max&ixid=eyJhcHBfaWQiOjU1Nzk4fQ"
        />
      </div>
      <div class="img-box">
        <img
          src="https://images.unsplash.com/photo-1553155905-b94ab6f10bc8?ixlib=rb-1.2.1&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=400&fit=max&ixid=eyJhcHBfaWQiOjU1Nzk4fQ"
        />
      </div>
      <div class="img-box">
        <img
          src="https://images.unsplash.com/photo-1553155905-b94ab6f10bc8?ixlib=rb-1.2.1&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=400&fit=max&ixid=eyJhcHBfaWQiOjU1Nzk4fQ"
        />
      </div>
      <div class="img-box">
        <img
          src="https://images.unsplash.com/photo-1553174975-8b6c0a0d8fc9?ixlib=rb-1.2.1&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=400&fit=max&ixid=eyJhcHBfaWQiOjU1Nzk4fQ"
        />
      </div>
      <div class="img-box">
        <img
          src="https://images.unsplash.com/photo-1553155905-b94ab6f10bc8?ixlib=rb-1.2.1&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=400&fit=max&ixid=eyJhcHBfaWQiOjU1Nzk4fQ"
        />
      </div>
      <div class="img-box">
        <img
          src="https://images.unsplash.com/photo-1553155905-b94ab6f10bc8?ixlib=rb-1.2.1&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=400&fit=max&ixid=eyJhcHBfaWQiOjU1Nzk4fQ"
        />
      </div>
      <div class="img-box">
        <img
          src="https://images.unsplash.com/photo-1553155905-b94ab6f10bc8?ixlib=rb-1.2.1&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=400&fit=max&ixid=eyJhcHBfaWQiOjU1Nzk4fQ"
        />
      </div>
    </div>

    <script src="src/index.js"></script>
  </body>
</html>

Коды и поле: https://codesandbox.io/s/8x3qjompz9

Идеальный результат:

enter image description here

1 Ответ

1 голос
/ 23 марта 2019

Ого, мне наконец-то удалось понять, что объясняется в этой статье .Контейнер теперь изменяет размеры с помощью flex-элементов внутри, изменяя размеры вместе с ним, сохраняя соотношение сторон.

В итоге уловка была в том, чтобы установить padding-top: 30% в элементах div, которые содержат изображения, которые действуют как 'высота ", а затем дает им position: relative.Это дало мне возможность дать ребенку (теперь оттесненному верхом) position: absolute и поставить его на место в позиции top:0; left:0.

Причина, по которой мне пришлось использовать padding-top вместо height потому, что высота вычисляется из родительского элемента, когда мы хотим получить высоту, которая рассчитывается по ширине элемента.И padding-top с использованием процентов рассчитывается на основе ширины элемента.

body {
  background-color: #666;
  display: flex;
  justify-content: center;
}

.container {
  background-color: white;
  display: flex;
  flex-wrap: wrap;
  width: 90%;
}

.img-box {
  box-sizing: border-box;
  border: 2px solid cyan;
  flex-basis: 50%;
  padding-top: 30%;
  position: relative;
  overflow: hidden;
}

img {
  display: block;
  width: 100%;
  height: 100%;
  position: absolute;
  top: 0;
  left: 0;
  object-fit: cover;
  object-position: 50% 50%;
}
<!DOCTYPE html>
<html>
  <head>
    <title>Parcel Sandbox</title>
    <meta charset="UTF-8" />
    <link rel="stylesheet" href="./src/styles.css" />
  </head>

  <body>
    <div class="container">
      <div class="img-box">
        <img
          src="https://images.unsplash.com/photo-1553155905-b94ab6f10bc8?ixlib=rb-1.2.1&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=400&fit=max&ixid=eyJhcHBfaWQiOjU1Nzk4fQ"
        />
      </div>
      <div class="img-box">
        <img
          src="https://images.unsplash.com/photo-1553174975-8b6c0a0d8fc9?ixlib=rb-1.2.1&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=400&fit=max&ixid=eyJhcHBfaWQiOjU1Nzk4fQ"
        />
      </div>
      <div class="img-box">
        <img
          src="https://images.unsplash.com/photo-1553155905-b94ab6f10bc8?ixlib=rb-1.2.1&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=400&fit=max&ixid=eyJhcHBfaWQiOjU1Nzk4fQ"
        />
      </div>
      <div class="img-box">
        <img
          src="https://images.unsplash.com/photo-1553155905-b94ab6f10bc8?ixlib=rb-1.2.1&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=400&fit=max&ixid=eyJhcHBfaWQiOjU1Nzk4fQ"
        />
      </div>
      <div class="img-box">
        <img
          src="https://images.unsplash.com/photo-1553174975-8b6c0a0d8fc9?ixlib=rb-1.2.1&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=400&fit=max&ixid=eyJhcHBfaWQiOjU1Nzk4fQ"
        />
      </div>
      <div class="img-box">
        <img
          src="https://images.unsplash.com/photo-1553155905-b94ab6f10bc8?ixlib=rb-1.2.1&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=400&fit=max&ixid=eyJhcHBfaWQiOjU1Nzk4fQ"
        />
      </div>
      <div class="img-box">
        <img
          src="https://images.unsplash.com/photo-1553155905-b94ab6f10bc8?ixlib=rb-1.2.1&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=400&fit=max&ixid=eyJhcHBfaWQiOjU1Nzk4fQ"
        />
      </div>
      <div class="img-box">
        <img
          src="https://images.unsplash.com/photo-1553155905-b94ab6f10bc8?ixlib=rb-1.2.1&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=400&fit=max&ixid=eyJhcHBfaWQiOjU1Nzk4fQ"
        />
      </div>
    </div>

    <script src="src/index.js"></script>
  </body>
</html>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...