使网格项跨越到隐式网格中的最后一行/列
Make a grid item span to the last row / column in implicit 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>
您可以将 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) 会创建荒谬的行数,从而导致问题。
Is it possible to make a grid item span from the first to the last row when I don't know the number of rows?
current spec(级别 1)似乎缺少此问题的自然网格解决方案。所以答案是 "no",严格使用 Grid 属性。
但是,正如 中所指出的,绝对定位可能是可行的。
虽然 CSS 网格无法使网格区域跨越 隐式网格 中的所有列/行,但它可以在 显式网格中完成这项工作网格.
使用负整数。
CSS 网格规范中有两个有趣的部分:
Numeric indexes in the grid-placement properties count from the edges
of the explicit grid. Positive indexes count from the start side,
while negative indexes count from the end side.
这里...
If a negative integer is given, it instead counts in reverse, starting
from the end edge of the explicit grid.
换句话说,在处理显式网格时,即您使用这些属性定义的网格:
grid-template-rows
grid-template-columns
grid-template-areas
...您可以通过设置此规则使网格区域跨越所有列:
grid-column: 3 / -1;
这告诉网格区域从第三列线跨越到最后一列线。
相反的是:
grid-column: 1 / -3;
同样,此方法仅适用于显式网格。
一个对我实际有效的解决方案,可以在要增长到最后的元素上设置 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>
因此,如果这似乎还不可能,您可以选择更改结构并嵌套网格。
使用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>
当我不知道行数时,是否可以让网格项从第一行跨越到最后一行?
假设我有以下 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>
您可以将 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) 会创建荒谬的行数,从而导致问题。
Is it possible to make a grid item span from the first to the last row when I don't know the number of rows?
current spec(级别 1)似乎缺少此问题的自然网格解决方案。所以答案是 "no",严格使用 Grid 属性。
但是,正如
虽然 CSS 网格无法使网格区域跨越 隐式网格 中的所有列/行,但它可以在 显式网格中完成这项工作网格.
使用负整数。
CSS 网格规范中有两个有趣的部分:
Numeric indexes in the grid-placement properties count from the edges of the explicit grid. Positive indexes count from the start side, while negative indexes count from the end side.
这里...
If a negative integer is given, it instead counts in reverse, starting from the end edge of the explicit grid.
换句话说,在处理显式网格时,即您使用这些属性定义的网格:
grid-template-rows
grid-template-columns
grid-template-areas
...您可以通过设置此规则使网格区域跨越所有列:
grid-column: 3 / -1;
这告诉网格区域从第三列线跨越到最后一列线。
相反的是:
grid-column: 1 / -3;
同样,此方法仅适用于显式网格。
一个对我实际有效的解决方案,可以在要增长到最后的元素上设置 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>
因此,如果这似乎还不可能,您可以选择更改结构并嵌套网格。
使用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>