【问题标题】:How to have different column widths across rows in CSS Grid?如何在 CSS Grid 中的行之间具有不同的列宽?
【发布时间】:2020-04-13 07:50:59
【问题描述】:

我需要创建如图所示的网格项目。第一项需要占45%,第二项和第三项需要占52.5%,其余项需要各占50%。我无法将 HTML 更改为来自循环的所有网格子项。所以我无法通过编写的 CSS 来实现它,检查 sn-p,通过我的 css,它唯一可能使左侧所有项目的宽度为 50% 或 45%,但是如何从 4 更改项目的宽度到其余的项目。

是否可以不更改 HTML?

.atul {
  display: grid;
  grid-template-columns: 45% 52.5%;
  grid-template-rows: auto;
  grid-gap: 2.5%;
  grid-template-areas: "card1 card2" 
                       "card1 card3";
}

.card:nth-child(1) {
  grid-area: card1;
}

.card:nth-child(2) {
  grid-area: card2;
}

.card:nth-child(3) {
  grid-area: card3;
}
<div class="atul">
  <div class="card" style="background-color: red;">Card 1</div>
  <div class="card" style="background-color: green;">Card 2</div>
  <div class="card" style="background-color: yellow;">Card 3</div>
  <div class="card" style="background-color: skyblue;">Card 4</div>
  <div class="card" style="background-color: skyblue;">Card 5</div>
  <div class="card" style="background-color: skyblue;">Card 6</div>
  <div class="card" style="background-color: skyblue;">Card 7</div>
  <div class="card" style="background-color: skyblue;">Card 8</div>
  <div class="card" style="background-color: skyblue;">Card 9</div>
  <div class="card" style="background-color: skyblue;">Card 10</div>
  <div class="card" style="background-color: skyblue;">Card 11</div>
  <div class="card" style="background-color: skyblue;">Card 12</div>
  <div class="card" style="background-color: skyblue;">Card 13</div>
</div>

【问题讨论】:

  • 一共有13条吗?或者可以有更多/更少?
  • 不,它总是 13,不是更少,不是更多
  • 2.5% 的网格间隙在前两行有效。但在接下来的所有行中,项目为 50-50,没有 2.5% 的差距。
  • 是的@Michael_B,你是绝对正确的,所以 50% 意味着在那里,它们的宽度应该相等,这意味着每个 48.75%
  • 实际上我在网格项中需要 30px 的间隙,也尝试使用 Margin,但是边距在网格项内应用,它假设在我应用 box-sizing:border 时超出网格项-box;

标签: html css grid css-grid


【解决方案1】:

要完成这项工作,您需要为所有三个长度(42.5%、48.75% 和 52.5%)找到一个通用分隔符。使用公共分隔线,您可以创建正确数量的列来容纳每个网格区域。

在下面的示例中,我创建了 400 列,每列宽度为 0.25% (400 * .25 = 100%)。

然后它跨越正确数量的列的网格区域:

45.00 / .25 = 180

48.75 / .25 = 195

52.50 / .25 = 210

它可能不是您正在寻找的东西,但希望这个概念可以帮助您前进。

HTML 没有变化。

.atul {
  display: grid;
  grid-template-columns: repeat(400, .25%);
  grid-auto-rows: 50px; /* for demo only */
  grid-row-gap: 30px;   /* note that you need to create column gaps through
                           the proper distribution of columns, because if you
                           use `grid-column-gap`, it will add a gap between
                           all 400 columns */
}

.card:nth-child(1) {
  grid-column: 1 / 180;
  grid-row: 1 / 3;
}

.card:nth-child(2) {
  grid-column: -1 / -210; /* starting at the end line of the grid
                             (works only in explicit grids) */
  grid-row: 1 / 2;
}

.card:nth-child(3) {
  grid-column: -1 / -210;
  grid-row: 2 / 3;
}

/* starting at the 4th item, target even items only */
.card:nth-child(n + 4):nth-child(even) {
  grid-column: 1 / 195;
}

.card:nth-child(n + 4):nth-child(odd) {
  grid-column: -1 / -195;
}

.card:nth-child(4),
.card:nth-child(5) {
  grid-row: 3;
}

.card:nth-child(6),
.card:nth-child(7) {
  grid-row: 4;
}

.card:nth-child(8),
.card:nth-child(9) {
  grid-row: 5;
}

.card:nth-child(10),
.card:nth-child(11) {
  grid-row: 6;
}

.card:nth-child(12),
.card:nth-child(13) {
  grid-row: 7;
}
<div class="atul">
  <div class="card" style="background-color: red;">Card 1</div>
  <div class="card" style="background-color: green;">Card 2</div>
  <div class="card" style="background-color: yellow;">Card 3</div>
  <div class="card" style="background-color: skyblue;">Card 4</div>
  <div class="card" style="background-color: skyblue;">Card 5</div>
  <div class="card" style="background-color: skyblue;">Card 6</div>
  <div class="card" style="background-color: skyblue;">Card 7</div>
  <div class="card" style="background-color: skyblue;">Card 8</div>
  <div class="card" style="background-color: skyblue;">Card 9</div>
  <div class="card" style="background-color: skyblue;">Card 10</div>
  <div class="card" style="background-color: skyblue;">Card 11</div>
  <div class="card" style="background-color: skyblue;">Card 12</div>
  <div class="card" style="background-color: skyblue;">Card 13</div>
</div>

jsFiddle demo

【讨论】:

  • 这是开箱即用的东西,完美,非常感谢。我已经看到你的 SO 帐户了,你现在有一个粉丝了 :)
  • 什么网格列:-1 / -210;这个负数在这里,它是从网格容器的末尾开始的,比如 flex-end
  • 是的。计数从网格中的最后一行开始。 stackoverflow.com/q/57268090/3597276
  • 最后一个问题,当我在旧示例中​​使用 grid-gap: 2.5% 时,我有一个类 atul 和背景颜色的包装,网格项超出了该父级包装。不知道为什么会这样。我希望我能让你明白是什么问题。我只是想了解为什么会这样?
  • 您没有在容器上设置高度。所以浏览器计算:(1)项目的高度,然后(2)容器的高度,然后(3)添加网格行间距。因为容器的高度是在考虑网格行间距之前设置的,所以存在溢出。如果您删除网格间隙规则,您会发现一切都很好。
猜你喜欢
  • 2020-04-15
  • 2021-02-20
  • 1970-01-01
  • 2018-08-30
  • 1970-01-01
  • 2018-05-16
  • 1970-01-01
  • 2014-02-25
  • 2018-03-07
相关资源
最近更新 更多