我有一个响应式网格布局。根据窗口宽度,可以有任意数量的列。
我试图使网格具有方格图案,所以我使用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;
}Run Code Online (Sandbox Code Playgroud)
<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>Run Code Online (Sandbox Code Playgroud)
如果您知道行数或者至少知道它们的最大值,则可以使用渐变和多个背景轻松实现此目的。唯一的缺点是颜色将在容器上,因此您也可以为空单元格着色。
.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);
}Run Code Online (Sandbox Code Playgroud)
<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>Run Code Online (Sandbox Code Playgroud)
为了避免空单元格的着色,我们可以考虑使用伪元素但不透明的 hack:
.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;
}Run Code Online (Sandbox Code Playgroud)
<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>Run Code Online (Sandbox Code Playgroud)
要模拟间隙,您可以考虑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;
}Run Code Online (Sandbox Code Playgroud)
<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>Run Code Online (Sandbox Code Playgroud)
如果您希望间隙具有透明度,您可以考虑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;
}Run Code Online (Sandbox Code Playgroud)
<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>Run Code Online (Sandbox Code Playgroud)
使用时mask-composite我们不需要额外的层
.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:destination-in;
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;
}Run Code Online (Sandbox Code Playgroud)
<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>Run Code Online (Sandbox Code Playgroud)