sk1*_*k1p 6 html css css3 grid-layout css-grid
我正在尝试构建一个包含卡片状物品的网格.每种类型的单元格(标题,图像,文本,按钮,......)每行应具有相同的高度,由最大单元格的内容决定,如下面的代码段所示.
现在我试图限制列的数量,并让卡片换行,就好像我flex-wrap: wrap;在基于flexbox的解决方案中使用的那样.列数应通过媒体查询确定.如果不使用尚未支持的子网格,这可能吗?
另外,使用子网格的解决方案如何?我想它会降级到当前浏览器中高度不等的单元格?
.grid {
display: grid;
grid-template-rows: repeat(4, auto);
grid-gap: 10px;
grid-auto-flow: column;
grid-auto-columns: auto;
}Run Code Online (Sandbox Code Playgroud)
<div class="grid">
<h2 class="a">Header 1</h2>
<img class="b" src="https://placekitten.com/400/100" />
<p class="c">text
</p>
<button class="d">Button</button>
<h2 class="a">Header 2 is longer and may span multiple lines</h2>
<img class="b" src="https://placekitten.com/400/100" />
<p class="c">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis et cursus ligula. Maecenas non pharetra dui, eu tincidunt mi. Vivamus vitae luctus risus. Etiam vehicula sem est.
</p>
<button class="d">Button</button>
<h2 class="a">Header 1</h2>
<img class="b" src="https://placekitten.com/400/100" />
<p class="c">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis et cursus ligula. Maecenas non pharetra dui, eu tincidunt mi. Vivamus vitae luctus risus. Etiam vehicula sem est, non ultricies lectus placerat eget.
</p>
<button class="d">Button</button>
<h2 class="a">Header 1</h2>
<img class="b" src="https://placekitten.com/400/100" />
<p class="c">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis et cursus ligula. Maecenas non pharetra dui, eu tincidunt mi. Vivamus vitae luctus risus. Etiam vehicula sem est, non ultricies lectus placerat eget. Suspendisse pulvinar arcu massa, quis
varius velit facilisis tincidunt. Proin sed cursus orci.
</p>
<button class="d">Button</button>
<h2 class="a">Header 1</h2>
<img class="b" src="https://placekitten.com/400/100" />
<p class="c">Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</p>
<button class="d">Button</button>
</div>Run Code Online (Sandbox Code Playgroud)
这是我们需要子网格时情况的一个很好的例子- 对齐网格表兄弟在布局中至关重要,例如在这个问题中。
在浏览器实现建议的Level 2 规范之前Subgrids,我们只能将每一列包装在一个元素中,然后使用外部网格容器将其包装。
以下是CSS 网格布局模块级别 2Editor's Draft的摘录:
2. 子网格
网格项本身可以是一个网格容器,通过给它设置 display: grid; 在这种情况下,其内容的布局将独立于它所参与的网格的布局。
在某些情况下,多个网格项的内容可能需要彼此对齐。本身就是网格项的网格容器可以将其行和列的定义推迟到其父网格容器,从而使其成为子网格。在这种情况下,子网格的网格项参与调整父网格容器的网格的大小,从而允许两个网格的内容对齐。
可以找到讨论这个问题的好读物here。
这是一个使用嵌套网格容器的模型(子网格可以看起来像这样,但不违反非相等表兄弟规则) - 请参阅下面的演示:
.wrapper {
display: grid;
grid-gap: 10px;
grid-template-columns: repeat(auto-fill, minmax(400px, 1fr));
}
.grid {
display: grid;
grid-template-rows: repeat(4, 1fr);
justify-items: flex-start;
border: 1px solid #07c;
}
img {
width: 100%;
}
button {
align-self: center;
justify-self: center;
}
p {
padding: 0 10px;
}Run Code Online (Sandbox Code Playgroud)
<div class="wrapper">
<div class="grid">
<h2 class="a">Header 1</h2>
<img class="b" src="https://placekitten.com/400/100" />
<p class="c">text
</p>
<button class="d">Button</button>
</div>
<div class="grid">
<h2 class="a">Header 2 is longer and may span multiple lines</h2>
<img class="b" src="https://placekitten.com/400/100" />
<p class="c">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis et cursus ligula. Maecenas non pharetra dui, eu tincidunt mi. Vivamus vitae luctus risus. Etiam vehicula sem est.
</p>
<button class="d">Button</button>
</div>
<div class="grid">
<h2 class="a">Header 1</h2>
<img class="b" src="https://placekitten.com/400/100" />
<p class="c">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis et cursus ligula. Maecenas non pharetra dui, eu tincidunt mi. Vivamus vitae luctus risus. Etiam vehicula sem est, non ultricies lectus placerat eget.
</p>
<button class="d">Button</button>
</div>
<div class="grid">
<h2 class="a">Header 1</h2>
<img class="b" src="https://placekitten.com/400/100" />
<p class="c">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis et cursus ligula. Maecenas non pharetra dui, eu tincidunt mi. Vivamus vitae luctus risus. Etiam vehicula sem est, non ultricies lectus placerat eget. Suspendisse pulvinar arcu massa, quis
varius velit facilisis tincidunt. Proin sed cursus orci.
</p>
<button class="d">Button</button>
</div>
<div class="grid">
<h2 class="a">Header 1</h2>
<img class="b" src="https://placekitten.com/400/100" />
<p class="c">Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</p>
<button class="d">Button</button>
</div>
</div>Run Code Online (Sandbox Code Playgroud)
一个可能的定义可能是:
.wrapper {
display: grid; /* outer grid */
/* sets a wrapping grid container with items of width around 400px */
grid-template-columns: repeat(auto-fill, minmax(400px, 1fr));
}
.grid {
grid-row: span 4; /* span 4 rows */
display: grid;
/* magic is here */
grid-template-rows: subgrid; /* create a sub-grid with the 4 parent grid rows */
}
Run Code Online (Sandbox Code Playgroud)