我怎样才能只用第 n 个子对象定位可见对象?

How can I target only visible objects with nth-child?

我有 5 个项目,它们上方有一个按钮,用于通知将显示多少个项目。 对于每个项目,我都有不同的背景图片。

问题是,当一个人点击一个项目时,该项目将被删除,另一个项目将是 appended 和 jQuery,当一个新项目被追加时,它会走到最后行,使其成为第 5 个元素,然后使其与第 5 个项目的背景一起使用,但有时第 5 个项目是唯一可见的,它应该与第一个项目的背景一起使用。

这是一个 JSFiddle: https://jsfiddle.net/wmerussi/csqge7jr/

一开始你有5个项目,注意第5个项目是蓝色的,现在如果你选择只显示一个项目,然后点击那个项目将其删除,另一个项目将是蓝色的(第5个项目的颜色项).

是否可以只定位可见的项目? 或者是否可以将可见的 <li> 重新排列到列表的开头?

HTML:

<div class="one">1</div>
<div class="two">2</div>
<div class="three">3</div>
<div class="four">4</div>
<div class="five">5</div>

<ul>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
</ul>

jQuery:

$('div').on('click', function() {
    var num = $(this).text();
    for(var i=0; i<5 ;i++) {
        if(i < num) {
            $('li').eq(i).fadeIn();
        } else {
            $('li').eq(i).fadeOut();
        }
    }
});

$(document).on('click', 'li', function() {
    $(this).fadeOut(function() {$(this).remove();});
    $(this).parent().append('<li></li>');
});

CSS:

div {
    display: inline-block;
    margin-right: 10px;
    width: 30px;
    height: 30px;
}

li:nth-child(1), .one {
    background-color: green;
}


li:nth-child(2), .two{
    background-color: orange;
}

li:nth-child(3), .three{
    background-color: red;
}

li:nth-child(4), .four{
    background-color: pink;
}

li:nth-child(5), .five{
    background-color: blue;
}

更新
如何重现问题
单击我的 JSFiddle,然后选择仅显示 1 个项目(顶部的绿色“1”框)。之后,如果您单击该可见项将其删除(使用 jQuery),您将看到附加的项将是蓝色的,因为它们被附加到 ul 列表的末尾,使其成为第 5 个元素。但它是第一个可见的项目,所以它应该是绿色的。

您在元素中添加或删除 visible class。

然后,使用这些选择器代替 :nth-child:

.visible, .one {
    background-color: green;
}
.visible ~ .visible, .two {
    background-color: orange;
}
.visible ~ .visible ~ .visible, .three {
    background-color: red;
}
.visible ~ .visible ~ .visible ~ .visible, .four {
    background-color: pink;
}
.visible ~ .visible ~ .visible ~ .visible ~ .visible, .five {
    background-color: blue;
}

$('div').on('click', function() {
  var num = $(this).text();
  for (var i = 0; i < 5; i++) {
    if (i < num) {
      $('li').eq(i).addClass('visible').fadeIn();
    } else {
      $('li').eq(i).removeClass('visible').fadeOut();
    }
  }
});
$('li').addClass('visible');
$(document).on('click', 'li.visible', function() {
  $(this)
    .removeClass('visible')
    .fadeOut(function() {
      $(this).remove();
    })
    .parent().append('<li class="visible"></li>');
});
div {
  display: inline-block;
  margin-right: 10px;
  width: 30px;
  height: 30px;
}
.visible,
.one {
  background-color: green;
}
.visible ~ .visible,
.two {
  background-color: orange;
}
.visible ~ .visible ~ .visible,
.three {
  background-color: red;
}
.visible ~ .visible ~ .visible ~ .visible,
.four {
  background-color: pink;
}
.visible ~ .visible ~ .visible ~ .visible ~ .visible,
.five {
  background-color: blue;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<div class="one">1</div>
<div class="two">2</div>
<div class="three">3</div>
<div class="four">4</div>
<div class="five">5</div>
<ul>
  <li></li>
  <li></li>
  <li></li>
  <li></li>
  <li></li>
</ul>

我的解决方案是创建一个函数,根据项目的位置和可见性管理添加删除 类,并在每次以某种方式更新项目的事件后调用该函数。
这样您就可以将项目 类 管理与更新项目

的代码分开

$(function() {

  //the class management function
  function updateElemClasses() {
    //all color based classes the lists can have
    var classes = ['one', 'two', 'three', 'four', 'five'];

    //wait for fadeout to happen. Fadeout could take longer but this is just a proof of concept
    window.setTimeout(function() {
      $('li:visible').each(function(idx) {
        $(this).removeClass(classes.join(' ')).addClass(classes[idx]);
      })
    }, 500);

  }

  $('div').on('click', function() {
    var num = $(this).text();
    for (var i = 0; i < 5; i++) {
      if (i < num) {
        $('li').eq(i).fadeIn();
      } else {
        $('li').eq(i).fadeOut();
      }
    }
    updateElemClasses()
  });

  $(document).on('click', 'li', function() {
    $(this).fadeOut(function() {
      $(this).remove();
    });
    $(this).parent().append('<li>' + $(this).text() + '</li>');

    updateElemClasses()
  });

  updateElemClasses();
});
/* you do not need nth-child now */

div {
  display: inline-block;
  margin-right: 10px;
  width: 30px;
  height: 30px;
}
.one {
  background-color: green;
}
.two {
  background-color: orange;
}
.three {
  background-color: red;
}
.four {
  background-color: pink;
}
.five {
  background-color: blue;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script>
<div class="one">1</div>
<div class="two">2</div>
<div class="three">3</div>
<div class="four">4</div>
<div class="five">5</div>

<ul>
  <li>1</li>
  <li>2</li>
  <li>3</li>
  <li>4</li>
  <li>5</li>
</ul>