简体   繁体   English

如何使用jQuery将每个项目的背景颜色设置为下一个项目?

[英]How to set background color of every item to next item using jQuery?

I have a list has 4 item and every item has specific background color that setted in style attribute. 我有一个包含4个项目的列表,每个项目都有在style属性中设置的特定背景色。

<div class="list">
  <div style="background: red"></div>
  <div style="background: blue"></div>
  <div style="background: green"></div>
  <div style="background: yellow"></div>
</div>

I want to set background color of every item to next item. 我想将每个项目的背景颜色设置为下一个项目。 The above html should changed to 上面的html应该改为

<div class="list">
  <div style="background: yellow"></div>
  <div style="background: red"></div>
  <div style="background: blue"></div>
  <div style="background: green"></div>  
</div>

I have this code but it doesn't work. 我有此代码,但无法正常工作。

$(".list > div").each(function(i){
  var index = i == 0 ? 3 : i-1;
  this.style.background = $(".list > div").eq(index)[0].style.background;
});

The code set color of last item to all items. 代码将最后一项的颜色设置为所有项。 What is problem? 怎么了

 setInterval(function(){ $(".list > div").each(function(i){ var index = i == 0 ? 3 : i-1; this.style.background = $(".list > div").eq(index)[0].style.background; }); }, 1000); 
 .list > div { height: 50px } 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div class="list"> <div style="background: red"></div> <div style="background: blue"></div> <div style="background: green"></div> <div style="background: yellow"></div> </div> 

Problem of code is that in .each() javascript set color of last item to first item and then set this color to another items. 代码的问题是,在.each() javascript中,将最后一项的颜色设置为第一项,然后将该颜色设置为另一项。 See bottom list that is example of loop: 请参阅作为循环示例的底部列表:

  • Item1: changed to color of item4 that is yellow 项目1:改变的颜色item4yellow
  • Item2: changed to color of item1 that is yellow Item2:更改为item1yellow
  • Item3: changed to color of item2 that is yellow Item3:更改为item2yellow
  • Item4: changed to color of item3 that is yellow Item4:更改为item3yellow

Then color of all items changed to yellow. 然后所有项目的颜色变为黄色。

You should store colors of items before changing and then change color of every item using stored colors. 您应该在更改之前存储项目的颜色,然后使用存储的颜色更改每个项目的颜色。

 setInterval(function(){ var colors = $(".list > div").map(function(){ return this.style.background; }).get(); $(".list > div").each(function(i){ var index = i == 0 ? 3 : i-1; this.style.background = colors[index]; }); }, 1000); 
 .list > div { height: 50px } 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div class="list"> <div style="background: red"></div> <div style="background: blue"></div> <div style="background: green"></div> <div style="background: yellow"></div> </div> 

I think this solution is better (mostly because you don't really need to know the number of child-elements). 我认为这种解决方案更好(主要是因为您实际上不需要知道子元素的数量)。

Just take the last element in the array and move it to be the first one. 只需将数组中的最后一个元素移到第一个即可。 Then - set the colors for each of the child-elements, one by one. 然后-逐一设置每个子元素的颜色。

 setInterval(function(){ var colors = $(".list div").map(function(){ return this.style.background; }).get(); colors.unshift(colors.pop()) $(".list div").each(function(i){ this.style.background = colors[i]; }); }, 1000); 
 .list > div { height: 50px } 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div class="list"> <div style="background: red"></div> <div style="background: blue"></div> <div style="background: green"></div> <div style="background: yellow"></div> </div> 

While you've posted your own answer already, I thought I'd offer a slight alternative which requires only plain JavaScript (albeit ES6) which performs the same functionality: 虽然您已经发布了自己的答案,但我想我可以提供一种替代方案,该方案仅需要执行相同功能的普通JavaScript(尽管是ES6):

// setting the enclosed anonymous function to run repeatedly,
// with the interval duration as the second argument, in
// milliseconds, following the anonymous function:
setInterval(function() {

  // retrieving the relevant elements, converting the result of
  // document.querySelectorAll() into an arry, using Array.from():
  let children = Array.from(document.querySelectorAll('.list > div')),

  // retrieving an array of the background-colours of those
  // found elements, using Array.prototype.map() to create a
  // new array from the Array supplied:
    colors = children.map(

      // here we use an arrow function, 'child' is the current
      // array element of the array over which we're iterating

      // window.getComputedStyle(child,null) retrieves the
      // computed CSS properties of the child element, and
      // the backgroundColor property retrieves the current
      // background-color (whether defined in a stylesheet,
      // or in the style attribute):
      child => window.getComputedStyle(child, null).backgroundColor
    );

  // here we use Array.prototype.forEach() to iterate over the
  // children array:
  children.forEach(function(child, index, array) {
    // child: the current array-element of the array
    //        over which we're iterating,
    // index: the index of the current array-element,
    // array: a reference to the array over which we're
    //        iterating.

    // here we set the background-color of the current
    // element to the returned index-value of the
    // expression
    child.style.backgroundColor = colors[

      // index + 1: the 'next' index value,
      // %: the remainder operator,
      // array.length: the length of the current array

      // here we increment the index by 1, we then
      // divide that number by the length of the array;
      // if the index is 0 that gives:
      //   (0+1)%4 = 1,
      //   (1+1)%4 = 2,
      //   (2+1)%4 = 3,
      //   (3+1)%4 = 0
      // we retreive the color held at the returned value
      // in the colors Array and set that as the
      // background-color of the current element:
      (index + 1) % array.length
    ];
  });
}, 1000);

 setInterval(function() { let children = Array.from(document.querySelectorAll('.list > div')), colors = children.map(child => window.getComputedStyle(child, null).backgroundColor); children.forEach(function(child, index, array) { child.style.backgroundColor = colors[(index + 1) % array.length]; }); }, 1000); 
 .list > div { height: 50px; font-size: 2em; font-weight: bold; } 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div class="list"> <div style="background: red">One</div> <div style="background: blue">Two</div> <div style="background: green">Three</div> <div style="background: yellow">Four</div> </div> 

References: 参考文献:

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM