Макет на самом деле полностью возможен, но требует небольшого изменения вашего HTML. Вам нужно будет обернуть ваш элемент <header>
, <main>
и <footer>
в div обертки, для которого установлено значение display: flex; flex-direction: column
, чтобы они использовали CSS flexbox для выполнения требований макета с заполнением пространства.
Затем в элементе <main>
вы делаете тот же трюк с флексбоксом CSS. Тем не менее, вы должны обернуть ваш элемент <img>
в <div>
, который будет расти до любого доступного пространства.
Пока ваш макет будет выглядеть так:
<div class="wrapper">
<header><!-- Header content --></header>
<main>
<!-- More content -->
<div class="image">
<img src="..." />
</div>
</main>
<footer><!-- Footer content --></footer>
</div>
Ваш элемент <img>
затем будет настроен на абсолютное позиционирование, полностью покрывая его родительский элемент <div>
, и использует object-fit: cover
для определения размера, чтобы заполнить все пространство при сохранении соотношения сторон.
Вот пример проверки концепции. Однако вам может потребоваться просмотреть его на полной странице (или отметьте это JSFiddle ), поскольку встроенный предварительный просмотр фрагмента кода слишком мал для демонстрации макета:
html, body {
height: 100%;
padding: 0;
margin: 0;
background-color: #fff;
}
.wrapper {
display: flex;
flex-direction: column;
height: 100%;
}
header, footer {
background-color: steelblue;
color: #eee;
}
main {
flex: 1 1 100%;
display: flex;
flex-direction: column;
height: 100%;
}
.image {
flex: 1 1 100%;
position: relative;
}
img {
display: block;
width: 100%;
height: 100%;
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
object-fit: cover;
}
<div class="wrapper">
<header>
<h1>Some header stuff</h1>
<p>Such as a navigation bar at the top of the viewport.</p>
</header>
<main>
<h1>Image</h1>
<p>An image that should fill up the space in between</p>
<div class="image">
<img src="https://images.unsplash.com/photo-1586109803336-c02797ffdcc0?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=634&q=80" />
</div>
</main>
<footer>
<h1>Some footer stuff</h1>
<p>Such as a logo, link to privacy page etc.</p>
</footer>
</div>