【问题标题】:Items that span all columns/rows using CSS grid layout使用 CSS 网格布局跨越所有列/行的项目
【发布时间】:2017-07-03 13:07:56
【问题描述】:

随着 CSS 网格布局模块即将在 Firefox 和 Chrome 中发布,我想我会尝试掌握如何使用它。

我尝试创建一个简单的网格,其中一个项目 a 跨越所有行的左侧,其他项目(bcde 等.) 跨越各个行的右侧。跨越行右侧的项目数量是可变的,因此可能有bcde 等的任意组合,所以我使用的是grid-auto-rows 属性.因此,我无法为 a 定义固定数量的跨行,但我希望 a所有个可用行。

#container {
    display: grid;
    grid-auto-flow: column;
    grid-auto-rows: auto;
    grid-template-columns: [left] 4rem [right] 1fr;
    margin: 0rem auto;
    max-width: 32rem;
}
#a {
    background: lightgreen;
    grid-column: left;
    grid-row: 1 / auto;
    justify-self: center;
}
#b {
    grid-area: auto / right;
    background: yellow;
}
#c {
    grid-area: auto / right;
    background: pink;
}
#d {
    grid-area: auto / right;
    background: lightskyblue;
}
#e {
    background: plum;
    grid-area: auto / right;
}
<div id="container">
    <div id="a">a</div>
    <div id="b">b</div>
    <div id="c">c</div>
    <div id="d">d</div>
    <div id="e">e</div>
</div>

我应该怎么做才能让a 跨越所有行而不知道最终会有多少行?

【问题讨论】:

  • 我也在研究 CSS Grid,我也遇到了同样的问题。我觉得我缺少一些简单的东西。
  • 我会在有时间的时候将其写成完整的答案,但关键是网格内的网格。因此,在“a”旁边创建另一个 div,其中包含 b、c、d、e 和所有其他内容 - 我们称之为“content_holder”。然后添加显示:网格;到'content_holder'。它会根据内容自动调整大小,'a' 会根据内容自动调整大小。
  • 我遇到了同样的问题。可能 grid-row: 1 / -1 应该这样做,但它显然不适用于自动行:(

标签: html css grid css-grid


【解决方案1】:

编辑: 不要介意这个答案,除非你是关于一个过时的浏览器 ;)


您可以使用一个 hudge 值来跨越 (至少您认为最大行数可能是)

grid-row: 1 / -1; 12/19 ,仍然无法在 FF 中工作。

编辑 grid-row: 1 / -1; 现在也可以在最新的 Firefox 中使用。 不必再考虑 Firefox 的行为了。

#container {
  display: grid;
  grid-auto-flow: column;
  grid-auto-rows: auto;
  grid-template-columns: [left] 4rem [right] 1fr;
  margin: 0rem auto;
  max-width: 32rem;
}
#a {
  background: lightgreen;
  grid-column: left;
  grid-row-start: 1;
  grid-row-end: span 1000;/* hudge value ... will at least span so many rows */
  justify-self: center;/* ? what did you mean here ? */
  /* did you mean : */
  display:flex;
  align-items:center;
}
#b {
  grid-area: auto / right;
  background: yellow;
}
#c {
  grid-area: auto / right;
  background: pink;
}
#d {
  grid-area: auto / right;
  background: lightskyblue;
}
#e {
  background: plum;
  grid-area: auto / right;
}
<div id="container">
  <div id="a">a</div>
  <div id="b">b</div>
  <div id="c">c</div>
  <div id="d">d</div>
  <div id="e">e</div>
</div>

或者你的意思是:

#container {
  display: grid;
  grid-auto-flow: column;
  grid-auto-rows: auto;
  grid-template-columns: [left] 4rem [right] 1fr;
  margin: 0rem auto;
  max-width: 32rem;
}
#a {
  background: lightgreen;
  grid-column: left;
  grid-row-start: 1;
  grid-row-end: span 1000;/* hudge value ... will at least span so many rows */
  align-self: center;
  justify-self:center
  }
#b {
  grid-area: auto / right;
  background: yellow;
}
#c {
  grid-area: auto / right;
  background: pink;
}
#d {
  grid-area: auto / right;
  background: lightskyblue;
}
#e {
  background: plum;
  grid-area: auto / right;
}
<div id="container">
  <div id="a">a</div>
  <div id="b">b</div>
  <div id="c">c</div>
  <div id="d">d</div>
  <div id="e">e</div>
</div>

这里是a codepen to play with live

【讨论】:

  • 谢谢。不幸的是,这只有在未指定 grid-row-gap 时才能正常工作。如果指定了grid-row-gap,渲染器将插入与hudge行一样多的间隙......
  • (使用justify-self: center; 只是因为我在测试中使用了垂直方向的文本,我希望在列中居中。我应该从我发布的示例中删除它。对不起!)
  • @Marlius 对于grid-row-gap,你可以把它变成margin。我用我以前的笔来添加边距(间隙)和写作模式 .codepen.io/gc-nomade/pen/ygwbyv (在第一个 codepen codepen.io/gc-nomade/pen/xgBVKB 的第三个示例中已经有一个间隙示例 :) 。除了 auto 之外,不应该指定工作行高。另一个使用 javascript 设置所需跨度值的示例:codepen.io/gc-nomade/pen/BpZZQW(与另一个类似问题相关)
  • @Marlius jquery pen 重新访问了gap值codepen.io/gc-nomade/pen/pRYPwK
  • By fail 我指的是你上面关于grid-row-gap的对话。我要关闭我链接的 W3 文档; “如果给出一个负整数,它会倒数,从显式网格的末端开始。”由于我不知道的原因,使用负索引提供了纯 CSS 解决方案。
【解决方案2】:

我遇到了同样的情况并找到了一个干净的解决方案。

尝试使用巨大的行跨度值,而不是:

grid-column: 1/-1;

由于负数从右开始计数,此代码将grid-column 指定到最后一列的末尾。

注意:如果这不适用,请在下面的评论中查看 Jonny Green 的解决方案。

【讨论】:

  • 美丽的解决方案,在我有 1 个我想跨越整个宽度的单元格和一堆我想成为 1 个单元格宽度的其他单元格的情况下为我工作。定义 grid-column: 1 / span X 破坏了我的响应能力,这解决了它。
  • 不幸的是,当列数是动态且未知时,这不起作用。在不知道列数的情况下,我找到的解决方案是在元素上使用position: absolute;width: 100%; 以跨越所有列,并将position: relative; 添加到父级。
  • 在与 css 斗争了几天之后,Jonny Green 的评论终于让它工作了(在要跨越的元素上添加了 height: 100%;)。
  • 刚刚尝试在布局上使用 Jonny Green 的想法,但意识到它对我不起作用——有时#a 中的内容可能比所有其他内容都高。在这种情况下, position:absolute 没有帮助......
  • 虽然这是一个 hack,但我能够逃脱 grid-row: 1 / span 99; height: 100%;,因为我知道我永远不会有任何接近 99 行的东西(如果需要,请执行 999)。我需要元素仍然占据空间,这就是为什么@JonnyGreen 的解决方案不能满足我的需求。
猜你喜欢
  • 2020-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-08
  • 2017-12-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多