JQuery滑过2个div

时间:2014-11-16 18:15:24

标签: jquery scroll jquery-animate slideshow

我有3个div进行幻灯片放映。我想要的是能够点击一个div并让它循环两次。即当点击div#1时,它会滚动到div#2,继续,然后停在div#3 ....或点击div#2并让它平滑滚动两次并停在div#1

现在我只能滚动一次到下一个div。

这里有2个jsfiddle示例,虽然我无法通过滚动浏览2个div onclick,但只有1个。

http://jsfiddle.net/jtbowden/ykbgT/2/ http://jsfiddle.net/jtbowden/ykbgT/

这是我的HTML:     

<div id="box1" class="box">Div #1</div>
<div id="box2" class="box">Div #2</div>
<div id="box3" class="box">Div #3</div>

</div>

和CSS

body {
padding: 0px;    
}

#container {
position: absolute;
margin: 0px;
padding: 0px;
width: 100%;
height: 100%;
overflow: hidden;  
}

.box {
position: absolute;
width: 50%;
height: 300px;
line-height: 300px;
font-size: 50px;
text-align: center;
border: 2px solid black;
left: 50%;
top: 100px;
margin-left: -25%;
}

#box1 {
background-color: green;
left: -150%;
}

#box2 {
background-color: yellow;
}

#box3 {
background-color: red;
left: 150%;
}

和JS:

$('.box').click(function() {
$('.box').each(function() {
    if ($(this).offset().left < 0) {
        $(this).css("left", "150%");
    } else if ($(this).offset().left > $('#container').width()) {
        $(this).animate({
            left: '50%',
        }, 500 );
    } else {
        $(this).animate({
            left: '-150%',
        }, 500 );
    }
});
});

3 个答案:

答案 0 :(得分:0)

将动画包裹在一个函数中。仅在点击事件中再次对下一个元素进行调用。

var anim = false;

$('.box').on('click', function () {

    anim === false && slide($(this), true);
});

function slide(el, next) {

    anim = true;

    el.animate({
        left: '-50%'
    }, 500, function () {

        el.css('left', '150%');
        el.appendTo('#container');        
    });

    el.next().animate({
        left: '50%'
    }, 500, function () {

        next === true ? slide($(this)) : anim = false;
    });
}

正如@ dm4web所述,防止点击事件在动画发生时触发幻灯片是个好主意。

JSFiddle demo

答案 1 :(得分:0)

http://jsfiddle.net/ykbgT/8195/

var anim = false; //prevent animaton before end, on more clicks
var numCycle = 2; //number of  cycle, can be changed at will

$('.box').click(function () {
    if (anim == false) animateD($(this), 1)
});

function animateD($d, count) {
    anim = true;

    $d.animate({
        left: '-50%'
    }, 500, function () {
        $(this).css('left', '150%');
        $(this).appendTo('#container');
    });

    $d2 = $d.next();
    $d2.animate({
        left: '50%'
    }, 500, function () {
        if (count < numCycle) {
            count++;
            animateD($d2, count)
        } else {
            count = 0;
            anim = false;
        }
    });
}

答案 2 :(得分:-1)

您需要使用style属性初始化初始状态,因为您具有不同的特异性html:

<!DOCTYPE html>
<html>
<head>
<script src="//code.jquery.com/jquery-1.9.1.min.js"></script>
  <meta charset="utf-8">
  <title>JS Bin</title>
</head>
<body>
  <div id="container">

    <div id="box1" style="left: -150%" class="box">Div #1</div>
    <div id="box2" style="left: 50%" class="box">Div #2</div>
    <div id="box3" style="left: 250%"class="box">Div #3</div>

</div>

</body>
</html>

在这种情况下最好使用数组来操纵位置js:

var arr = ['-150%', '50%', '250%'],
    children = $('.box'),
    i = children.length,
    time = true,
  transition = function () {
  arr.unshift(arr.pop());
  while(i--) {
    if(parseInt(children[i].style.left) < 0) {
      children[i].style.left = arr[i];
    } else {
      $(children[i]).animate({
        left: arr[i],
      }, 500, function () {
        if(!time){
          time = true;
          transition();
        }
      });
    }  
  }
  i = children.length;
};
$('.box').click(function() {
  if(time) {
    time = false;
    transition();
  }
});