所以我有一个搜索结果网格。这些结果是可选的,当它们被选中时,我会将class='selected'
添加到它们中。
可以有多组结果(通过命令/按住Ctrl键单击行来完成)。根据结果组,我的意思是选择的连续元素。我想要做的是,只将顶部边框添加到任何给定选定结果组中的第一个,并将底部边框添加到给定组的最后一个项目。
有没有一个很好的方法用CSS做到这一点?或者我是否必须在每个群组中应用.first
和.last
?
例如,考虑这个近似的HTML(行数不完全匹配):
<ul>
<li>Gray row</li>
<li class="selected">Blue row - should have border-top-color only</li>
<li class="selected">Blue row - should have NO border-top-color or border-bottom-color</li>
<li class="selected">Blue row - should have border-bottom-color only</li>
<li>Gray row</li>
<li>Gray row</li>
<li class="selected">Blue row - should have border-top-color and border-bottom-color</li>
</ul>
这就是我想要它的样子。这是在Chrome Devtools中伪造的。
答案 0 :(得分:5)
您可以使用下面代码段中的选择器组合来实现您想要的效果。虽然下面的代码段显示它是可能的,但我仍然建议使用类,因为我确信在Ctrl + Click期间你会有JS添加类。
以下是代码段中的选择器:
.selected
- 使用所需的border-top
类为每个元素添加selected
。.selected + .selected
- 如果border-top
元素前面有另一个selected
类的元素,则selected
为空。.selected + :not(.selected)
- 向每个没有border-top
类但前面有selected
类元素的元素添加selected
。这类似于小组的border-bottom
。.selected:last-child
- 这适用于last-child
是具有selected
类的边缘情况。在这种情况下,前一个选择器将不适用,因此该组的底部边框将丢失。
.selected {
background-color: #DBEAF7;
border-top: 1px solid #9FC5F8;
}
.selected + .selected {
border-top: none;
}
.selected +:not(.selected) {
border-top: 1px solid #9FC5F8;
}
.selected:last-child {
border-bottom: 1px solid #9FC5F8;
}
ul {
list-style-type: none;
}
ul li {
display: block;
width: 100px;
height: 20px;
}
<ul>
<li>Processed</li>
<li>Processed</li>
<li>Processed</li>
<li class="selected">Rejected</li>
<li class="selected">Rejected</li>
<li class="selected">Rejected</li>
<li>Processed</li>
<li class="selected">Rejected</li>
<li class="selected">Rejected</li>
<li>Processed</li>
<li>Processed</li>
<li>Processed</li>
<li class="selected">Rejected</li>
<li class="selected">Rejected</li>
</ul>
<ul>
<li>Processed</li>
<li>Processed</li>
<li>Processed</li>
<li class="selected">Rejected</li>
<li class="selected">Rejected</li>
<li class="selected">Rejected</li>
<li>Processed</li>
<li class="selected">Rejected</li>
<li class="selected">Rejected</li>
<li>Processed</li>
<li>Processed</li>
<li>Processed</li>
<li class="selected">Rejected</li>
<li>Processed</li>
</ul>
答案 1 :(得分:0)
我试过这种方式..
li.selected {
background-color: #DBEAF7;
border-top: 1px solid #9FC5F8;
border-bottom: 1px solid #9FC5F8;
}
.selected{
margin-bottom:-1px;
}
.selected + .selected{
border-top:none;
margin-bottom:-1px;
}
&#13;
<ul>
<li>Processed</li>
<li>Processed</li>
<li>Processed</li>
<li class="selected">Rejected</li>
<li class="selected">Rejected</li>
<li class="selected">Rejected</li>
<li>Processed</li>
<li class="selected">Rejected</li>
<li class="selected">Rejected</li>
<li>Processed</li>
<li>Processed</li>
<li>Processed</li>
<li class="selected">Rejected</li>
<li class="selected">Rejected</li>
</ul>
<ul>
<li>Processed</li>
<li>Processed</li>
<li>Processed</li>
<li class="selected">Rejected</li>
<li class="selected">Rejected</li>
<li class="selected">Rejected</li>
<li>Processed</li>
<li class="selected">Rejected</li>
<li class="selected">Rejected</li>
<li>Processed</li>
<li>Processed</li>
<li>Processed</li>
<li class="selected">Rejected</li>
<li>Processed</li>
</ul>
&#13;
这是工作演示小提琴
<强> Demo 强>