我有一个灵敏的网格布局。根据窗口宽度,可以有任意数量的列。
我试图使网格具有方格图案,所以我使用odd
和even
选择器为网格单元着色。
但是它仅在列数为奇数时有效。当列数为偶数时,它将变成条纹图案。
是否有CSS属性/选择器来解决此问题,或者是一种更好的方法?
这是我的项目中显示问题的简化代码:
.grid {
display: grid;
counter-reset: spans;
grid-template-columns: repeat(var(--cols), 1fr);
grid-gap: 1px;
}
.grid > * {
counter-increment: spans;
text-align: center;
padding: 10px 0;
color: #fff;
}
.grid > *::after {
content: counter(spans);
}
/* Coloring */
.grid > *:nth-child(odd) {
background-color: #789;
}
.grid > *:not(:nth-child(odd)) {
background-color: #567;
}
<h2>Works when columns are odd</h2>
<div class="grid" style="--cols: 5;">
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
</div>
<h2>Doesn't work while even</h2>
<div class="grid" style="--cols: 4;">
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
</div>
答案 0 :(得分:3)
如果您知道行数或至少知道它们的最大值,则可以使用渐变和多背景轻松实现此目的。唯一的缺点是着色将在容器上,因此您也可以为空单元格着色。
.grid {
display: grid;
margin:10px 0;
counter-reset: spans;
grid-template-columns: repeat(var(--cols), 1fr);
grid-auto-rows: 40px;
--grad:repeating-linear-gradient(to right,red 0 calc(50% / var(--cols)),blue calc(50% / var(--cols)) calc(100% / var(--cols)));
background:
var(--grad),
var(--grad),
var(--grad),
var(--grad),
var(--grad);
background-size:200% 40px;
background-position:
0 calc(0*40px),
calc(100% / var(--cols)) calc(1*40px),
0 calc(2*40px),
calc(100% / var(--cols)) calc(3*40px),
0 calc(4*40px);
background-repeat:no-repeat;
}
.grid > * {
counter-increment: spans;
text-align: center;
padding: 10px 0;
color: #fff;
}
.grid > *::after {
content: counter(spans);
}
<div class="grid" style="--cols: 5;">
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
</div>
<div class="grid" style="--cols: 4;">
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
</div>
<div class="grid" style="--cols: 8;">
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
</div>
为避免空单元格变色,我们可以考虑使用伪元素但不透明的黑客行为:
.grid {
display: grid;
counter-reset: spans;
margin:10px 0;
grid-template-columns: repeat(var(--cols), 1fr);
grid-auto-rows: 40px;
--grad:repeating-linear-gradient(to right,red 0 calc(50% / var(--cols)),blue calc(50% / var(--cols)) calc(100% / var(--cols)));
background:
var(--grad),
var(--grad),
var(--grad),
var(--grad),
var(--grad);
background-size:200% 40px;
background-position:
0 calc(0*40px),
calc(100% / var(--cols)) calc(1*40px),
0 calc(2*40px),
calc(100% / var(--cols)) calc(3*40px),
0 calc(4*40px);
background-repeat:no-repeat;
overflow:hidden;
}
.grid > * {
counter-increment: spans;
text-align: center;
padding: 10px 0;
color: #fff;
position:relative;
}
.grid > *::after {
content: counter(spans);
}
.grid > *:last-child::before {
content:"";
position:absolute;
top:0;
bottom:0;
left:100%;
width:100vw;
background:#fff;
}
<div class="grid" style="--cols: 5;">
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
</div>
<div class="grid" style="--cols: 4;">
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
</div>
<div class="grid" style="--cols: 8;">
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
</div>
要模拟差距,您可以考虑在网格项目上使用outline
(仍然没有透明度):
.grid {
display: grid;
counter-reset: spans;
margin:10px 0;
grid-template-columns: repeat(var(--cols), 1fr);
grid-auto-rows: 40px;
--grad:repeating-linear-gradient(to right,red 0 calc(50% / var(--cols)),blue calc(50% / var(--cols)) calc(100% / var(--cols)));
background:
var(--grad),
var(--grad),
var(--grad),
var(--grad),
var(--grad);
background-size:200% 40px;
background-position:
0 calc(0*40px),
calc(100% / var(--cols)) calc(1*40px),
0 calc(2*40px),
calc(100% / var(--cols)) calc(3*40px),
0 calc(4*40px);
background-repeat:no-repeat;
overflow:hidden;
}
.grid > * {
counter-increment: spans;
text-align: center;
padding: 10px 0;
color: #fff;
position:relative;
outline:1px solid #fff;
}
.grid > *::after {
content: counter(spans);
}
.grid > *:last-child::before {
content:"";
position:absolute;
top:0;
bottom:0;
left:100%;
width:100vw;
background:#fff;
}
<div class="grid" style="--cols: 5;">
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
</div>
<div class="grid" style="--cols: 4;">
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
</div>
<div class="grid" style="--cols: 8;">
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
</div>
如果您希望间隙的透明度,可以考虑使用渐变定义的mask
。您将为此需要一个额外的包装器:
.grid {
display: grid;
counter-reset: spans;
grid-template-columns: repeat(var(--cols), 1fr);
grid-auto-rows: 40px;
--grad:repeating-linear-gradient(to right,red 0 calc(50% / var(--cols)),blue calc(50% / var(--cols)) calc(100% / var(--cols)));
background:
var(--grad),
var(--grad),
var(--grad),
var(--grad),
var(--grad);
background-size:200% 40px;
background-position:
0 calc(0*40px),
calc(100% / var(--cols)) calc(1*40px),
0 calc(2*40px),
calc(100% / var(--cols)) calc(3*40px),
0 calc(4*40px);
background-repeat:no-repeat;
-webkit-mask:
repeating-linear-gradient(to right,
transparent 0 1px,#fff 1px calc(100% / var(--cols) - 1px),
transparent calc(100% / var(--cols) - 1px) calc(100% / var(--cols)))
center/calc(100% + 2px) 100%;
mask:
repeating-linear-gradient(to right,
transparent 0 1px,#fff 1px calc(100% / var(--cols) - 1px),
transparent calc(100% / var(--cols) - 1px) calc(100% / var(--cols)))
center/calc(100% + 2px) 100%;
}
.wrapper {
margin:30px 0;
-webkit-mask:repeating-linear-gradient(to bottom,
transparent 0 1px,#fff 1px calc(40px - 1px),
transparent calc(40px - 1px) 40px)
center/100% calc(100% + 2px);
mask:repeating-linear-gradient(to bottom,
transparent 0 1px,#fff 1px calc(40px - 1px),
transparent calc(40px - 1px) 40px)
center/100% calc(100% + 2px);
}
.grid > * {
counter-increment: spans;
text-align: center;
padding: 10px 0;
color: #fff;
position:relative;
}
.grid > *::after {
content: counter(spans);
}
body {
background:yellow;
}
<div class="wrapper">
<div class="grid" style="--cols: 5;">
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
</div>
</div>
<div class="wrapper">
<div class="grid" style="--cols: 4;">
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
</div>
</div>
<div class="wrapper">
<div class="grid" style="--cols: 8;">
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
</div>
</div>
使用mask-composite
和ìntersect
值,我们不需要额外的层,但实际上它仅适用于Firefox:
.grid {
display: grid;
counter-reset: spans;
margin:30px 0;
grid-template-columns: repeat(var(--cols), 1fr);
grid-auto-rows: 40px;
--grad:repeating-linear-gradient(to right,red 0 calc(50% / var(--cols)),blue calc(50% / var(--cols)) calc(100% / var(--cols)));
background:
var(--grad),
var(--grad),
var(--grad),
var(--grad),
var(--grad);
background-size:200% 40px;
background-position:
0 calc(0*40px),
calc(100% / var(--cols)) calc(1*40px),
0 calc(2*40px),
calc(100% / var(--cols)) calc(3*40px),
0 calc(4*40px);
background-repeat:no-repeat;
-webkit-mask:
repeating-linear-gradient(to right,
transparent 0 1px,#fff 1px calc(100% / var(--cols) - 1px),
transparent calc(100% / var(--cols) - 1px) calc(100% / var(--cols)))
center/calc(100% + 2px) 100%,
repeating-linear-gradient(to bottom,
transparent 0 1px,#fff 1px calc(40px - 1px),
transparent calc(40px - 1px) 40px)
center/100% calc(100% + 2px);
mask:
repeating-linear-gradient(to right,
transparent 0 1px,#fff 1px calc(100% / var(--cols) - 1px),
transparent calc(100% / var(--cols) - 1px) calc(100% / var(--cols)))
center/calc(100% + 2px) 100%,
repeating-linear-gradient(to bottom,
transparent 0 1px,#fff 1px calc(40px - 1px),
transparent calc(40px - 1px) 40px)
center/100% calc(100% + 2px);
-webkit-mask-composite:intersect;
mask-composite:intersect;
}
.grid > * {
counter-increment: spans;
text-align: center;
padding: 10px 0;
color: #fff;
position:relative;
}
.grid > *::after {
content: counter(spans);
}
body {
background:yellow;
}
<div class="grid" style="--cols: 5;">
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
</div>
<div class="grid" style="--cols: 4;">
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
</div>
<div class="grid" style="--cols: 8;">
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
</div>