Проблема
Допустим, у нас есть вертикальный (т.е. flex-direction: column) контейнер flexbox с заданной шириной и высотой. Flexbox содержит div, и каждый div содержит изображение.
- Предполагается, что все div и изображения сжимаются / растут на один и тот же процент, чтобы заполнить высоту flexbox, что достигается с помощью flex-shrink и / или flex-grow.
- Все изображения должны сохранять свое соотношение сторон (т. е. без растяжения), что достигается за счет того, что их атрибут css "width" не установлен.
- Каждое div должен иметь ту же ширину, что и изображение внутри него, чего я ожидал достичь с помощью «width: min-content» или «width: max-content» или «width: fit-content», но это не работает .
Как можно достичь третьей точки?
Примечание: похоже, работает вне flexbox.
Пример
В приведенном ниже примере div с идентификатором «imagecontainer» не уменьшает свою ширину, когда его высота уменьшается ниже flex-base, даже если его содержимое уменьшается по ширине. Однако наличие того же div за пределами flexbox заставляет его правильно уменьшать его ширину, когда он заставляет его дочернее изображение уменьшаться за счет ограничений по высоте.
Как мне сделать так, чтобы div "imagecontainer" во flexbox масштабировал его ширину с изображением (чтобы красный div в первом примере имел тот же размер, что и красный div в третьем примере)?
Image in flex container with limited height
<div style="display: flex; flex-direction: column; border: 1px solid black; height: 110px; width: 200px; align-items: flex-start;">
<div id="imagecontainer" style="position: relative; flex-shrink: 1; flex-basis: 150px; min-height: 0; box-sizing: border-box; border: 1px solid red; width: min-content;">
<img src="https://via.placeholder.com/150.png" style="max-height: 150px; height: 100%;" />
</div>
</div>
Original image<br />
<img src="https://via.placeholder.com/150.png" style="border: 1px solid black;" />
<br />
Image in just a simple div with limited height
<div style="position: relative; height: 110px; border: 1px solid red; width: min-content;">
<img src="https://via.placeholder.com/150.png" style="max-height: 150px; height: 100%;" />
</div>
Изменить:
Основываясь на одном из приведенных ниже ответов, это версия, которая решает проблему на Chrome, но не работает на Firefox. Единственное существенное изменение по сравнению с приведенным выше примером, заставившее его работать, заключалось в добавлении «height: 100%» в div «imagecontainer».
Image in flex container with limited height
<div style="display: flex; flex-direction: column; border: 1px solid black; height: 110px; width: 200px; align-items: flex-start;">
<div id="imagecontainer" style="position: relative; flex-shrink: 1; flex-basis: 120px; min-height: 0; box-sizing: border-box; border: 1px solid red; width: min-content; height: 100%;">
<img src="https://via.placeholder.com/120.png" style="max-height: 120px; height: 100%;" />
</div>
<div id="imagecontainer" style="position: relative; flex-shrink: 1; flex-basis: 150px; min-height: 0; box-sizing: border-box; border: 1px solid red; width: fit-content; height: 100%;">
<img src="https://via.placeholder.com/150.png" style="max-height: 150px; height: 100%;" />
</div>
</div>
Original image<br />
<img src="https://via.placeholder.com/150.png" style="border: 1px solid black;" />
<br />
Image in just a simple div with limited height
<div style="position: relative; height: 110px; border: 1px solid red; width: min-content;">
<img src="https://via.placeholder.com/150.png" style="max-height: 150px; height: 100%;" />
</div>
Изменить решение:
На основе принятого ответа решение для приведенного выше примера таково (вычисление процентов высоты на основе значений, которые в противном случае были бы флекс-основа):
Image in flex container with limited height
<div style="border: 1px solid black; height: 110px; width: 200px;">
<div id="imagecontainer" style="box-sizing: border-box; border: 1px solid red;height: calc(100% / (270 / 120)); width: max-content;">
<img src="https://via.placeholder.com/120.png" style="height: 100%;" />
</div>
<div id="imagecontainer" style="box-sizing: border-box; border: 1px solid red;height: calc(100% / (270 / 150)); width: max-content;">
<img src="https://via.placeholder.com/150.png" style="height: 100%;" />
</div>
</div>
Обратите внимание, что для этого больше не требуется flexbox.