预期行为
对容器中每个可见的第三个子div应用样式(即1、3、5、7等),使用:
.card:nth-child(2n+1) {
margin-right: 20px !important;
background: pink;
}
实际行为
nth-child
样式应用于所有子 div,无论其是否可见(这是已知的行为)。
场景
一个包含子 div 的容器,在输入关键字时对其进行筛选。
在筛选后,nth-child
样式被应用于所有子 div,而不仅仅是可见的 div。
下面链接中的答案提供了一个类似问题的解决方案,利用了 detach()
,但我无法弄清楚如何在每次 keyup 筛选后动态重新插入分离的元素(并且不确定这是否是最佳方法)。
https://dev59.com/yFwY5IYBdhLWcg3wq5Qd#32380418
jsFiddle: 链接
$(document).on("keyup", ".my_input", function() {
var input_val = $(this).val();
var input_length = input_val.length;
// minimum 2 chars for search
if (input_length > 2) {
filter_cards(input_val);
} else if (input_length <= 2) {
$(".card").show();
// remove matched text styling
// see: https://dev59.com/a2855IYBdhLWcg3woV7M#4232971
$('span.matched_text').contents().unwrap();
}
});
// filter function
function filter_cards(input_val) {
// iterate over each card
$(".card").each(function() {
var match_counter = 0;
// instance of card
var $card = $(this);
var text = $card.text();
var exists_in_string =
text.toLowerCase().indexOf(input_val.toLowerCase()) !== -1;
if (exists_in_string === false) {
$card.html(text);
} else if (exists_in_string === true) {
match_counter += 1;
var reg = new RegExp(input_val, 'i');
$card.html(text.replace(reg, '<span class="matched_text">$&</span>'));
}
if (match_counter > 0) {
$card.show();
} else {
$card.hide();
}
});
}
* {
box-sizing: border-box;
}
.my_input {
width: 100%;
font-size: 48px;
margin-bottom: 20px;
}
.my_cards {
display: flex;
flex-wrap: wrap;
}
.card {
width: calc(50% - 10px);
font-size: 38px;
border: 1px solid #000;
margin-bottom: 30px;
}
/* add margin on child divs 1,3,5,7 etc */
.card:nth-child(2n+1) {
margin-right: 20px !important;
background: pink;
}
.matched_text {
background: green;
color: white;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input class="my_input" placeholder="search for hello, min 2 chars...">
<div class="my_cards">
<div class="card" data-initial_index="0">
01 - apples and hello
</div>
<div class="card" data-initial_index="1">
02 - oranges and hello
</div>
<div class="card" data-initial_index="2">
03 - bananas
</div>
<div class="card" data-initial_index="3">
04 - passionfruits and hello
</div>
<div class="card" data-initial_index="4">
05 - mangos and hello
</div>
<div class="card" data-initial_index="5">
06 - limes and hello
</div>
</div>
filter_cards
函数的末尾:$(“.card:visible”).each(function(index){ //如果是奇数 if((index + 1)%2 === 1){$(this).addClass(“odd_div_styling”);} else {$(this).removeClass(“odd_div_styling”);} });
看起来可以工作:https://jsfiddle.net/rwone/29suzbw3/1/ 随意发布为答案。 - user1063287