Вам нужно всего лишь добавить max-height
к изображению. Смотрите 2 примера ниже, которые имеют различную высоту строки. В обоих случаях изображение заполняет высоту, основываясь на высоте других строк.
.grid{
display: grid;
grid-template-columns: repeat(2, 25%) 4fr;
grid-template-rows: auto 1fr 1fr 50px;
}
.grid > div {
background-color: lightgray;
border: 1px solid gray;
}
.grid .box-image {
grid-column: 3;
grid-row: 1 / 5;
}
.grid .box-image img {
object-fit: cover;
width: 100%;
max-height: 100%;
}
<div class="grid">
<div>1</div>
<div>2</div>
<div class="box-image">
<img src="https://via.placeholder.com/200">
</div>
<div>4</div>
<div>5</div>
<div>6</div>
<div>7</div>
<div>8</div>
<div>9</div>
</div>
С изображением 1000x1000 пикселей:
.grid{
display: grid;
grid-template-columns: repeat(2, 25%) 4fr;
grid-template-rows: auto 1fr 1fr 50px;
}
.grid > div {
background-color: lightgray;
border: 1px solid gray;
}
.grid .box-image {
grid-column: 3;
grid-row: 1 / 5;
}
.grid .box-image img {
object-fit: cover;
width: 100%;
max-height: 100%;
}
<div class="grid">
<div>1</div>
<div>2</div>
<div class="box-image">
<img src="https://via.placeholder.com/1000">
</div>
<div>4</div>
<div>5</div>
<div>6</div>
<div>7</div>
<div>8</div>
<div>9</div>
</div>
Без изображения:
.grid{
display: grid;
grid-template-columns: repeat(2, 25%) 4fr;
grid-template-rows: auto 1fr 1fr 50px;
}
.grid > div {
background-color: lightgray;
border: 1px solid gray;
}
.grid .box-image {
grid-column: 3;
grid-row: 1 / 5;
}
.grid .box-image img {
object-fit: cover;
width: 100%;
max-height: 100%;
}
<div class="grid">
<div>1</div>
<div>2</div>
<div class="box-image"></div>
<div>4</div>
<div>5</div>
<div>6</div>
<div>7</div>
<div>8</div>
<div>9</div>
</div>