一个接一个地给出9个div
,我想通过CSS创建一个3X3网格。
我该怎么做?
.cell {
height: 50px;
width: 50px;
background-color: #999;
display: inline-block;
}
.cell:nth-child(3n) {
background-color: #F00;
/* what property should I use to get a line break after this element? */
}
/* this doesn't work; at least not in safari */
.cell:nth-child(3n)::after {
display: block;
}

<div class="grid">
<div class="cell"></div>
<div class="cell"></div>
<div class="cell"></div>
<div class="cell"></div>
<div class="cell"></div>
<div class="cell"></div>
<div class="cell"></div>
<div class="cell"></div>
<div class="cell"></div>
</div>
&#13;
注意:我不想要float/clear
解决方案。重点是CSS,而不是HTML重组。
如果我将content: '\A'; white-space: pre;
添加到::after
输出就会变得难看。
.cell {
height: 50px;
width: 50px;
background-color: #999;
display: inline-block;
}
.cell:nth-child(3n) {
background-color: #F00;
/* what property should I use to get a line break after this element? */
}
.cell:nth-child(3n)::after {
display: inline;
content: '\A';
white-space: pre;
}
&#13;
<div class="grid">
<div class="cell"></div>
<div class="cell"></div>
<div class="cell"></div>
<div class="cell"></div>
<div class="cell"></div>
<div class="cell"></div>
<div class="cell"></div>
<div class="cell"></div>
<div class="cell"></div>
</div>
&#13;
如何在3X3行列布局中获取所有div?
答案 0 :(得分:14)
CSS flexbox的这种布局很简单。没有对HTML的更改。
.grid {
display: flex; /* establish flex container */
flex-wrap: wrap; /* enable flex items to wrap */
justify-content: space-around;
}
.cell {
flex: 0 0 32%; /* don't grow, don't shrink, width */
height: 50px;
margin-bottom: 5px;
background-color: #999;
}
.cell:nth-child(3n) {
background-color: #F00;
}
<div class="grid">
<div class="cell"></div>
<div class="cell"></div>
<div class="cell"></div>
<div class="cell"></div>
<div class="cell"></div>
<div class="cell"></div>
<div class="cell"></div>
<div class="cell"></div>
<div class="cell"></div>
</div>
flexbox的好处:
要了解有关flexbox的更多信息,请访问:
浏览器支持:
所有主流浏览器except IE < 10都支持Flexbox。最近的一些浏览器版本,例如Safari 8和IE10,需要vendor prefixes。要快速添加前缀,请使用Autoprefixer。 this answer中的更多详细信息。
答案 1 :(得分:9)
既然CSS Grid是相当 非常 well supported,我想我会用更现代的解决方案来补充答案。
.grid {
display: grid;
grid-gap: 1px;
grid-template-columns: repeat(3, 1fr);
}
div > div {
padding: 10px;
background-color: #ccc;
}
<div class="grid">
<div>item</div>
<div>item</div>
<div>item</div>
<div>item</div>
<div>item</div>
<div>item</div>
<div>item</div>
<div>item</div>
<div>item</div>
</div>
答案 2 :(得分:7)
除了@Michael_B使用flexbox
的优秀答案外,您还可以使用
CSS表格
或
float:left
既支持IE 8/9等旧版浏览器,flexbox
也不支持。
注意 IE8不支持nth-child
,但支持first/last-child
.grid {
display: table;
border-spacing: 5px
}
.row {
display: table-row
}
.cell {
width: 50px;
height: 50px;
background: grey;
display: table-cell;
}
.row div:last-child {
background: red
}
<div class="grid">
<div class="row">
<div class="cell"></div>
<div class="cell"></div>
<div class="cell"></div>
</div>
<div class="row">
<div class="cell"></div>
<div class="cell"></div>
<div class="cell"></div>
</div>
<div class="row">
<div class="cell"></div>
<div class="cell"></div>
<div class="cell"></div>
</div>
</div>
float:left
):对HTML没有任何更改,在每个(第4个)n项使用clear:left
。
.cell {
width: 50px;
height: 50px;
background: grey;
float: left;
margin: 5px
}
.cell:first-child + div+ div,
.cell:first-child + div+ div + div + div + div,
.cell:first-child + div+ div + div + div + div + div + div + div {
background: red
}
.cell:first-child + div+ div + div,
.cell:first-child + div+ div + div + div + div + div,
.cell:first-child + div+ div + div + div + div + div + div + div + div {
clear: left
}
<div class="grid">
<div class="cell"></div>
<div class="cell"></div>
<div class="cell"></div>
<div class="cell"></div>
<div class="cell"></div>
<div class="cell"></div>
<div class="cell"></div>
<div class="cell"></div>
<div class="cell"></div>
</div>
答案 3 :(得分:3)
只需添加另一个,您也可以仅使用一个<div>
制作3x3网格。 Plunker
HTML:
<div class="grid"></div>
CSS:
.grid {
width: 50px; height: 50px;
background-color: red;
border-top: 50px solid red;
border-bottom: 50px solid red;
margin: 0 50px;
position: relative;
box-shadow: inset 0 4px 0 -2px white,
inset 0 -4px 0 -2px white;
}
.grid::before {
content: '';
width: 50px; height: 50px;
background-color: red;
border-top: 50px solid red;
border-bottom: 50px solid red;
margin: 0;
position: absolute; left: -52px; top: -50px;
box-shadow: inset 0 4px 0 -2px white,
inset 0 -4px 0 -2px white;
}
.grid::after {
content: '';
width: 50px; height: 50px;
background-color: red;
border-top: 50px solid red;
border-bottom: 50px solid red;
margin: 0;
position: absolute; right: -52px; top: -50px;
box-shadow: inset 0 4px 0 -2px white,
inset 0 -4px 0 -2px white;
}
答案 4 :(得分:0)
我知道问题是要求非浮动清晰的解决方案,但在尝试了flexbox解决方案后,我发现它没有保留我的元素的宽度(进一步阅读表明我可能需要在容器上设置宽度元件)。然而,在3x3网格的特定情况下(与具有n行三个的网格相对),浮动清晰解决方案更简洁并且工作得很好。在这里,以防其他人在寻找解决方案时找到答案:
.cell {
float: left;
height: 100px;
width: 100px;
margin: 5px;
}
.cell:nth-child(4) {
clear: left;
}
.cell:nth-child(7) {
clear: left;
}