Я пытаюсь сделать свои изображения отзывчивыми внутри некоторых контейнеров flexbox, используя object-fit: contain, и хотя изображения изменяют размер, макет, похоже, сохраняет исходный размер изображения, вызывая появление полосы прокрутки.
Проверка ширины изображения с помощью Chrome Dev Tools показывает, что ширина по-прежнему равна 1024 (однако высота была уменьшена соответствующим образом).
(Я черпал вдохновение из Автоматическое изменение размера изображения в макете CSS FlexBox и сохранение соотношения сторон? , чтобы добраться до этого момента)
Мне не хватает некоторых дополнительных атрибутов CSS?
JSFiddle: https://jsfiddle.net/w6hgqf18/1/
html,
body {
margin: 0;
height: 100%;
}
.page {
height: 100%;
display: flex;
}
.main-container {
flex: 1 1 0;
display: flex;
flex-direction: column;
}
.half-containers {
flex: 0 1 50%;
overflow: auto;
box-sizing: border-box;
border: 0.5px solid red;
display: flex;
}
.page-header {
flex: 0 0 auto;
background-color: #dcdcdc;
}
.page-footer {
flex: 0 0 auto;
background-color: #dcdcdc;
}
img {
object-fit: contain;
}<div class = "page">
<div class = "main-container">
<div class = "page-header">
This is a header
</div>
<div class = "half-containers">
<img src='https://i.imgur.com/tqQvuFr.jpg' />
</div>
<div class = "half-containers">
<img src='https://i.imgur.com/tqQvuFr.jpg' />
</div>
<div class = "page-footer">
This is a footer
</div>
</div>
</div>Согласен, это не дубликат. Там нет ничего, объясняющего, как и почему object-fit так себя ведет. Речь не идет об автоматическом изменении размера изображений, которое уже сделано здесь. речь идет о том, «почему объектная подгонка ведет себя так».






Вы можете обернуть img тегом div с width: 100% и установить изображение height на 100% и сделать это без object-fit:
html,
body {
margin: 0;
height: 100%;
}
.page {
height: 100%;
display: flex;
}
.main-container {
flex: 1 1 0;
display: flex;
flex-direction: column;
}
.half-containers {
flex: 0 1 50%;
overflow: auto;
box-sizing: border-box;
border: 0.5px solid red;
display: flex;
}
.page-header {
flex: 0 0 auto;
background-color: #dcdcdc;
}
.page-footer {
flex: 0 0 auto;
background-color: #dcdcdc;
}
.img-container {
width: 100%;
}
img {
height: 100%;
}<div class = "page">
<div class = "main-container">
<div class = "page-header">
This is a header
</div>
<div class = "half-containers">
<div class = "img-container">
<img src='https://i.imgur.com/tqQvuFr.jpg' />
</div>
</div>
<div class = "half-containers">
<div class = "img-container">
<img src='https://i.imgur.com/tqQvuFr.jpg' />
</div>
</div>
<div class = "page-footer">
This is a footer
</div>
</div>
</div>То, что у вас есть, логично, вам просто нужно понять, как работает object-fit. Начнем с более простого примера:
.box {
width:300px;
height:300px;
border:1px solid;
}
img {
width:100%;
height:100%;
object-fit:contain;
}<div class = "box">
<img src = "https://picsum.photos/300/200?image=1069">
</div>Как вы можете видеть, я использовал изображение 300x200, которое я растягиваю внутри блока 300x300, таким образом, я нарушаю его соотношение, и если вы проверите ширину/высоту изображения, вы увидите, что оно Размерность по-прежнему 300x300 (размерность до подачи заявки object-fit).
Из спецификация:
The object-fit property specifies how the contents of a replaced element should be fitted to the box established by its used height and width.
По сути, мы визуально изменяем содержимое изображения, чтобы оно соответствовало пространству, установленному изображением. object-fit не изменяет размер изображения, а использует этот размер как ссылку для изменения содержимого внутри.
Возьмем тот же пример, но вместо этого используем 50%:
.box {
width:300px;
height:300px;
border:1px solid;
}
img {
width:50%;
height:50%;
object-fit:contain;
}<div class = "box">
<img src = "https://picsum.photos/300/200?image=1069">
</div>Теперь изображение имеет размер 150x150 и внутри него мы меняем содержимое, чтобы получить эффект содержать.
Та же логика будет происходить со всеми значениями
.box {
width:300px;
height:300px;
border:1px solid;
}
img {
width:50%;
height:50%;
}<div class = "box">
<img src = "https://picsum.photos/300/200?image=1069" style = "object-fit:contain;">
</div>
<div class = "box">
<img src = "https://picsum.photos/300/200?image=1069" style = "object-fit:cover;">
</div>В вашем примере у вас то же самое. без object-fit картинка как ниже
html,
body {
margin: 0;
height: 100%;
}
.page {
height: 100%;
display: flex;
}
.main-container {
flex: 1 1 0;
display: flex;
flex-direction: column;
}
.half-containers {
flex: 0 1 50%;
overflow: auto;
box-sizing: border-box;
border: 0.5px solid red;
display: flex;
}
.page-header {
flex: 0 0 auto;
background-color: #dcdcdc;
}
.page-footer {
flex: 0 0 auto;
background-color: #dcdcdc;
}
img {
/*object-fit: contain;*/
}<div class = "page">
<div class = "main-container">
<div class = "page-header">
This is a header
</div>
<div class = "half-containers">
<img src='https://i.imgur.com/tqQvuFr.jpg' />
</div>
<div class = "half-containers">
<img src='https://i.imgur.com/tqQvuFr.jpg' />
</div>
<div class = "page-footer">
This is a footer
</div>
</div>
</div>Добавление object-fit не изменит его размер, а только то, что мы видим:
html,
body {
margin: 0;
height: 100%;
}
.page {
height: 100%;
display: flex;
}
.main-container {
flex: 1 1 0;
display: flex;
flex-direction: column;
}
.half-containers {
flex: 0 1 50%;
overflow: auto;
box-sizing: border-box;
border: 0.5px solid red;
display: flex;
}
.page-header {
flex: 0 0 auto;
background-color: #dcdcdc;
}
.page-footer {
flex: 0 0 auto;
background-color: #dcdcdc;
}
img {
object-fit: contain;
}<div class = "page">
<div class = "main-container">
<div class = "page-header">
This is a header
</div>
<div class = "half-containers">
<img src='https://i.imgur.com/tqQvuFr.jpg' />
</div>
<div class = "half-containers">
<img src='https://i.imgur.com/tqQvuFr.jpg' />
</div>
<div class = "page-footer">
This is a footer
</div>
</div>
</div>Теперь другая проблема заключается в том, что ваше изображение имеет ширину 1024px, а гибкие элементы не будут выходить за пределы размера содержимого из-за ограничения min-width, поэтому вам нужно добавить для получения необходимого эффекта min-width:0. При этом у вас больше не будет проблем с переполнением, тогда ваше изображение будет содержаться внутри области, определенной макетом flexbox.
html,
body {
margin: 0;
height: 100%;
}
.page {
height: 100%;
display: flex;
}
.main-container {
flex: 1 1 0;
display: flex;
min-width: 0; /*added*/
flex-direction: column;
}
.half-containers {
flex: 0 1 50%;
overflow: auto;
box-sizing: border-box;
border: 0.5px solid red;
display: flex;
}
.page-header {
flex: 0 0 auto;
background-color: #dcdcdc;
}
.page-footer {
flex: 0 0 auto;
background-color: #dcdcdc;
}
img {
object-fit: contain;
min-width: 0; /*added*/
}<div class = "page">
<div class = "main-container">
<div class = "page-header">
This is a header
</div>
<div class = "half-containers">
<img src='https://i.imgur.com/tqQvuFr.jpg' />
</div>
<div class = "half-containers">
<img src='https://i.imgur.com/tqQvuFr.jpg' />
</div>
<div class = "page-footer">
This is a footer
</div>
</div>
</div>Вы также можете получить тот же результат, учитывая background-image и background-size:contain, где вам больше не нужно возиться с ограничением min-width, поскольку контента больше нет.
html,
body {
margin: 0;
height: 100%;
}
.page {
height: 100%;
display: flex;
}
.main-container {
flex: 1 1 0;
display: flex;
flex-direction: column;
}
.half-containers {
flex: 0 1 50%;
overflow: auto;
box-sizing: border-box;
border: 0.5px solid red;
display: flex;
background:url(https://i.imgur.com/tqQvuFr.jpg) center/contain no-repeat;
}
.page-header {
flex: 0 0 auto;
background-color: #dcdcdc;
}
.page-footer {
flex: 0 0 auto;
background-color: #dcdcdc;
}<div class = "page">
<div class = "main-container">
<div class = "page-header">
This is a header
</div>
<div class = "half-containers">
</div>
<div class = "half-containers">
</div>
<div class = "page-footer">
This is a footer
</div>
</div>
</div>Хороший ответ. Я просто хочу, чтобы мы могли заставить img обновить свой внутренний размер (в данном случае ширину), чтобы отразить уменьшенное содержимое, чтобы не было дополнительных «отступов».
Не дубликат, на самом деле в моем вопросе использовалась информация, которую я получил из этих ответов на stackoverflow.com/questions/21103622/….