自从 subgrid
被广泛支持后,网格布局系统终于可以在前端被当成一把梭的存在 (和 flex
平起平坐了),下面就来看看。
来看这么一个例子 (取自 Subgrids Considered Essential):
<ul>
<li><label>Name:</label> <input id="name"></li>
<li><label>Email:</label> <input id="email"></li>
<li><label>Password:</label> <input id="password"></li>
</ul>
你的设计师朋友:这几个 label 能不能加个纵向对齐?
除了强行给 <label>
加个估算的 width
外,其实用 subgrid
就可以实现:
ul {
display: grid;
grid-template-columns: [column-1] max-content [column-2] 1fr [end];
}
ul li {
grid-column: span 2;
display: grid;
grid-template-columns: subgrid;
}
简单解释几点:
[name]
是用来给格线命名的,也可以不命名直接从 1 开始数 (或者从右侧 -1 开始数),也就是说本例中 [column-1]
实际上等于 1,[end]
实际上等于 3 或者 -1grid-template-columns: max-content 1fr
设置了这样一个网格:grid-column
是一个缩写属性,表示本元素在父网格中开始到结束的列格线,以下几个表示的都是前两格:
ul li {
grid-column: 1 / 3;
grid-column: 1 / span 2;
grid-column: span 2;
grid-column: column-1 / end; /* 可以通过命名更直观地表示范围 */
}
本例中,<li>
元素需要占满宽度,所以直接框选了一行里的所有格子grid-template-columns: subgrid
表示此网格继承父元素的网格位置,也就是刚刚用 grid-column: span 2
框住的两列display: grid
,其中 <ul>
是三行两列的,而每个 <li>
各自占住一行并且是两列的,并且他们的两列完全是同一个逻辑网格里的