使网格项跨越到最后一行/列

时间:2017-05-18 15:45:22

标签: html css css3 css-grid

当我不知道行数时,是否可以使网格项目从第一行延伸到最后一行?

假设我有以下带有未知数量框的html。

如何从第一个网格线到最后一个网格线的第三个.box范围?



.container {
  display: grid;
  grid-template-columns: repeat(3, minmax(10rem, 1fr)) [last-col] 35%;
  grid-template-rows: auto [last-line];
}

.box {
  background-color: blue;
  padding: 20px;
  border: 1px solid red;
}

.box:nth-child(3) {
  background-color: yellow;
  grid-column: last-col / span 1;
  grid-row: 1 / last-line;
}

<div class="container">
  <div class="box"></div>
  <div class="box"></div>
  <div class="box">3</div>
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
</div>
&#13;
&#13;
&#13;

4 个答案:

答案 0 :(得分:10)

您可以将grid-row-start添加到css框中,并将其设置为跨越荒谬的高数字。

.container {
  display: grid;
  grid-template-columns: repeat(3, minmax(10rem, 1fr)) [last-col] 35%; 
  grid-template-rows: auto [last-line];
}

.box {
  background-color: blue;
  padding: 20px;
  border: 1px solid red;
}

.box:nth-child(3) {
  background-color: yellow;
  grid-column: last-col / span 1;
  grid-row: 1 / last-line;
  grid-row-start: span 9000;
}
<div class="container">
  <div class="box"></div>
  <div class="box"></div>
  <div class="box">3</div>
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
</div>

编辑 - 免责声明:

这是一个非最佳解决方案,并不适用于所有浏览器,请小心!虽然这似乎可以在某些浏览器(Chrome)中使用,但其他浏览器(Firefox)会创建导致问题的荒谬行数。

答案 1 :(得分:8)

  

当我不知道行数时,是否可以使网格项从第一行跨越到最后一行?

current spec(级别1)似乎缺少此问题的自然网格解决方案。所以答案是“不”,严格使用网格属性。

然而,正如this answer所指出的那样,绝对定位可能是可能的。

虽然CSS Grid无法使网格区域跨越隐式网格中的所有列/行,但它可以在显式网格中完成工作。

使用负整数。

CSS Grid规范中有两个有趣的部分:

  

7.1. The Explicit Grid

     

网格放置属性中的数字索引从边缘开始计算   显式网格。正指数从开始计算,   负面指数从末端算起。

在这里......

  

8.3. Line-based Placement: the grid-row-start, grid-column-start, grid-row-end, and grid-column-end properties

     

如果给出一个负整数,则反而计数,开始   从显式网格的结束边缘开始。

换句话说,在处理显式网格时,这是使用这些属性定义的网格:

  • grid-template-rows
  • grid-template-columns
  • grid-template-areas

...您可以通过设置此规则使网格区域跨越所有列:

grid-column: 3 / -1;

告诉网格区域从第三列线到最后一列线。

相反的是:

grid-column: 1 / -3;

同样,此方法仅适用于显式网格。

答案 2 :(得分:2)

这个解决方案实际上对我有用,可以在你希望增长到最后的元素上设置position: absolute;。这将有其缺点,但在某些情况下可以节省生命。这是一个完整的例子:

.grid {
  display: grid;
  grid-template: auto / auto 22px auto;
  position: relative;
}

.vline {
  position: absolute;
  height: 100%;
  width: 2px;
  background-color: black;
  grid-column: 2 / span 1;
  margin: 0 10px;
}

.grid h1:nth-child(1) { grid-row: 1; grid-column: 1; text-align: right; }
.grid p:nth-child(2) { grid-row: 2; grid-column: 1; text-align: right; }
.grid h1:nth-child(3) { grid-row: 3; grid-column: 3; }
.grid p:nth-child(4) { grid-row: 4; grid-column: 3; }
.grid h1:nth-child(5) { grid-row: 5; grid-column: 1; text-align: right; }
.grid p:nth-child(6) { grid-row: 6; grid-column: 1; text-align: right; }
.grid h1:nth-child(7) { grid-row: 7; grid-column: 3; }
.grid p:nth-child(8) { grid-row: 8; grid-column: 3; }
p, h1 { margin: 0; padding: 0; }
<div class="grid">
  <h1>1.</h1>
  <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. In dui nulla, dictum sed tortor ut, tempus posuere odio.</p>
  <h1>2.</h1>
  <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
  <h1>3.</h1>
  <p>In dui nulla, dictum sed tortor ut, tempus posuere odio.</p>
  <h1>4.</h1>
  <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. In dui nulla, dictum sed tortor ut, tempus posuere odio.</p>
  <div class="vline"></div>
</div>

答案 3 :(得分:0)

因此,如果看起来还不可能,则可以选择更改结构并嵌套网格。

如果无法提前执行,请使用JavaScript取出第三个框并将其放置在原始网格容器旁边。

.container {
    display: grid;
    grid-template-columns: 65% 35%;
}

.nested_grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(10rem, 1fr));
    grid-template-rows: auto;
}

.box {
    background-color: blue;
    padding-bottom: 20px;
    border: 1px solid red;
}

.side {
    background-color: yellow;
    grid-column: 1 -1;
    border: 1px solid red;
}
<div class="container">
    <div class="nested_grid">
        <div class="box"></div>
        <div class="box"></div>
        <div class="box"></div>
        <div class="box"></div>
        <div class="box"></div>
        <div class="box"></div>
        <div class="box"></div>
        <div class="box"></div>
        <div class="box"></div>
        <div class="box"></div>
    </div>
    <div class="side">3</div>
</div>
<p><a href="gridbyexample.com">gridbyexample.com</a></p>