我有一个3乘3格。 需要将红类添加到我的网格单元格中。它必须从cell1继续到cell 9,一旦它到达cell9,它应该再次从cell1开始。在位置cell2,它必须检查cell1是否有红色类,如果是,则删除它并添加" red" class2到cell2,这个过程应该永远持续下去。
$(document).ready(function () {
// setInterval(AddRedClass(), 1000)
});
function AddRedClass() {
var boxes = $('.box');
var boxLength = boxes.length - 1;
var lastChildIndex;
for (var index = 0; index < boxLength;) {
var currentBox = $(boxes[index]);
var lastChildIndex = (index == 0) ? boxLength : index - 1;
var prevBox = $(boxes[lastChildIndex]);
if (prevBox.hasClass('red'))
setTimeout(prevBox.removeClass('red'), 1000);
setTimeout(currentBox.addClass('red'), 1000);
index = (index + 1) % boxLength;
}
}
&#13;
.container {
display: flex;
flex-direction: row;
flex-wrap: wrap;
width: 250px;
}
.box {
width: 30%;
border: 1px solid green;
}
.red {
background: red!important;
}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="container">
<div class="box">
c-1
</div>
<div class="box">
c-2
</div>
<div class="box">
c-3
</div>
<div class="box">
c-4
</div>
<div class="box">
c-5
</div>
<div class="box">
c-6
</div>
<div class="box">
c-7
</div>
<div class="box">
c-8
</div>
<div class="box">
c-9
</div>
</div>
&#13;
有人可以解释我的代码有什么问题。
由于
答案 0 :(得分:2)
您不需要检查prev cell是否具有该类,我认为您只需要将其添加到下一个[i]
项。查看这里的评论:
//Create a var to store the index of red element
var count = -1;
function AddRedClass() {
var boxes = $('.box');
var boxLength = boxes.length - 1;
//Check if the actual item isn't more than the length then add 1 otherway restart to 0
count < boxLength ? count++ : count=0;
//Remove the class and add it to the new target
boxes.removeClass('red').eq(count).addClass('red');
}
setInterval(AddRedClass, 1000);
&#13;
.container {
display: flex;
flex-direction: row;
flex-wrap: wrap;
width: 250px;
}
.box {
width: 30%;
border: 1px solid green;
transition: background .3s linear;
}
.red {
background: red!important;
}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="container">
<div class="box">
c-1
</div>
<div class="box">
c-2
</div>
<div class="box">
c-3
</div>
<div class="box">
c-4
</div>
<div class="box">
c-5
</div>
<div class="box">
c-6
</div>
<div class="box">
c-7
</div>
<div class="box">
c-8
</div>
<div class="box">
c-9
</div>
</div>
&#13;
答案 1 :(得分:1)
jQuery的addClass
方法实际上会将类添加到jQuery集合中,因此您不需要循环它。
$('.box').addClass('red');
但是,您似乎想要为一组盒子设置动画。如果是这种情况,那么你会遇到一系列全新的问题。
在循环中执行所有这些操作会发生得太快,您可能甚至都不会注意到它。您需要做的是使用setTimeout
的递归函数:
animateBoxes();
function animateBoxes() {
var $boxes = $('.box'); // prefix the variable name with a $ to identify it as a jquery object, totally optional
var boxLength = $boxes.length - 1;
var lastChildIndex;
addRedClass(0); // pass 0 in the first index
}
function addRedClass(index) {
var $currentBox = $boxes.eq(index);
var lastChildIndex = (index == 0) ? boxLength - 1 : index - 1;
$boxes.removeClass('red'); // remove red class from all boxes
$currentBox.addClass('red');
setTimeout(function () { // set timeout needs a callback function, you cant just pass the function directly
index = (index + 1) % boxLength; // increment index
addRedClass(index);
}, 1000);
}
我没有对它进行测试,但这种方法可以有效地完成你想要完成的任务。
答案 2 :(得分:1)
要实现您正在寻找的内容,您可以使用jQuery的each()
函数来遍历每个元素。使用此功能,您始终可以知道您当前正在访问哪个元素(通过其索引),因此您可以检查是否需要将red
类添加到下一个单元格中。不要忘记在循环外使用计数器,也不要忘记重置并相应计算。
示例:https://jsfiddle.net/Ld7wc44m/4/
=============================================== =======
我建议使用jQuery&#39; toggleClass()
函数。这样做,您不需要检查是否在单元格或其上一个单元格上设置了类。 toggleClass()
只是添加一个传入的类,如果它没有附加到该元素,或者删除它,如果它已被附加到该元素。
为了实现这一点,只需将red
类手动地放到每个第二个单元格中,让算法完成其余的工作。
虽然您的代码也具有更好的可读性。您还可以通过调整超时功能来设置颜色切换的时间。
$(document).ready(function() {
toggleRedClass();
});
function toggleRedClass() {
var boxes = $('.box');
var boxesLength = boxes.length;
$.each(boxes, function(index, value) {
$(value).toggleClass('red');
});
setTimeout(function() {
toggleRedClass();
}, 1000);
}
答案 3 :(得分:0)
将JS更改为此,它可以正常工作: http://codepen.io/anon/pen/pEPdKv
$(document).ready(function() {
setInterval(AddRedClass, 1000);
});
function AddRedClass() {
// get all boxes
var boxes = $('.box');
// remove the current .red class and move it to the next
for (var i = 0; i < boxes.length; i++) {
// check if this is a .red box
if ($(boxes[i]).hasClass('red')) {
// remove the current .red
$(boxes[i]).removeClass('red');
// move to the next box if is <9
if (i < boxes.length - 1) {
$(boxes[i + 1]).addClass('red');
} else {
// or else go back to first one
$(boxes[0]).addClass('red');
}
// job done, return
return;
}
}
// if no .red box is found, then just make it the first
$(boxes[0]).addClass('red');
}