我有很多div,其中的类line
中包含strong.datum
元素。我需要使用类.active
突出显示每个序列的第一个和最后一个元素。如果无法使用CSS做到这一点,那么有没有可能通过jQuery做到这一点?
在此示例中,类.start
的元素为.dt_26, .dt_66, .dt_27, .dt_77
,类.end
的元素为.dt_46, .dt_76, .dt_57 and .dt_97
。
<div class="line">
<strong class="dt_16 app_54 datum">1.6.</strong>
<strong class="dt_26 app_54 datum active">2.6.</strong>
<strong class="dt_36 app_54 datum active">3.6.</strong>
<strong class="dt_46 app_54 datum active">4.6.</strong>
<strong class="dt_56 app_54 datum">5.6.</strong>
<strong class="dt_66 app_54 datum active">6.6.</strong>
<strong class="dt_76 app_54 datum active">7.6.</strong>
<strong class="dt_86 app_54 datum active">8.6.</strong>
<strong class="dt_96 app_54 datum active">9.6.</strong>
<strong class="dt_106 app_54 datum">10.6.</strong>
</div>
<div class="line">
<strong class="dt_17 app_54 datum">1.7.</strong>
<strong class="dt_27 app_54 datum active">2.7.</strong>
<strong class="dt_37 app_54 datum active">3.7.</strong>
<strong class="dt_47 app_54 datum active">4.7.</strong>
<strong class="dt_57 app_54 datum active">5.7.</strong>
<strong class="dt_67 app_54 datum">6.7.</strong>
<strong class="dt_77 app_54 datum">7.7.</strong>
<strong class="dt_87 app_54 datum active">8.7.</strong>
<strong class="dt_97 app_54 datum active">9.7.</strong>
<strong class="dt_107 app_54 datum">10.7.</strong>
</div>
答案 0 :(得分:1)
AFAIK您不能通过CSS选择具有其他要求(例如特定类等)的第一个和最后一个元素 。使用jQuery非常简单。
$(document).ready(function() {
$(".line").each(function(i, line) {
$(line).children("strong.active:first, strong.active:last").addClass("highlight");
});
});
.highlight {
background-color: yellow;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="line">
<strong class="dt_16 app_54 datum">1.6.</strong>
<strong class="dt_26 app_54 datum active">2.6.</strong>
<strong class="dt_36 app_54 datum active">3.6.</strong>
<strong class="dt_46 app_54 datum active">4.6.</strong>
<strong class="dt_56 app_54 datum">5.6.</strong>
<strong class="dt_66 app_54 datum active">6.6.</strong>
<strong class="dt_76 app_54 datum active">7.6.</strong>
<strong class="dt_86 app_54 datum active">8.6.</strong>
<strong class="dt_96 app_54 datum active">9.6.</strong>
<strong class="dt_106 app_54 datum">10.6.</strong>
</div>
<div class="line">
<strong class="dt_17 app_54 datum">1.7.</strong>
<strong class="dt_27 app_54 datum active">2.7.</strong>
<strong class="dt_37 app_54 datum active">3.7.</strong>
<strong class="dt_47 app_54 datum active">4.7.</strong>
<strong class="dt_57 app_54 datum active">5.7.</strong>
<strong class="dt_67 app_54 datum">6.7.</strong>
<strong class="dt_77 app_54 datum">7.7.</strong>
<strong class="dt_87 app_54 datum active">8.7.</strong>
<strong class="dt_97 app_54 datum active">9.7.</strong>
<strong class="dt_107 app_54 datum">10.7.</strong>
</div>
它起作用的原因,例如:
.line > strong.active:first {
background-color: yellow;
}
不起作用是因为jQuery解析引擎与CSS选择器不完全相同。 jQuery中的:first只会选择选择器之后的第一个元素,其中-:first
是css,字面意思是第一个元素与选择器无关,因此(CSS)如果您的选择器删除了第一个元素,则{{ 1}}永不匹配。
答案 1 :(得分:1)
在CSS中不可能完全是 -因此,这是一种普通的JS解决方案-请参见内联说明:
// get a list of line elemnts
[...document.querySelectorAll('.line')].forEach(function(line) {
// reduce the child elements
[...line.querySelectorAll('strong')].reduce(function(p,c) {
if (c.classList.contains('active')) {
if(!p) // mark first
c.classList.add('first');
// mark last after checking the following child
if((!c.nextElementSibling || !c.nextElementSibling.classList.contains('active')) && p)
c.classList.add('last');
return true;
}
return false;
}, false);
})
.first {
color: cadetblue;
}
.last {
color: red;
}
<div class="line">
<strong class="dt_16 app_54 datum">1.6.</strong>
<strong class="dt_26 app_54 datum active">2.6.</strong>
<strong class="dt_36 app_54 datum active">3.6.</strong>
<strong class="dt_46 app_54 datum active">4.6.</strong>
<strong class="dt_56 app_54 datum">5.6.</strong>
<strong class="dt_66 app_54 datum active">6.6.</strong>
<strong class="dt_76 app_54 datum active">7.6.</strong>
<strong class="dt_86 app_54 datum active">8.6.</strong>
<strong class="dt_96 app_54 datum active">9.6.</strong>
<strong class="dt_106 app_54 datum">10.6.</strong>
</div>
<div class="line">
<strong class="dt_17 app_54 datum">1.7.</strong>
<strong class="dt_27 app_54 datum active">2.7.</strong>
<strong class="dt_37 app_54 datum active">3.7.</strong>
<strong class="dt_47 app_54 datum active">4.7.</strong>
<strong class="dt_57 app_54 datum active">5.7.</strong>
<strong class="dt_67 app_54 datum">6.7.</strong>
<strong class="dt_77 app_54 datum">7.7.</strong>
<strong class="dt_87 app_54 datum active">8.7.</strong>
<strong class="dt_97 app_54 datum active">9.7.</strong>
<strong class="dt_107 app_54 datum">10.7.</strong>
</div>
答案 2 :(得分:1)
这是一个jQuery解决方案...
使用.prev()
和.next()
,可以遍历所有.line
.children()
元素,并检查它们是第一个还是最后一个。
我什至为它增添了乐趣...您还可以检查它们是否“孤独” ...;)
如您所见,代码很容易说明...
$(".line").children().each(function(){
// Firsts
if( $(this).hasClass("active") && !$(this).prev().hasClass("active") ){
$(this).addClass("first");
}
// Lasts
if( $(this).hasClass("active") && !$(this).next().hasClass("active") ){
$(this).addClass("last");
}
// Lonelies
if( $(this).hasClass("active") && !$(this).prev().hasClass("active") && !$(this).next().hasClass("active") ){
$(this).removeClass("first last").addClass("alone");
}
});
.first{
color: green;
}
.last{
color: orange;
}
.alone{
color: red;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="line">
<strong class="dt_16 app_54 datum">1.6.</strong>
<strong class="dt_26 app_54 datum active">2.6.</strong>
<strong class="dt_36 app_54 datum active">3.6.</strong>
<strong class="dt_46 app_54 datum active">4.6.</strong>
<strong class="dt_56 app_54 datum">5.6.</strong>
<strong class="dt_66 app_54 datum active">6.6.</strong>
<strong class="dt_76 app_54 datum active">7.6.</strong>
<strong class="dt_86 app_54 datum active">8.6.</strong>
<strong class="dt_96 app_54 datum active">9.6.</strong>
<strong class="dt_106 app_54 datum">10.6.</strong>
</div>
<div class="line">
<strong class="dt_17 app_54 datum">1.7.</strong>
<strong class="dt_27 app_54 datum active">2.7.</strong>
<strong class="dt_37 app_54 datum active">3.7.</strong>
<strong class="dt_47 app_54 datum active">4.7.</strong>
<strong class="dt_57 app_54 datum active">5.7.</strong>
<strong class="dt_67 app_54 datum">6.7.</strong>
<strong class="dt_77 app_54 datum">7.7.</strong>
<strong class="dt_87 app_54 datum active">8.7.</strong>
<strong class="dt_97 app_54 datum">9.7.</strong>
<strong class="dt_107 app_54 datum">10.7.</strong>
</div>