【问题标题】:Grid Columns Without Rows?没有行的网格列?
【发布时间】:2018-06-19 13:59:22
【问题描述】:

我正在尝试使用 CSS Grid 规范创建一个 3 列布局,但我遇到了行和元素大小的问题。我的列需要包含数量不定且高度不同的内容。

这是我理想的布局:

问题:

1) 如果我告诉元素 A 和 B 使用第 1 行第 1 列,那么它们会相互堆叠,而不是 A 下方的 B。

2) 如果我指定元素 B 使用第二行,那么由于元素 C 使第 1 行高,它会被推到元素 C 下方。

3) 如果我指定元素 B 使用第二行,则元素 A 会拉伸以填充第 1 行。

有什么方法可以让元素的行为与第一张图片中的一样?

我知道的唯一解决方案是在这样的列内创建“脚手架”div:

<div class="grid">
    <div class="col">
        <div class="itemA"></div>
        <div class="itemB"></div>
    </div>
    <div class="col">
        <div class="itemC"></div>
    </div>
    <div class="col">
        <div class="itemD"></div>
        <div class="itemE"></div>
        <div class="itemF"></div>
    </div>
</div>

但我不喜欢这样做,我认为网格规范应该允许在没有脚手架的情况下创建布局。

问题:

1) 有什么办法可以防止元素拉伸以垂直填充行?

2) 是否可以将两个元素放在同一行,并让它们一个在另一个下方而不是相互冲突?

这是我的 2 支钢笔,我正在尝试寻找有无脚手架的解决方案:

Without scaffolding

With scaffolding

【问题讨论】:

  • 网格的所有直接子项都是网格项,因此您定义 2 列并且您有 5 个直接子项,它们将堆叠成 3 行的 2 列,您可能可以摆脱跨列和行
  • 我会指出你想要做的不是网格,所以 CSS-Grid 在这里不是正确的工具。
  • 当您说“定义列”时,您是指使用网格模板列还是我谈到的脚手架?我试图避免使用脚手架,因为我希望我的 html 在正常运行的同时尽可能精简。另外,我正在寻找 3 列,如果可能的话最好不要行。我希望它看起来像我发布的第一张图片。我只能用脚手架来完成。
  • 尽可能避免搭建脚手架并没有错——我只是不确定在这种情况下你能避免多少。
  • 尤其是脚手架的重量可以忽略不计。

标签: css css-grid


【解决方案1】:

我可以拥有的最接近的,但我确实建议您使用 flexbox,您不能只在 CSS 网格中定义列,浏览器会为您定义行,如果您不这样做,并且您不管理它们,你会得到奇怪的布局。

我硬编码了元素之间的高度差异。

* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

.grid {
  background: brown;
  display: grid;
  grid-template-columns: auto 1fr auto;
  grid-gap: 10px;
  padding: 10px;
}

.grid>div {
  background-color: orange;
}

.itemA {
  grid-column-start: 1;
  grid-row: 1 / 1;
  width: 100px;
  height: 100px;
}

.itemB {
  grid-column-start: 1;
  grid-row: 2 / 4;
  height: 200px;
}

.itemC {
  grid-column-start: 2;
  grid-row: 1 / 3;
  height: 200px;
}

.itemD {
  grid-column-start: 3;
  width: 100px;
  height: 100px;
}

.itemE {
  grid-column-start: 3;
  height: 100px;
}

.itemF {
  grid-column-start: 3;
  grid-row: 3 / 4;
  height: 200px;
}
<div class="grid">
  <div class="itemA">A</div>
  <div class="itemB">B</div>
  <div class="itemC">C</div>
  <div class="itemD">D</div>
  <div class="itemE">E</div>
  <div class="itemF">F</div>
</div>

【讨论】:

  • 这看起来正是我想要的。能够在没有任何脚手架的情况下在不同的行上拥有不同高度的内容,这些内容不会在 3 个单独的列中展开。
  • 我想你只是没有管理自动生成的行。
  • 我知道使用网格规范是可能的,我只是不记得我的 Google fu 是如何让我失望的,哈哈。
  • 有可能,这取决于使用正确的工具,您可以通过多种方式实现很多事情,但哪种方式是正确且最优化的方式。
  • 此代码用于页面的子部分,我可能需要根据浏览器宽度调整内容定位,您还推荐 flexbox 吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-15
  • 1970-01-01
相关资源
最近更新 更多