Javascript 无法将div动画设置到所需位置两次
我有8个div,可以根据相应下拉列表中给出的值进行交换,如下图所示: 但是,正如您在本文中所看到的,动画并没有两次为同一个div工作。比如说,如果我用div 4替换div 1,然后我尝试用div 7替换新的div 1,那么该div在整个页面上的动画效果都很奇怪!尝试用firebug调试它,所有的动画值都是正确的,流程也很完美。还是它造成了这个问题。不知道我是否遗漏了Javascript 无法将div动画设置到所需位置两次,javascript,jquery,animation,Javascript,Jquery,Animation,我有8个div,可以根据相应下拉列表中给出的值进行交换,如下图所示: 但是,正如您在本文中所看到的,动画并没有两次为同一个div工作。比如说,如果我用div 4替换div 1,然后我尝试用div 7替换新的div 1,那么该div在整个页面上的动画效果都很奇怪!尝试用firebug调试它,所有的动画值都是正确的,流程也很完美。还是它造成了这个问题。不知道我是否遗漏了animate()方法!!这是我的HTML代码: <table cellspacing="30"> <tr&
animate()
方法!!这是我的HTML代码:
<table cellspacing="30">
<tr>
<td>
<div id="img1" style="width:100px;height:40px;position:relative;">
<select id="drop1" name="" class="drop">
<option>1</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
</select>
<input type="checkbox" disabled="disabled" checked="checked">
<img src="" width="120" height="40" id="img_banner1">
</div>
</td>
<td>
<div id="img2" style="width:100px;height:40px;position:relative;">
<select id="drop2" name="" class="drop">
<option>2</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
</select>
<input type="checkbox" disabled="disabled" checked="checked">
<img src="" width="120" height="40" id="img_banner2">
</div>
</td>
<td>
<div id="img3" style="width:100px;height:40px;position:relative;">
<select id="drop3" name="" class="drop">
<option>3</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
</select>
<input type="checkbox" disabled="disabled" checked="checked">
<img src="" width="120" height="40" id="img_banner3">
</div>
</td>
<td>
<div id="img4" style="width:100px;height:40px;position:relative;">
<select id="drop4" name="" class="drop">
<option>4</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
</select>
<input type="checkbox" disabled="disabled" checked="checked">
<img src="" width="120" height="40" id="img_banner4">
</div>
</td>
</tr>
<tr>
<td>
<div id="img5" style="width:100px;height:40px;position:relative;">
<select id="drop5" name="" class="drop">
<option>5</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
</select>
<input type="checkbox" disabled="disabled" checked="checked">
<img src="" width="120" height="40" id="img_banner5">
</div>
</td>
<td>
<div id="img6" style="width:100px;height:40px;position:relative;">
<select id="drop6" name="" class="drop">
<option>6</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
</select>
<input type="checkbox" disabled="disabled" checked="checked">
<img src="" width="120" height="40" id="img_banner6">
</div>
</td>
<td>
<div id="img7" style="width:100px;height:40px;position:relative;">
<select id="drop7" name="" class="drop">
<option>7</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
</select>
<input type="checkbox" disabled="disabled" checked="checked">
<img src="" width="120" height="40" id="img_banner7">
</div>
</td>
<td>
<div id="img8" style="width:100px;height:40px;position:relative;">
<select id="drop8" name="" class="drop">
<option>8</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
</select>
<input type="checkbox" disabled="disabled" checked="checked">
<img src="" width="120" height="40" id="img_banner8">
</div>
</td>
</tr>
</table>
1.
1.
2.
3.
4.
5.
6.
7.
8.
2.
1.
2.
3.
4.
5.
6.
7.
8.
3.
1.
2.
3.
4.
5.
6.
7.
8.
4.
1.
2.
3.
4.
5.
6.
7.
8.
5.
1.
2.
3.
4.
5.
6.
7.
8.
6.
1.
2.
3.
4.
5.
6.
7.
8.
7.
1.
2.
3.
4.
5.
6.
7.
8.
8.
1.
2.
3.
4.
5.
6.
7.
8.
脚本:
$(".drop").change(function () {
var flag = false;
for (var i = 1; i <= 8; i++) {
var dropdown = document.getElementById('drop' + i);
if (flag == true && source.value != i) {
dropdown.value = i;
}
if (dropdown.value != 0 && dropdown.value != i && flag == false) {
var a = i;
var b = dropdown.value;
var pos = i;
var source_div = document.getElementById('img' + i);
var source = dropdown;
var destination = document.getElementById('drop' + dropdown.value);
var destination_div = document.getElementById('img' + dropdown.value);
var posDrop = Math.ceil(dropdown.value / 4);
var posI = Math.ceil(i / 4);
var modDrop = (dropdown.value % 4);
var modI = (i % 4);
if (modDrop == 0) modDrop = 4;
if (modI == 0) modI = 4;
if (modDrop > modI) {
// move right
var diff = modDrop - modI;
$("#img" + i).animate({
left: +((diff) * 130) + "px"
});
$("#img" + dropdown.value).animate({
right: +((diff) * 130) + "px"
});
} else if (modDrop < modI) {
// move left
var diff = modI - modDrop;
$("#img" + i).animate({
right: +((diff) * 130) + "px"
});
$("#img" + dropdown.value).animate({
left: +((diff) * 130) + "px"
});
}
if (posDrop > posI) {
//move down
$("#img" + i).animate({
top: +(70) + "px"
});
$("#img" + dropdown.value).animate({
bottom: +(70) + "px"
});
} else if (posDrop < posI) {
// move up
$("#img" + i).animate({
bottom: +(70) + "px"
});
$("#img" + dropdown.value).animate({
top: +(70) + "px"
});
}
flag = true;
}
}
destination.value = pos;
var temp_div = source_div.id;
source_div.id = destination_div.id;
destination_div.id = temp_div;
var temp = source.id;
source.id = destination.id;
destination.id = temp;
});
$(“.drop”).change(函数(){
var标志=假;
对于(var i=1;i modI){
//右移
var diff=modDrop-modI;
$(“#img”+i)。设置动画({
左:+((差异)*130)+“像素”
});
$(“#img”+dropdown.value)。设置动画({
右:+((差异)*130)+“像素”
});
}否则如果(modDropposI){
//下移
$(“#img”+i)。设置动画({
顶部:+(70)+“px”
});
$(“#img”+dropdown.value)。设置动画({
底部:+(70)+“px”
});
}else if(posDrop
我可以建议您使用完全不同的方法吗?与其直接设置div的动画,不如使用数组存储有关哪个div在哪里的信息,然后在每次重新排序时重新渲染页面的这一部分
假设你有这样一个数组:
[0,1,2,3,4,5,6,7]
然后在div“y”上按下值“x”,将数组[y-1]存储在z中,将数组[y-1]设置为x-1,然后将数组[x-1]设置为z
现在,您已经以稳定的方式在阵列中切换了它们
然后重新渲染表
如果愿意,还可以使用数据arVal属性将数组值添加到div中。这可能是一些不错的动画的基础
像这样在数组中循环
jQuery.each(array, function(i, arVal){
//and set the values of the data attribute
$('td:nth-child(' + i + ') div)'.attr('data-arVal', '' + arVal + '' );
});
数据属性是您的朋友。jQuery-each循环比for循环更方便、更强大,我强烈建议您使用jQuery.each循环
p、 这里可能有一些打字错误,没有测试我写的东西。我创建的。它可能并不完美,但代码更简单。我还从表中删除了div
,并将其绝对定位
$(".drop").change(function () {
var $thisElem = $(this).parent();
var swapIndex = $(this).children(":selected").val();
var $swapElem = $("#img" + swapIndex);
var thisPosition = $thisElem.position();
var swapPosition = $swapElem.position();
$thisElem.finish()
.animate({left: swapPosition.left})
.animate({top: swapPosition.top});
$swapElem.finish()
.animate({left: thisPosition.left})
.animate({top: thisPosition.top});
$swapElem.attr("id", $thisElem.attr("id"));
$thisElem.attr("id", "img" + swapIndex);
});
一些问题:
- 如果位于相同的
位置,则会有一个延迟,因为它会将每个项目设置为相同的左侧
位置。这可以用if语句来修复左侧
- 您可能需要将每个选项设置为其对应的位置。这是很容易做到的,如果你想做的话,请发表评论