这是我的HTML代码:
<div class="body-page-check-in-list">
...
<div class="body-page-check-in-item checked">a</div>
<div class="body-page-check-in-item checked">b</div>
<div class="body-page-check-in-item">c</div> <!-- c (1) -->
<div class="body-page-check-in-item">d</div> <!-- d (2) -->
<div class="body-page-check-in-item checked">e</div>
<div class="body-page-check-in-item checked">f</div>
<div class="body-page-check-in-item">g</div> <!-- g (3) -->
<div class="body-page-check-in-item">h</div> <!-- h (4) -->
<div class="body-page-check-in-item">i</div> <!-- i (5) -->
...
</div>
现在我想为类body-page-check-in-item
添加css,而不添加:not
选择器的最后一个匹配的类checked
。我试过这样做:
.body-page-check-in-item:not(.checked) {
display: none;
cursor: pointer;
}
但这将匹配所有的c (1)
、d (2)
、g (3)
、h (4)
、i (5)
。我以前问过这个问题,一个解决方案是改为:
.body-page-check-in-item.checked + :not(.checked) {
display: none;
cursor: pointer;
}
但该解决方案将同时匹配d (2)
和g (3)
,并且在这之后是可迭代的。
然而,我需要一个选择器,它只应用css一次,用于具有类checked
的上一个div
之后的下一个div
(即,在该示例中,它只将css应用于位置g (3)
处的类,而位置d (2)
处的类将不应用css。
我应该换什么?
非常感谢您的回答。
我认识到,您可能希望在没有javascript的情况下完全实现这一点,但一种方法是使用javascript:
- 确定目标元素
- 向该目标元素添加一个类
和,然后您可以在CSS中使用该类进行样式设置。
对于您给出的示例,您可以部署以下javascript:~
// GET ALL ITEMS
const allItems = [... document.querySelector('.body-page-check-in-item')];
// GET CHECKED ITEMS
const checkedItems = [... document.querySelector('.body-page-check-in-item.checked')];
// GET LAST CHECKED ITEM
const lastCheckedItem = checkedItems[(checkedItems.length - 1)];
// GET INDEX OF LAST CHECKED ITEM
const indexOfLastCheckedItem = allItems.indexOf(lastCheckedItem);
// GET TARGET ITEM
const targetItem = document.querySelector('.body-page-check-in-item')[(indexOfLastCheckedItem + 1)];
// APPLY TARGET CLASS TO TARGET ITEM
targetItem.classList.add('my-target-item');
现在您可以在CSS中设置.my-target-item
样式:
.my-target-item {
[... STYLES HERE...]
}
可能有一个生命破解来动态地针对最后一个选择器.body-page-check-in-item.checked
,但我做不到。如果这个html结构是常量(不变(,那么这将是实际的解决方案,使用伪类:nth-last-child()
,指定这个选择器的编号。
.body-page-check-in-item.checked:nth-last-child(4) + :not(.checked) {
color: red;
}
<div class="body-page-check-in-list">
<div class="body-page-check-in-item checked">a</div>
<div class="body-page-check-in-item checked">b</div>
<div class="body-page-check-in-item">c</div>
<div class="body-page-check-in-item">d</div>
<div class="body-page-check-in-item checked">e</div>
<div class="body-page-check-in-item checked">f</div>
<div class="body-page-check-in-item">g</div>
<div class="body-page-check-in-item">h</div>
<div class="body-page-check-in-item">i</div>
</div>