Короткий ответ : Вы хотите justify-content
не justify-items
.container {
background-color: #aa96da;
display: grid;
justify-content: center; /* -items to -content */
grid-gap: 20px;
grid-template-rows: repeat(3, 1fr);
/*Only if I change this 100px to '1fr' the justify-items will work */
grid-template-columns: repeat(3, 100px);
}
.item {
width: 100px;
height: 100px;
background-color: green;
}
<div class="container">
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
</div>
Длинный ответ:
Существует разница между элементом сетки и пространством, в котором он находится.
Когда вы определяете сетку, вы определяете только строки / столбцы сетки, называемые tracks
, фактически не определяя, куда направляется каждый элемент и т.д. c.
Элементы DOM следуют только за потоком сетки и размещаются соответственно, что мы можем изменить, используя такие свойства, как grid-column
grid-row
Вы можете посмотреть на это так: ![enter image description here](https://i.stack.imgur.com/DsZAl.png)
Как вы можете видеть, есть The Grid container
, The Grid
, The Columns
, The Rows
, а затем The Grid items
.
Элементы Grid живут в пересечение между двумя именованными The Grid Area
(это делает сетку css лучше, чем flexbox в некоторых отношениях)
И justify-items
выравнивает элементы сетки в этой области.
Итак grid-template-columns: repeat(3, 1fr);
Это означает, что 3 столбца имеют ширину сетки, равномерно распределенную между ними.
Демо
Не смотрите на код просто превью
* {
padding: 0;
margin: 0;
box-sizing: border-box;
}
[grid] {
height: 300px;
display: flex;
border: 2px solid;
padding: 10px;
flex-wrap: wrap;
}
[column] {
flex: 1 0 calc(100% / 3);
border: 2px solid;
display: flex;
flex-direction:column;
align-items:center;
}
[column]>div {
width: 100px;
flex:1;
background-color: green;
}
<div grid>
<div column>
<div>Grid Item</div>
</div>
<div column>
<div>Grid Item</div>
</div>
<div column>
<div>Grid Item</div>
</div>
<div column>
<div>Grid Item</div>
</div>
<div column>
<div>Grid Item</div>
</div>
<div column>
<div>Grid Item</div>
</div>
<div column>
<div>Grid Item</div>
</div>
<div column>
<div>Grid Item</div>
</div>
<div column>
<div>Grid Item</div>
</div>
</div>
Как вы можете видеть, столбцы сетки шире, чем элементы сетки 100px
, что означает пространство для центрирования материала, поэтому justify-items: center;
будет центрировать их внутри .
Вот почему похоже, что сетка центрирована, но это не причина, по которой изменение на grid-template-columns: repeat(3, 100px);
нарушает ее.
В случае grid-template-columns: repeat(3, 100px);
Демо
Не смотрите на код, только предварительный просмотр
* {
padding: 0;
margin: 0;
box-sizing: border-box;
}
[ctr] {
border: 2px solid;
padding: 10px;
}
[grid] {
height: 300px;
width: 340px;
display: flex;
padding: 10px;
flex-wrap: wrap;
}
[column] {
flex: 0 0 100px;
border: 2px solid;
display: flex;
flex-direction: column;
align-items: center;
}
[column]>div {
width: 100px;
flex: 1;
background-color: green;
}
<div ctr>
<div grid>
<div column>
<div>Grid Item</div>
</div>
<div column>
<div>Grid Item</div>
</div>
<div column>
<div>Grid Item</div>
</div>
<div column>
<div>Grid Item</div>
</div>
<div column>
<div>Grid Item</div>
</div>
<div column>
<div>Grid Item</div>
</div>
<div column>
<div>Grid Item</div>
</div>
<div column>
<div>Grid Item</div>
</div>
<div column>
<div>Grid Item</div>
</div>
</div>
</div>
Как видно, ширина столбцов равна элементу сетки, поэтому все они плотно прилегают к столбцам, а сетка еще пуста.