В приведенном ниже коде показано предполагаемое поведение при изменении размера окна в Chrome 60 и Firefox 55 (но не в iOS Safari 10.3; это, скорее всего, еще один вопрос, почему он работает неправильно в Safari).
html, body {
width: 100%;
height: 100%;
padding: 0;
margin: 0;
border: 0;
background-color: lightgrey;
}
.container {
box-sizing: border-box;
width: 100%;
display: grid;
grid-template-columns: 1fr 1fr;
grid-template-rows: repeat(3, calc((60vh - 12px)/3));
/*grid-template-rows: 1fr 1fr 1fr;*/
/*grid-template-rows: auto auto auto;*/
height: 60vh;
border: 3px solid yellow;
padding: 3px;
/*grid-gap: 20px;*/ /* <-- would also mess things up */
}
.tile {
}
img {
box-sizing: border-box;
display: block;
object-fit: contain;
width: 100%;
height: 100%;
margin: 0;
border: 0;
padding: 3px;
}
<!-- The image is 200 x 100 px: a green and a blue square next to each other. -->
<div class="container">
<div class="tile">
<img src="https://i.stack.imgur.com/qbpIG.png" alt="." />
</div>
<div class="tile">
<img src="https://i.stack.imgur.com/qbpIG.png" alt="." />
</div>
<div class="tile">
<img src="https://i.stack.imgur.com/qbpIG.png" alt="." />
</div>
<div class="tile">
<img src="https://i.stack.imgur.com/qbpIG.png" alt="." />
</div>
<div class="tile">
<img src="https://i.stack.imgur.com/qbpIG.png" alt="." />
</div>
<div class="tile">
<img src="https://i.stack.imgur.com/qbpIG.png" alt="." />
</div>
</div>
Важно, чтобы соотношение сторон изображений (2:1)
сохраняется. Я ожидал либо:
grid-template-rows: 1fr 1fr 1fr;
or:
grid-template-rows: auto auto auto;
изображения помещаются в строки сетки, но ни одно из них не подходит. С:
grid-template-rows: repeat(3, calc((60vh - 12px)/3));
Я получаю желаемое поведение. Как мне избежать самостоятельной математики? Другими словами, что мне нужно сделать, чтобы grid-template-rows: 1fr 1fr 1fr;
(или что-то подобное) работало?
Вычислить высоту элемента-контейнера в CSS на реальной странице уже сложно. Цель состоит в том, чтобы решить эту проблему с помощью макета сетки CSS; без JavaScript и без фоновых изображений.
Обновление: изначально я исключил взлом фонового изображения по двум причинам.
Я думал (из-за некоторых недоразумений), что URL-адрес фонового изображения должен быть в файле CSS, но это не так: я могу использовать встроенные стили и иметь его в HTML.
Это казалось хакерским. Увидев, насколько сложным и запутанным становится использование вложенных flex-контейнеров внутри grid-контейнера только для того, чтобы заставить его работать в Safari, я просто прибегнул к хаку с фоновым изображением, так как он значительно чище и работает во всех проверенные браузеры (Chrome, Firefox, Safari).
В конце концов, это не принятый ответ, который помог решить мою проблему.
height: 100%
в элементахimg
. - person Ali   schedule 19.09.201760vh
, но не установили высоту для строк сетки. - person TylerH   schedule 19.09.2017100vh
, используюcalc()
и устанавливаю это как высоту контейнера. Извините, я абсолютный новичок в этой области. Что касается вашего другого вопроса: строки должны быть одинаковой высоты. - person Ali   schedule 19.09.201740vh + 12px
, более или менее? - person TylerH   schedule 19.09.2017100vh
. Или есть способ сделать контейнерdiv
растягивается до нижней части страницы (или до нижнего колонтитула)? Похоже, мне нужно указать высоту какого-то элемента... - person Ali   schedule 19.09.2017