在主容器中定位网格项的内容(子网格功能)

pht*_*ier 8 css css3 css-grid

关于CSS网格的所有指南似乎都暗示了一种结构,其中位于网格中的元素是网格本身的子元素.

<div class="wrapper">
  <div>A</div>
  <div>B</div>
</div>
Run Code Online (Sandbox Code Playgroud)

.wrapper具有display: grid和网格属性的定义.

如果我想在网格本身上放置一个网格的"孙子"元素(而不是依赖于它的父级?),这是否有意义?

<div class="wrapper">
  <div>A</div>
  <div>
    <div>B</div>
    <div>C</div>
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

在这里,我希望能够将A,B和C各自放在他们自己的网格行上; 这甚至有意义吗?

vsy*_*ync 8

由于在撰写此答案时,在最新的Firefox v71以外的浏览器上根本不支持子网格,即使其他浏览器开始支持它,使用旧版本的用户仍将被抛在后面至少一年,直到有足够的用户升级他们的浏览器以便能够使用这样的新功能。

我设计了一种在祖先网格上对齐深层嵌套网格元素的方法:

从本质上讲,该解决方案是应用display:contents到网格的所有嵌套元素,直到希望用作网格项的元素,这有效地进行了反向继承,因此设置为的每个元素display:contents实际上都投影其子元素的显示,因此,最终深层嵌套的元素将被视为该.container元素的直接子元素。

.container {
  display: grid;
  grid-template-columns: auto 1fr;
  gap: 10px;
  max-width: 500px;
  margin: auto;
}

.container div{
  display: contents; /* <-- makes the div elements "transparent" to the grid */
}

input{ height: 40px; }
label{ align-self: center; }
Run Code Online (Sandbox Code Playgroud)
<div class="container">
  <div>
    <div>
      <div>
        <label contenteditable>very long label</label>
        <input>
      </div>
    </div>
  </div>
  <div>
    <div>
      <div>
        <label contenteditable>short</label>
        <input>
      </div>
    </div>
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

浏览器将其视为:

<div class="container">
  <label contenteditable>very long label</label>
  <input>
  <label contenteditable>short</label>
  <input>
</div>
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,标签是可编辑的,以展示网格轨道的动态特性,因此所有网格项都是对齐的。

Codepen 演示


Mic*_*l_B 6

display: subgrid

来自CSS Grid Level 2 草案规范

2. 网格容器

子网格提供通过嵌套元素向下传递网格参数的能力,并将基于内容的大小信息返回到其父网格。

如果元素是一个网格项(即它是流入的并且它的父display: subgrid元素是一个网格容器),则使该元素成为一个子网格(它是一种特殊类型的网格容器框)并因此忽略它的 grid-template-*grid-*-gap属性以支持采用父网格跟踪它跨越的。

3. 子网格

通过给它一个网格项,它本身可以是一个网格容器display: grid。在这种情况下,其内容的布局将独立于它参与的网格的布局。

在某些情况下,多个网格项的内容可能需要相互对齐。本身是网格项的网格容器可以使用 将其行和列的定义推迟到其父网格容器display: subgrid,使其成为子网格。

在这种情况下,子网格的网格项参与调整父网格容器的网格大小,允许两个网格的内容对齐。阅读更多。

此功能尚未在主要浏览器中实现。谁知道会是什么时候。

在 Grid 中,只有容器的流入子项成为网格项并且可以接受网格属性。

随着display: subgrid在网格上项目,该项目的孩子们尊重容器的线路。

根据Grid Level 1 规范display: subgrid已推迟到Level 2

现在,display: grid在某些情况下,网格项(即嵌套的网格容器)可能很有用。

另一种可能的解决方法是display: contents. 该方法解释如下:

更多信息:

  • Subgrid 现已在 Firefox 69+ 中实现。但没有其他地方,所以仍然无法使用。 (3认同)