代码之家  ›  专栏  ›  技术社区  ›  user1063287

如何将nth子样式应用于过滤后的div集?

  •  4
  • user1063287  · 技术社区  · 5 年前

    所需行为

    在容器(如1、3、5、7等)中的每三个可见子分区上应用样式设置,使用:

    .card:nth child(2n+1){
    右边距:20px!重要的;
    背景:粉色;
    }
    < /代码> 
    
    

    实际行为

    nth childStyletting is applied to all child div,whatever of visibility(this is known behavior).

    场景

    带有子分隔符的容器,这些分隔符在输入键上被过滤。

    过滤后,nth childstyleing is applied to all child divs,not just visible divs.

    .
    我所尝试的

    下面链接的答案提供了一个使用detach()的类似问题的解决方案,但我无法确定如何在每个keyup过滤器之后动态地重新插入分离的元素(并且不确定这是否是最佳方法)。

    https://stackoverflow.com/a/32380418

    jsFiddle:link

    {
    var input_val=$(this).val();
    var input_length=输入_val.length;
    //搜索至少2个字符
    如果(输入“长度”2){
    过滤卡(输入值);
    }否则,如果(输入长度<=2){
    $(“.card”).show();
    //删除匹配的文本样式
    //参见:https://stackoverflow.com/a/4232971
    $('span.matched_text').contents().unwrap();
    }
    (});
    
    //过滤函数
    功能滤波器卡(输入值){
    
    //遍历每张卡
    $(“.card”).each(function()。{
    
    var match_counter=0;
    
    //卡实例
    var$card=美元(this);
    
    var text=$card.text();
    
    变量存在于字符串中=
    text.tolowercase().indexof(input_val.tolowercase())!==1;
    
    if(存在于字符串中==false){
    $card.html(文本);
    }else if(exists_in_string==true){
    匹配_counter+=1;
    var reg=新regexp(输入_val,'i');
    $card.html(text.replace(reg,<span class=“matched洹text”>$amp;</span>');
    }
    
    if(匹配计数器>0){
    $卡。
    }否则{
    美元卡;
    }
    (});
    }<代码> < /PRE>
    
    *{
    框大小:边框框;
    }
    
    MyOpInter {
    宽度:100%;
    字体大小:48px;
    页底:20px;
    }
    
    MyoCARD {
    显示:Flex;
    柔性包装:包装;
    }
    
    卡{
    宽度:计算值(50%-10px);
    字体大小:38px;
    边框:1倍纯色000;
    底部边缘:30px;
    }
    
    
    /*添加子分隔符1、3、5、7等的边距*/
    
    .card:第n个子(2n+1){
    右边距:20px!重要的;
    背景:粉色;
    }
    
    匹配的文本{
    背景:绿色;
    颜色:白色;
    }<代码> < /PRE>
    
    <script src=“https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js”></script>
    <input class=“my_input”placeholder=“搜索您好,最少2个字符…”>
    
    <DIV class=“我的名片”>
    
    <div class=“card”data-initial_index=“0”>
    01-苹果和你好
    &L/DIV & GT;
    
    <div class=“card”data-initial_index=“1”>
    02-橙子和你好
    &L/DIV & GT;
    
    <div class=“card”data-initial_index=“2”>
    03香蕉
    &L/DIV & GT;
    
    <div class=“card”data-initial_index=“3”>
    04-西番莲和你好
    &L/DIV & GT;
    
    <div class=“card”data-initial_index=“4”>
    05-芒果和你好
    &L/DIV & GT;
    
    <div class=“card”data-initial_index=“5”>
    06-酸橙和你好
    &L/DIV & GT;
    
    
    </DIV>.
    < / div

    实际行为

    nth-child 无论可见性如何(这是已知的行为),样式都应用于所有子划分。

    脚本

    一种容器,其中包含在输入键上过滤的子分隔符。

    enter image description here

    过滤后, 第n个孩子 造型应用于所有的儿童沙发,而不仅仅是可见的沙发。

    enter image description here
    我试过什么

    下面链接的答案提供了一个解决类似问题的方法 detach() 但是,我不知道如何在每个keyup过滤器之后动态地重新插入分离的元素(并且不确定这是否是最好的方法)。

    https://stackoverflow.com/a/32380418

    jsFiddle: link

    $(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://stackoverflow.com/a/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>
    1 回复  |  直到 5 年前
        1
  •  3
  •   madalinivascu    5 年前

    你可以尝试结合 visible odd/even 更改CSS的伪选择器:

    $('.card:visible:even').css({ 'background': 'pink'});
    $('.card:visible:odd').css({ 'background': 'white'});
    

    $(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://stackoverflow.com/a/4232971
        $('span.matched_text').contents().unwrap();
      }
      $('.card:visible:even').css({ 'background': 'pink','marginRight':'20px'});
      $('.card:visible:odd').css({ 'background': 'white','marginRight':0});
    });
    
    // 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;
      overflow:hidden;
    }
    
    
    /* add margin on child divs 1,3,5,7 etc */
    
    .card:nth-child(2n+1) {
      margin-right: 20px;
      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>