如何在CSS网格布局中定位特定的列或行?

Dio*_*Dan 33 html css css-selectors css3 css-grid

是否可以使用CSS选择特定的网格列或行?

例如,假设我有一个3行×2列CSS网格布局:grid-template-rows: 1fr 1fr 1fr; grid-template-columns: 1fr 1fr;.如何从第2列中选择所有元素?例如:( grid:nth-child(column:2)只是我的想法,不是有效的代码).

我已经nth-childdiv元素上尝试了选择器,但这不允许我在Grid Layout引擎自动放置项目时指定行或列.

body {
  display: grid;
  grid-template-rows: 1fr 1fr 1fr;
  grid-template-columns: 1fr 1fr;
  grid-gap: 10px;
}

.item {
  background: #999;
}
Run Code Online (Sandbox Code Playgroud)
<div class="item">
  <p>Customer Name</p>
  <p>Element 1 | Element 2</p>
</div>

<div class="item">
  <p>Right Justify</p>
  <p>Element 1 | Element 2</p>
</div>

<div class="item">
  <p>Customer Name</p>
  <p>Element 1 | Element 2</p>
</div>

<div class="item">
  <p>Customer Name</p>
  <p>Element 1 | Element 2</p>
</div>
<div class="item">
  <p>Customer Name</p>
  <p>Element 1 | Element 2</p>
</div>
<div class="item">
  <p>Customer Name</p>
  <p>Element 1 | Element 2</p>
</div>
<div class="item">
  <p>Customer Name</p>
  <p>Element 1 | Element 2</p>
</div>
Run Code Online (Sandbox Code Playgroud)

Mic*_*l_B 17

CSS无法实现.

CSS以HTML元素,属性和属性值为目标.

网格列和行没有这些"钩子".

您必须直接定位网格项目.

你写了:

例如,假设我有一个3行×2列CSS网格布局:grid-template-rows: 1fr 1fr 1fr; grid-template-columns: 1fr 1fr;.如何从第2列中选择所有元素?

grid-container {
  display: grid;
  grid-template-columns: 1fr 1fr;
  grid-template-rows: 1fr 1fr 1fr;
  grid-gap: 10px;
  padding: 10px;
  height: 50vh;
  background-color: gray;
}

grid-item {
  background-color: lightgreen;
}

grid-item:nth-child(2n) {
  border: 2px dashed red;
}
Run Code Online (Sandbox Code Playgroud)
<grid-container>
  <grid-item></grid-item>
  <grid-item></grid-item>
  <grid-item></grid-item>
  <grid-item></grid-item>
  <grid-item></grid-item>
  <grid-item></grid-item>
</grid-container>
Run Code Online (Sandbox Code Playgroud)


chi*_*t24 17

要设置任意行的样式,可以使用display设置为的包装元素contents.请参阅下面的代码段:

.grid-container {
  display: grid;
  grid-template-columns: repeat(5, 1fr);
  grid-gap: 2px;
}

.grid-item {
  border: 1px solid black;
  padding: 5px;
}

.grid-row-wrapper {
  display: contents;
}

.grid-row-wrapper > .grid-item {
  background: skyblue;
}
Run Code Online (Sandbox Code Playgroud)
<div class="grid-container">
  <div class="grid-item">1</div>
  <div class="grid-item">2</div>
  <div class="grid-item">3</div>
  <div class="grid-item">4</div>
  <div class="grid-item">5</div>
  <div class="grid-row-wrapper">
    <div class="grid-item">6</div>
    <div class="grid-item">7</div>
    <div class="grid-item">8</div>
    <div class="grid-item">9</div>
    <div class="grid-item">10</div>
  </div>
  <div class="grid-item">11</div>
  <div class="grid-item">12</div>
  <div class="grid-item">13</div>
  <div class="grid-item">14</div>
  <div class="grid-item">15</div>
  <div class="grid-item">16</div>
  <div class="grid-item">17</div>
  <div class="grid-item">18</div>
  <div class="grid-item">19</div>
  <div class="grid-item">20</div>
</div>
Run Code Online (Sandbox Code Playgroud)

编辑:与所有实现一样,您应该检查以确保它在您的目标环境中工作.您可以在MDN或caniuse.com上查看兼容性表,以获得以下支持display: contents:

  • 不,这不是一个有效的答案。使用静态网格设置行和列的样式从来都不是问题,因为您始终知道每个元素将出现的确切位置。最初提出的问题是如何定位动态网格自动放置在特定行/列上的特定项目。 (8认同)
  • 我已经用浏览器支持的详细信息更新了我的答案.对于downvoters:当低估答案时,请发表评论; 这有助于作者和遇到解决方案的其他用户.帮助中心对此进行了描述:https://stackoverflow.com/help/privileges/vote-down. (5认同)
  • 如果您使用媒体查询更改了列数,则这不适用于响应式设计。例如,如果您在较小的屏幕上从 5 列变为 3 列,则样式会渗透到另一行。 (5认同)
  • 非常好的解决方案,但截至 2021 年 1 月,浏览器支持仍然严重缺乏 (4认同)
  • 这应该是正确答案。浏览器支持并不完美,但 `display: contents;` 是为了解决这个问题而没有 hack。它非常适合 DOM 步进以设置正确行的样式,但同时不可见并从网格渲染中跳过(它不会弄乱任何东西)。 (3认同)
  • 非常适合行,但在定位列时会中断。不过,这是一个很好的答案尝试,我确信对于其他解决方案很有用。 (2认同)
  • 这不是 2023 年的答案。如果我们让这个问题保持这种状态,那么我们将看到人们开始一遍又一遍地重复这个问题,寻找 2023 年及以后的解决方案。当这个问题被提出时,没有解决方案,但现在到 2023 年,解决方案可能有机会存在。 (2认同)

Eug*_*kov 10

你不能,因为没有这样的选择器。

但这很奇怪,因为您可以轻松地从CSS定位行/列:

#item3 {
  background-color: blue;
  grid-row: span 2 / 7;
}
Run Code Online (Sandbox Code Playgroud)

因此,很自然地会期待这样的事情:

div[style*="display:grid"]:grid-row(3) {
    background-color: blue;
}

div[style*="display:grid"]:grid-column(3) {
    background-color: green;
}
Run Code Online (Sandbox Code Playgroud)

我不知道为什么至今还没有提出草案。

有一个用于列选择的 CSSWG 草案

W3C 存储库中也有一个问题请求


Tem*_*fif 8

在不久的将来,借助网格结构选择器,我们将能够做到这一点

二维网格中的单元格(与其行和列)的双重关联不能用分层标记语言中的起源来表示。这些关联中只有一个可以分层表示:另一个必须在文档语言语义中显式或隐式定义。在 HTML 和 DocBook 这两种最常见的分层标记语言中,标记都是行主的(即,行关联是分层表示的);列必须是隐含的。为了能够表示这种隐含的基于列的关系,定义了列组合器以及 :nth-col():nth-last-col()伪类。在列主格式中,这些伪类改为与行关联匹配。

您在这里需要的:nth-col()行为方式与:nth-child()

:nth-col(An+B)类表示法表示属于列的单元格元素,该列在引用An+B-1之前有列


Dom*_*ner 5

如果您想设置行样式,则适用相同的原则。以上面的例子为例:

grid-container {
  display: grid;
  grid-template-columns: 1fr 1fr;
  grid-template-rows: 1fr 1fr 1fr 1fr;
  grid-gap: 10px;
  padding: 10px;
  height: 50vh;
  background-color: gray;
}

grid-item {
  background-color: lightgreen;
}

grid-item:nth-child(4n+3),grid-item:nth-child(4n) {
  border: 2px dashed red;
}
Run Code Online (Sandbox Code Playgroud)
<grid-container>
  <grid-item></grid-item>
  <grid-item></grid-item>
  <grid-item></grid-item>
  <grid-item></grid-item>
  <grid-item></grid-item>
  <grid-item></grid-item>
  <grid-item></grid-item>
  <grid-item></grid-item>
</grid-container>
Run Code Online (Sandbox Code Playgroud)

  • 这个“解决方案”与项目的数量相关,并且也不考虑任何换行符(又名*换行*),因此它不是那么有用。 (2认同)

Mat*_*usz 5

没有可以定位的列或行元素,但是如果网格是统一的(每行中的单元格数目相同),则可以选择单元格。这里有些例子。

1.列。

5列网格中的最后一列:

    .item:nth-child(5n) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

5列网格中的第四列(倒数第二):

    .item:nth-child(5n-1) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

5列网格中的第一列(最后第五列):

    .item:nth-child(5n-4) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

2.行

5列网格中的第一行(前五个单元格):

    .item:nth-child(-n+5) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

5列网格中的第二行(单元格从6到10):

    .item:nth-child(n+6):nth-child(-n+10) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

5列网格中的第三行(单元格从11到15):

    .item:nth-child(n+11):nth-child(-n+15) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

5列网格中的最后一行包含20个单元格(从16开始的单元格):

    .item:nth-child(n+16) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

  • 静态工作但不动态工作 (2认同)