从 children 的潜在无限列表中选择 nth-child
Selecting nth-child of potentially infinite list of children
我有一个网格布局 - 每行 4 列。我正在使用 CSS 网格布局。
假设可能有无限数量的项目。
<div class="grid">
<div class="item"></div>
<div class="item"></div>
<!-- ... -->
</div>
如果项目的数量可能是无限的,我怎么能 select 每行的两个中间项目。例如,对于前三行,我需要 select:
nth-child(2)
、nth-child(3)
、nth-child(6)
、nth-child(7)
、nth-child(10)
、nth-child(11)
假设不会有无限数量,我可以将样式硬编码到特定数量,但如果有办法动态地做到这一点,我宁愿这样做。
您可以使用 .item:nth-child(4n+2)
定位每四个 child(从第 2 个 child 开始)和 .item:nth-child(4n+3)
定位每四个 child(从第 3 个 child) 开始。这是示例:
.item:nth-child(4n+2),
.item:nth-child(4n+3) {
color: red;
background-color: yellow;
}
<div class="grid">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5</div>
<div class="item">6</div>
<div class="item">7</div>
<div class="item">8</div>
<div class="item">9</div>
<div class="item">10</div>
<div class="item">11</div>
<div class="item">12</div>
</div>
以下为js解决方案:
var items = document.getElementsByClassName('item');
for (i = 0; i < items.length; i++) {
if(i % 2 === 0 && i % 4 === 0) {
var el1 = items[i + 1];
var el2 = items[i + 2];
if (el1)
el1.style.backgroundColor = "red";
if (el2)
el2.style.backgroundColor = "red";
}
}
.grid {
display:grid;
grid-template-columns: 100px 100px 100px 100px;
}
.item {
border:1px solid black;
padding:20px;
margin:4px;
}
<div class="grid">
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
</div>
使用 nth-child(xN+y)
语法...
.container {
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-gap: 25px;
}
.box {
padding: 1em;
border: 1px solid grey;
}
.container :nth-child(4n+2) {
background: red;
}
.container :nth-child(4n+3) {
background: blue;
}
<div class="container">
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
</div>
我有一个网格布局 - 每行 4 列。我正在使用 CSS 网格布局。
假设可能有无限数量的项目。
<div class="grid">
<div class="item"></div>
<div class="item"></div>
<!-- ... -->
</div>
如果项目的数量可能是无限的,我怎么能 select 每行的两个中间项目。例如,对于前三行,我需要 select:
nth-child(2)
、nth-child(3)
、nth-child(6)
、nth-child(7)
、nth-child(10)
、nth-child(11)
假设不会有无限数量,我可以将样式硬编码到特定数量,但如果有办法动态地做到这一点,我宁愿这样做。
您可以使用 .item:nth-child(4n+2)
定位每四个 child(从第 2 个 child 开始)和 .item:nth-child(4n+3)
定位每四个 child(从第 3 个 child) 开始。这是示例:
.item:nth-child(4n+2),
.item:nth-child(4n+3) {
color: red;
background-color: yellow;
}
<div class="grid">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5</div>
<div class="item">6</div>
<div class="item">7</div>
<div class="item">8</div>
<div class="item">9</div>
<div class="item">10</div>
<div class="item">11</div>
<div class="item">12</div>
</div>
以下为js解决方案:
var items = document.getElementsByClassName('item');
for (i = 0; i < items.length; i++) {
if(i % 2 === 0 && i % 4 === 0) {
var el1 = items[i + 1];
var el2 = items[i + 2];
if (el1)
el1.style.backgroundColor = "red";
if (el2)
el2.style.backgroundColor = "red";
}
}
.grid {
display:grid;
grid-template-columns: 100px 100px 100px 100px;
}
.item {
border:1px solid black;
padding:20px;
margin:4px;
}
<div class="grid">
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
</div>
使用 nth-child(xN+y)
语法...
.container {
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-gap: 25px;
}
.box {
padding: 1em;
border: 1px solid grey;
}
.container :nth-child(4n+2) {
background: red;
}
.container :nth-child(4n+3) {
background: blue;
}
<div class="container">
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
</div>