Flexbox изменяет размер изображения в соответствии с высотой текста

РЕДАКТИРОВАТЬ: вот три скриншота, показывающие, чего я пытаюсь достичь:

введите здесь описание изображения

Таким образом, вы можете видеть масштаб фигурных скобок в соответствии с высотой содержимого, которая уменьшается по мере расширения браузера. Вышеупомянутое выполнимо с помощью Javascript (именно так я сделал скриншоты), но я надеялся, что к этому можно применить только CSS. (КОНЕЦ РЕДАКТИРОВАНИЯ)

У меня есть гибкий горизонтальный макет 1: 2: 1, где у меня есть изображение левой границы в div, затем некоторый текстовый контент в div, а затем изображение правой границы в div. Изображения границ обычно намного выше содержимого, и я пытаюсь уменьшить их, чтобы их высота всегда соответствовала высоте текстового содержимого.

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

.parent {
  display: flex;
  max-width: 800px;
}

.img {
  flex: 1;
}

.img>img {
  height: 100%;
}

.text {
  flex: 2;
}
<div class='parent'>
  <div class='img' style='text-align:right'>
    <img src="https://media.istockphoto.com/photos/stack-of-colorful-books-left-border-picture-id147704087">
  </div>
  <div class='text' style='text-align:center'>
    Hello<br />World!<br />How are you?
  </div>
  <div class='img' style='text-align:left'>
    <img src="https://media.istockphoto.com/photos/stack-of-colorful-books-left-border-picture-id147704087">
  </div>
</div>

Независимо от того, что я пробовал (большинство из них связано с отключением flex-grow или установкой высоты на 100% или автоматически, изображение всегда пытается увеличиваться, а не сжиматься, чтобы соответствовать содержимому, поэтому я получаю слишком большой размер границы.


person jhilgeman    schedule 13.03.2018    source источник
comment
вместо использования элементов img внутри div, возможно, используйте фоновые изображения css для пустых div?   -  person Reşit Körsu    schedule 13.03.2018
comment
Я не смог заставить фоновый подход работать правильно - можете ли вы опубликовать пример кода, основанный на том, что у меня есть?   -  person jhilgeman    schedule 13.03.2018
comment
Вы хотите решение flexbox или любое решение css будет в порядке?   -  person Amaury Hanser    schedule 13.03.2018
comment
Я был бы открыт для других решений css   -  person jhilgeman    schedule 13.03.2018
comment
Я знаю, что, вероятно, могу сделать это в JavaScript, но я пытаюсь оставить это в крайнем случае.   -  person jhilgeman    schedule 13.03.2018
comment
возможный дубликат stackoverflow.com /вопросы/48612601/   -  person Temani Afif    schedule 14.03.2018
comment
Почти дубликат, но нет. Решение заключается в изменении размера изображения обратно после того, как браузер станет достаточно узким, чтобы изображение достигло максимальной высоты.   -  person jhilgeman    schedule 14.03.2018
comment
Было бы хорошо узнать, поможет ли ответ, не стесняйтесь комментировать.   -  person Stickers    schedule 16.03.2018
comment
Мне пришлось временно прибегнуть к подходу Javascript из-за крайних сроков, но я планирую протестировать этот подход, как только у меня появится вакансия.   -  person jhilgeman    schedule 16.03.2018
comment
Нет проблем и не стесняйтесь комментировать.   -  person Stickers    schedule 21.03.2018


Ответы (2)


Я предлагаю сделать это с помощью flexbox + фоновых изображений.

  • Создайте макет из трех столбцов с помощью flexbox, в примере используются псевдоэлементы.
  • Используйте фоновые изображения для двух цитат, ключ background-size: auto 100%;

codepen

.quote {
  display: flex;
  max-width: 800px;
  margin: 30px auto;
}

.quote:before,
.quote:after {
  content: "";
  flex: 0 0 25%;
  background-repeat: no-repeat;
  background-size: auto 100%;
}

.quote:before {
  background-image: url("https://i.stack.imgur.com/yJDgT.png");
  background-position: right center;
}

.quote:after {
  background-image: url("https://i.stack.imgur.com/JGkT0.png");
  background-position: left center;
}

.quote .text {
  flex: 0 0 50%;
  text-align: center;
}
<div class="quote">
  <div class="text">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</div>
</div>

<div class="quote" style="max-width: 400px;">
  <div class="text">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</div>
</div>

Хотя вы по-прежнему можете использовать встроенные изображения, ключевым моментом является установка img на position: absolute;, чтобы контейнер мог вычислять высоту на основе текстового содержимого.

codepen

.quote {
  display: flex;
  max-width: 800px;
  margin: 30px auto;
}

.quote .image {
  flex: 0 0 25%;
  position: relative;
}

.quote .image img {
  position: absolute;
  top: 0;
  height: 100%;
}

.quote .left img {
  right: 0;
}

.quote .right img {
  left: 0;
}

.quote .text {
  flex: 0 0 50%;
  text-align: center;
}
<div class="quote">
  <div class="image left">
    <img src="https://i.stack.imgur.com/yJDgT.png">
  </div>
  <div class="text">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</div>
  <div class="image right">
    <img src="https://i.stack.imgur.com/JGkT0.png">
  </div>
</div>

<div class="quote" style="max-width: 400px;">
  <div class="image left">
    <img src="https://i.stack.imgur.com/yJDgT.png">
  </div>
  <div class="text">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</div>
  <div class="image right">
    <img src="https://i.stack.imgur.com/JGkT0.png">
  </div>
</div>

person Stickers    schedule 14.03.2018

Вот решение без использования flexbox и только с одним div.

Ваш div будет иметь два фона, каждый будет занимать 25% ширины.

Текст будет иметь ширину 50% (100% минус ширина двух фонов) и отступы 25% слева и справа.

Это будет работать до тех пор, пока ваше фоновое изображение длиннее текста.

div {
  background: url('http://placeimg.com/400/800/nature'), url('http://placeimg.com/400/800/nature'); /* the two backgrounds */
  background-repeat: no-repeat, no-repeat; /* you don't want them to repeat */ 
  background-size: 25% auto, 25% auto; /* you set them to occupy 25% of the width and to keep the ratio for the height */
  background-position: top left, top right; /* you position on one the left, one on the right */
  width: 50%;
  padding:0 25%;
}
<div>
  Lorem ipsum dolor sit amet, consectetur adipisicing elit. Fuga mollitia libero recusandae aperiam soluta odit, laborum repellendus explicabo nemo, ea accusamus facilis, unde deleniti laudantium possimus repudiandae natus quas officiis.
  </div>

person Amaury Hanser    schedule 13.03.2018
comment
Нет, это на самом деле обрезает изображение. Я хочу, чтобы изображения масштабировались. - person jhilgeman; 14.03.2018
comment
@jhilgeman Можно поточнее? Должен ли он сохранить соотношение? Он должен просто сжиматься? - person Amaury Hanser; 14.03.2018