html Css网格:中心对齐2行中不同数量的项目

xzv2uavs  于 2023-01-07  发布在  其他
关注(0)|答案(3)|浏览(161)

我必须放置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>
w8f9ii69

w8f9ii691#

一个网格,顾名思义,必须是网格的形状。这意味着列数必须是所有行的空间。
因此,浏览器不接受您的区域样式,因为它的第一行有5列,第二行有4列。
@kukkuz已经发布了一个更正这个问题的答案。在这里你有另一种可能性,在我的vies更适应你的要求。
无论如何,可能这种布局的最佳解决方案是使用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>
crcmnpdw

crcmnpdw2#

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 Package 了每一行,这样它们就可以包含不同数量的盒子而没有问题。

<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网格布局。:)

e5njpo68

e5njpo683#

可以使用grid-template-columns: repeat(12, 1fr)创建 * 12柱网轴线 *:
1.将第一行的 * 列跨度 * 调整为4,第二行调整为3。
1.使用justify-items: center将容器 * 对齐 * 到中心,以获得中心对齐。
1.现在您可以 * 调整**跨距 * 或使用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>
  • 框 * 中包含图像的演示:

一个二个一个一个

相关问题