好的,经过更多的干预,我最初的想法奏效了。这意味着如果您有以下 HTML:
<ul class="grid-items">
<!-- <li>Row 1-1</li> -->
<li class="ui-grid-span-2">SPAN 2</li>
<li>Row 1-3</li>
<li>Row 1-4</li>
<li>Row 1-5</li>
<li>Row 1-6</li>
</ul>
列表元素的宽度可以按我的意愿设置:
ul > li:nth-child(-n+4).ui-grid-span-2 {
width: 33.33%;
}
ul > li:nth-child(-n+3).ui-grid-span-3 {
width: 50%;
}
ul > li:nth-child(-n+2).ui-grid-span-4 {
width: 66.66%;
}
ul > li:nth-child(-n+1).ui-grid-span-5 {
width: 83.33%;
}
请注意,通过跨越多个单元格,单元格的总数也会发生变化,因此必须根据跨越的单元格调整伪选择器。为了使其适用于多个单元格范围(并不总是如上所述的 6 个单元格),还需要在列表元素上添加一个类以记录一行中的单元格数。否则较大的选择器(取前 8 项)将覆盖/封装较小的选择器(取前 7 项)。
仍然对它不满意,并且每行只支持一个 rowspan,但是......它可以工作并且它没有使用上述任何建议的解决方案(~ 兄弟,x*y 单元格 * n 行跨度规则,flexbox 或表)。请记住,常规单元格宽度声明也需要修改,因为使用 rowspan 的行将具有较少的单元格数量,但需要原始预期数量的单元格宽度。
最多 8 个单元格网格的最终 CSS(为了便于理解,我没有合并声明)。
注意:
- ROWSPAN 部分是相关部分
- 在我确保单元格宽度是根据预期的而不是实际的单元格数设置之前
- 选择器的相关性被截断。
/* base width */
ul > li {
width: auto;
}
/* "cell width" */
ul > li:first-child:nth-last-child(1) {
width: 100%;
}
ul > li:first-child:nth-last-child(2),
ul > li:first-child:nth-last-child(2) ~ li {
width: 50%;
}
ul.ui-grid-column-3 > li:first-child:nth-last-child(n),
ul.ui-grid-column-3 > li:first-child:nth-last-child(n) ~ li {
width: 33.3333%;
}
ul.ui-grid-column-4 > li:first-child:nth-last-child(n),
ul.ui-grid-column-4 > li:first-child:nth-last-child(n) ~ li {
width: 25%;
}
ul.ui-grid-column-5 > li:first-child:nth-last-child(n),
ul.ui-grid-column-5 > li:first-child:nth-last-child(n) ~ li {
width: 20%;
}
ul.ui-grid-column-6 > li:first-child:nth-last-child(n),
ul.ui-grid-column-6 > li:first-child:nth-last-child(n) ~ li {
width: 16.667%;
}
ul.ui-grid-column-7 > li:first-child:nth-last-child(n),
ul.ui-grid-column-7 > li:first-child:nth-last-child(n) ~ li {
width: 14.285714286%;
}
ul.ui-grid-column-8 > li:first-child:nth-last-child(n),
ul.ui-grid-column-8 > li:first-child:nth-last-child(n) ~ li {
width: 12.5%;
}
/* ROWSPAN */
/* 3 cells */
ul.ui-grid-column-3 > li:nth-child(-n+2).ui-grid-span-2 {
width: 66.666%;
}
/* 4 cells */
ul.ui-grid-column-4 > li:nth-child(-n+3).ui-grid-span-2 {
width: 50%;
}
ul.ui-grid-column-4 > li:nth-child(-n+2).ui-grid-span-3 {
width: 75%;
}
/* 5 cells */
ul.ui-grid-column-5 > li:nth-child(-n+4).ui-grid-span-2 {
width: 40%;
}
ul.ui-grid-column-5 > li:nth-child(-n+3).ui-grid-span-3 {
width: 60%;
}
ul.ui-grid-column-5 > li:nth-child(-n+2).ui-grid-span-4 {
width: 80%;
}
/* 6 cells */
ul.ui-grid-column-6 > li:nth-child(-n+5).ui-grid-span-2 {
width: 33.33%;
}
ul.ui-grid-column-6 > li:nth-child(-n+4).ui-grid-span-3 {
width: 50%;
}
ul.ui-grid-column-6 > li:nth-child(-n+4).ui-grid-span-4 {
width: 66.66%;
}
ul.ui-grid-column-6 > li:nth-child(-n+4).ui-grid-span-5 {
width: 83.33%;
}
/* 7 cells */
ul.ui-grid-column-7 > li:nth-child(-n+6).ui-grid-span-2 {
width: 28.571428571%;
}
ul.ui-grid-column-7 > li:nth-child(-n+5).ui-grid-span-3 {
width: 42.857142857%;
}
ul.ui-grid-column-7 > li:nth-child(-n+4).ui-grid-span-4 {
width: 57.142857142%;
}
ul.ui-grid-column-7 > li:nth-child(-n+3).ui-grid-span-5 {
width: 71.428571428%;
}
ul.ui-grid-column-7 > li:nth-child(-n+2).ui-grid-span-6 {
width: 85.714285714%;
}
/* 8 cells */
ul.ui-grid-column-8 > li:nth-child(-n+7).ui-grid-span-2 {
width: 25%;
}
ul.ui-grid-column-8 > li:nth-child(-n+6).ui-grid-span-3 {
width: 37.5%;
}
ul.ui-grid-column-8 > li:nth-child(-n+5).ui-grid-span-4 {
width: 50%;
}
ul.ui-grid-column-8 > li:nth-child(-n+4).ui-grid-span-5 {
width: 62.5%;
}
ul.ui-grid-column-8 > li:nth-child(-n+3).ui-grid-span-6 {
width: 75%;
}
ul.ui-grid-column-8 > li:nth-child(-n+2).ui-grid-span-7 {
width: 87.5%;
}
/* responsive */
@media (max-width: 32em) {
ul > li,
ul[class*="ui-grid-column"] > li {
width: 100%;
}
}