使用CSS网格布局跨越所有列/行的项目

Mar*_*ius 23 html css grid css-grid

随着CSS网格布局模块很快在Firefox和Chrome中出货,我想我会试着掌握如何使用它.

我试图创建一个简单的网格,一个项目a跨越所有行的左侧,与其他项目(b,c,d,e,等)横跨各行的右侧.跨越行的右侧项目的量是可变的,所以有可能是任意组合b,c,d,e,等等,所以我使用的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;
}
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)

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

leh*_*ang 56

我有同样的情况,并找到了一个干净的解决方案.

不要使用巨大的行跨度值,请尝试:

    grid-column: 1/-1;
Run Code Online (Sandbox Code Playgroud)

由于负数从右侧开始计算,此代码将网格列指定为最后一列的末尾.

  • 不幸的是,当列数是动态的并且未知时,这是行不通的。在不知道列数的情况下,我找到的解决方案是在元素上放置“ position:absolute;”和“ width:100%;”以跨越所有列,并在父项上添加“ position:relative;”。 (2认同)

G-C*_*Cyr 10

编辑: 除非您使用过时的浏览器否则不要介意这个答案;)


您可以使用 row 的 hudge 值来跨越(至少与您认为的最大行数一样多)

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

编辑 grid-row: 1 / -1;现在也可以在最新的 Firefox 中使用。不再需要跨越 hudge 值来关注 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;
}
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)

或者你的意思是:

#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;
}
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)

这是一个可以与 live 一起玩的代码笔

  • 谢谢。不幸的是,只有在未指定“grid-row-gap”的情况下,这才可以正常工作。如果指定了“grid-row-gap”,渲染器将插入与 hudge 行一样多的间隙...... (2认同)