Chrome: похоже, подчиняется свойству grid-template-row, но элементы сетки переполняют контейнер.
Я бы лучше сказал, что Chrome делает усилие чтобы это работало, так как расчет как-то сложен, и у нас есть цикл.В основном, процентное значение должно быть разрешено, и изначально (поскольку высота не определена) браузер не может разрешить значения grid-template-rows
, поэтому сначала он вычислит высоту оболочки, основываясь на ее содержимом (игнорируя grid-template-rows
), и мы будемполучить что-то вроде ниже:
console.log(document.querySelector('.wrapper').offsetHeight);
body {
margin: 40px;
}
.wrapper {
display: grid;
grid-gap: 10px;
grid-template-columns: 30% 30% 30%;
/*grid-template-rows: 30% auto 60%;*/
background-color: #f00;
color: #444;
}
.box {
background-color: #444;
color: #fff;
border-radius: 5px;
padding: 20px;
}
<div class="wrapper">
<div class="box">A</div>
<div class="box">B</div>
<div class="box">C</div>
<div class="box">D</div>
<div class="box">E</div>
<div class="box">F</div>
<div class="box">G</div>
<div class="box">H</div>
<div class="box">I</div>
</div>
На этом шаге Firefox останавливается, но Chrome постарается сделать больше!Обратите внимание на значение высоты, которую мы получили (194px
).Теперь мы можем разрешить процентные значения на основе этого значения, и у вас будет это:
console.log(document.querySelector('.wrapper').offsetHeight);
console.log(document.querySelector('.box:first-child').offsetHeight);
console.log(document.querySelector('.box:last-child').offsetHeight);
body {
margin: 40px;
}
.wrapper {
display: grid;
grid-gap: 10px;
grid-template-columns: 30% 30% 30%;
grid-template-rows: 30% auto 60%;
background-color: #f00;
color: #444;
}
.box {
background-color: #444;
color: #fff;
border-radius: 5px;
padding: 20px;
}
<div class="wrapper">
<div class="box">A</div>
<div class="box">B</div>
<div class="box">C</div>
<div class="box">D</div>
<div class="box">E</div>
<div class="box">F</div>
<div class="box">G</div>
<div class="box">H</div>
<div class="box">I</div>
</div>
Обратите внимание, как первый элемент (первый ряд) имеет высоту, равную 58px
(0.3 * 194px
), и как последний дочерний элемент(последний ряд) имеет высоту, равную 117px
(0.6 * 194px
).Логически второй ряд должен иметь высоту 194px - 58px - 117px - 20px(gap) = -1
, что недостаточно, поэтому он будет иметь большую высоту, таким образом, переполнение.
Переполнение на самом деле не проблема, а побочный эффект этого сложный расчет, и вы всегда будете иметь его, если вы не определите процентное значение для каждой строки меньше (100% - 20px/3 = 33.33% - 6.67px
).
console.log(document.querySelector('.wrapper').offsetHeight);
console.log(document.querySelector('.box:first-child').offsetHeight);
console.log(document.querySelector('.box:last-child').offsetHeight);
body {
margin: 40px;
}
.wrapper {
display: grid;
grid-gap: 10px;
grid-template-columns: 30% 30% 30%;
grid-template-rows: 20% 20% 20%;
background-color: #f00;
color: #444;
}
.box {
background-color: #444;
color: #fff;
border-radius: 5px;
padding: 20px;
}
<div class="wrapper">
<div class="box">A</div>
<div class="box">B</div>
<div class="box">C</div>
<div class="box">D</div>
<div class="box">E</div>
<div class="box">F</div>
<div class="box">G</div>
<div class="box">H</div>
<div class="box">I</div>
</div>
Также браузер не вернется, чтобы исправить эту проблему, увеличив высоту оболочки, поскольку у нас будет цикл с grid-template-rows
был определен на основе этого.
Аналогичный вопрос: Процент зазора сетки без высоты