html - 使用自动放置包装 CSS 网格
问题描述
我正在尝试构建一个包含类似卡片的项目的网格。每种类型的单元格(标题、图像、文本、按钮...)在每一行中的高度都应该相等,由最大单元格的内容决定,如下面的代码片段所示。
现在我试图限制列数,让卡片换行,就像我flex-wrap: wrap;
在基于 flexbox 的解决方案中使用的一样。列数应通过媒体查询确定。如果不使用尚未支持的子网格,这可能吗?
此外,使用子网格的解决方案会是什么样子?我猜它会降级为当前浏览器中高度不等的单元格?
.grid {
display: grid;
grid-template-rows: repeat(4, auto);
grid-gap: 10px;
grid-auto-flow: column;
grid-auto-columns: auto;
}
<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>
解决方案
这是我们需要子网格时的一个很好的例子- 对齐网格表兄弟在这个问题中的布局中是必不可少的。
在浏览器实现提议的2 级规范之前Subgrids
,我们只能将每一列包装在一个元素中,然后使用外部网格容器包装它。
Editor's Draft
以下是CSS Grid Layout Module Level 2的摘录:
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;
}
<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>
一个可能的定义是:
.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 */
}
推荐阅读
- java - 扫描仪无法在 Mac 上运行。我认为它无法接受方法中的 int 值
- visual-studio-code - 有什么方法可以在保持编辑器黑暗的同时拥有一个轻量级的侧边栏?
- javascript - 使用 PHP 在图像上键入文本并使用 Ajax 进行处理
- java - 如何在 Java 中“包含”代码而不是将其包含在每个文件中?
- sql - 如何在 SQL 中进行双重计算?
- grafana - Grafana Query 挑战 $ 和 ^
- java - 调用 bazel 构建的 java 程序的原始命令行是什么?
- html - 图像样式“object-fit: contains”在 Google Chrome 版本 72.0.3626.109 中被破坏
- kubernetes - Kubernetes:如何在不更改外部 IP 地址的情况下更新命名空间?
- javascript - 如何修复未捕获的类型错误:无法读取 null 的属性“href”