2012-04-24 42 views
0

我设法将一块代码在基于某些条件的容器div内动画一个div - 但是我的数学必须略微偏离,因为它的动画稍微偏左。看例子@http://dev.whiteb0x.com/galleryjQuery的动画div左/右如果条件

var width = $('#nav').width(); 
$('#nav').width(width * 2 + 20); 

$(".nav-next").click(function() { 
    var pos = $('#nav').position(); 
    var width = $('#nav-viewport').width(); 
    var width = width * (-1); 
    alert(width); 
    if (pos.left <= 0 && pos.left > width && !$('#nav').is(':animated')) { 
     $('#nav li:first').before($('#nav li:last')); 
     $("#nav").animate({"left": "-=300"}, "slow"); 
    } 
}); 

$(".nav-prev").click(function() { 
    var pos = $('#nav').position(); 
    if (!pos.left <= 0 && !$('#nav').is(':animated')) { 
     $('#nav li:first').before($('#nav li:last')); 
     $("#nav").animate({"left": "+=300"}, "slow"); 
    } 
}); 
+0

您声明在内部范围'width'两次。然而,不是你的问题的根源。 – 2012-04-24 21:28:13

+0

此外,动画在Firefox中似乎不起作用。我不确定是什么原因造成的。 – 2012-04-24 21:33:54

+0

啊,可能是因为你在你的实时页面上定义了“left”和“right”css。无论您滚动的方向如何,您都需要始终使用一种或另一种。混合和匹配只会造成麻烦。 – 2012-04-24 21:38:11

回答

1

你声明width三倍,这将在以后导致你的问题。您可以将其缩小为范围内的单击事件中的一个变量,并将其重命名,以便不影响在外部范围内声明的with

var _width = - ($('#nav-viewport').width()); 

那么这个条件是如此怪异:

if (!pos.left <= 0 && !$('#nav').is(':animated')) 

而不是!pos.left <= 0你可以做pos.left > 0

0

你有两件事情在同一时间进行。您正在将项目从后面移动到前方等,并且您正在进行动画制作。当你进行前后移动时,所有图像都会移动。最重要的是,当您的li元素的边距为5px时,只有300px的动画效果,对于1幅图像总共为160px。 (320两,但我不认为你想要的):

var width = $('#nav').width(); 
$('#nav').width(width * 2 + 20); 

$("#nav").css({ 
    left: $('#nav').position().left - 160 + 'px' // Give a 1 image "buffer" for shifting left 
}); 

$(".nav-next").click(function() { 
    var pos = $('#nav').position(); 
    if (!$('#nav').is(':animated')) { 
     $('#nav li:first').insertAfter($('#nav li:last')); 
     $("#nav").css({ 
      left: pos.left + 160 + 'px' // Move because we reordered images 
     }).animate({ 
      "left": pos.left 
     }, "slow"); // Shift back 
    } 
}); 

$(".nav-prev").click(function() { 
    var pos = $('#nav').position(); 
    if (!$('#nav').is(':animated')) { 
     $('#nav li:last').insertBefore($('#nav li:first')); 
     $("#nav").css({ 
      left: pos.left - 160 + 'px' // Move because we reordered images 
     }).animate({ 
      "left": pos.left 
     }, "slow"); // Shift back 
    } 
}); 

演示:http://jsfiddle.net/jtbowden/GFx7h/1/

+0

对这个当前的代码只是我在我感到沮丧的一点,感谢您的帮助 – iamwhitebox 2012-04-24 22:02:56

+0

@ WHITEB0X:做了一些代码修复,并在上面添加了一个演示。 – 2012-04-24 22:20:49