我必须在两行中放置7个div
(图像),第一行中放置3个,第二行中放置4个。前3个div
应该居中,后4个可以占据所有空间。
这是我所做的:
.content {
display: grid;
grid-gap: 10px;
grid-template-columns: 1fr repeat(3, 170px) 1fr;
grid-template-areas: ". item1 item2 item3 ."
"item4 item5 item6 item7";
grid-template-rows: 1fr 1fr;
}
.content .box {
width: 170px;
height: 170px;
border: solid 1px #000;
}
.content.box:nth-child(1) {
grid-area: box1;
}
.content.box:nth-child(2) {
grid-area: box2;
}
.content.box:nth-child(3) {
grid-area: box3;
}
.content.box:nth-child(4) {
grid-area: box4;
}
.content.box:nth-child(5) {
grid-area: box5;
}
.content.box:nth-child(6) {
grid-area: box6;
}
.content.box:nth-child(7) {
grid-area: box7;
}
<div class="content">
<div class="box">1</div>
<div class="box">2</div>
<div class="box">3</div>
<div class="box">4</div>
<div class="box">5</div>
<div class="box">6</div>
<div class="box">7</div>
</div>
答案 0 :(得分:3)
网格,顾名思义,必须成形为网格。认为列数必须是所有行的空间。
因此,您的区域样式不被浏览器接受,因为第一行有5列,第二行有4列。
@kukkuz已经发布了纠正此问题的答案。在这里,您还有另一种可能性,根据我的需求,它会更适应您的要求。
无论如何,这种布局的最佳解决方案可能是使用flex(因为该布局不是真正的网格)
.content {
display: grid;
grid-gap: 10px;
grid-template-columns: repeat(8, 100px);
grid-template-areas: "empt box1 box1 box2 box2 box3 box3 emp2"
"box4 box4 box5 box5 box6 box6 box7 box7";
grid-template-rows: 1fr 1fr;
}
.content .box {
width: 180px;
height: 170px;
border: solid 1px #000;
}
.content .box:nth-child(1) {
grid-area: box1;
}
.content .box:nth-child(2) {
grid-area: box2;
}
.content .box:nth-child(3) {
grid-area: box3;
}
.content .box:nth-child(4) {
grid-area: box4;
}
.content .box:nth-child(5) {
grid-area: box5;
}
.content .box:nth-child(6) {
grid-area: box6;
}
.content .box:nth-child(7) {
grid-area: box7;
}
<div class="content">
<div class="box">1</div>
<div class="box">2</div>
<div class="box">3</div>
<div class="box">4</div>
<div class="box">5</div>
<div class="box">6</div>
<div class="box">7</div>
</div>
答案 1 :(得分:2)
CSS更改:
消除所有CSS代码(在您的问题中)并将其替换为该代码。使用grid-template-columns: 1fr repeat(3, 170px) 1fr;
会使事情变得混乱,因为它不能同时代表两排盒子。使用grid-template-columns: repeat(auto-fit, minmax(170px, 1fr));
可使浏览器/系统确定该特定行的实际位置。 然后 ,它使每一行都可以做自己的事情。使用place-items: end center;
表示您希望所有内容居中,但是您希望系统从末尾开始然后居中。这样可以防止事物卡在最左边。注意:您不需要任何其他CSS即可获得所需的效果。仅.content
和.box
类。没什么。
.content {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(170px, 1fr));
place-items: end center;
}
.box {
width: 170px;
height: 170px;
border: solid 1px #000;
}
HTML更改:
将您的html替换为(如下)。这会将盒子分成两行。我用.content
包裹了每一行,以便它们可以包含不同数量的盒子而没有问题。
<div class="content">
<div class="box">1</div>
<div class="box">2</div>
<div class="box">3</div>
</div>
<div class="content">
<div class="box">4</div>
<div class="box">5</div>
<div class="box">6</div>
<div class="box">7</div>
</div>
我希望我的解释可以帮助您更好地了解CSS网格布局。 :)
答案 2 :(得分:2)
您可以使用grid-template-columns: repeat(12, 1fr)
创建 12列网格:
将第一行的列跨度调整为4,第二行将其调整为3。
使用justify-items: center
将容器对齐到中心以获取中心对齐。
现在您可以调整 跨度,或使用justify-self
来设置所需的布局。
请参见下面的演示
.content {
display: grid;
grid-template-columns: repeat(12, 1fr);
grid-gap: 10px;
justify-items: center;
}
.content .box {
height: 170px;
width: 170px;
border: solid 1px #000;
}
.box:nth-child(1), .box:nth-child(2), .box:nth-child(3) { /* first three boxes */
grid-column: span 4;
}
.box:nth-child(3) ~ .box { /* the last 4 boxes */
grid-column: span 3;
}
/* alignment adjustment if needed */
.box:nth-child(1) {
justify-self: flex-end;
}
/* alignment adjustment if needed */
.box:nth-child(3) {
justify-self: flex-start;
}
<div class="content">
<div class="box">1</div>
<div class="box">2</div>
<div class="box">3</div>
<div class="box">4</div>
<div class="box">5</div>
<div class="box">6</div>
<div class="box">7</div>
</div>
在框中具有图像的演示:
.content {
display: grid;
grid-template-columns: repeat(12, 1fr);
grid-gap: 10px;
justify-items: center;
}
.content .box {
border: solid 1px #000;
}
.box img {
display: block;
width: 100%;
}
.box:nth-child(1), .box:nth-child(2), .box:nth-child(3) { /* first three boxes */
grid-column: span 4;
}
.box:nth-child(3) ~ .box { /* the last 4 boxes */
grid-column: span 3;
}
/* alignment adjustment if needed */
.box:nth-child(1) {
justify-self: flex-end;
}
/* alignment adjustment if needed */
.box:nth-child(3) {
justify-self: flex-start;
}
<div class="content">
<div class="box">
<img src="https://via.placeholder.com/150" />
</div>
<div class="box">
<img src="https://via.placeholder.com/150" />
</div>
<div class="box">
<img src="https://via.placeholder.com/150" />
</div>
<div class="box">
<img src="https://via.placeholder.com/150" />
</div>
<div class="box">
<img src="https://via.placeholder.com/150" />
</div>
<div class="box">
<img src="https://via.placeholder.com/150" />
</div>
<div class="box">
<img src="https://via.placeholder.com/150" />
</div>
</div>