jQuery滑过2个div

Posted

技术标签:

【中文标题】jQuery滑过2个div【英文标题】:JQuery sliding through 2 divs 【发布时间】:2015-01-13 15:17:19 【问题描述】:

我有 3 个 div 可以制作幻灯片。我想要的是能够点击一个 div 并让它循环两次。即,当单击 div #1 时,它会滚动 div #2,继续,然后在 div#3 处停止 .... 或单击 div #2 并让它平滑滚动两次并在 div #1 处停止

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

这里有 2 个 jsfiddle 示例,虽然我无法让它在点击时滚动 2 个 div,但只有 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 );
    
);
);

【问题讨论】:

我花时间用 css 来做这件事 :) 【参考方案1】:

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;
        
    );

【讨论】:

@MrUpsidown 双击 div 并在你的答案中观看没有 var anim 的动画 这太完美了……谢谢一百万!【参考方案2】:

将动画包装在一个函数中。仅在单击事件时在下一个元素上再次调用它。

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

【讨论】:

【参考方案3】:

你需要用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();
  
);

【讨论】:

以上是关于jQuery滑过2个div的主要内容,如果未能解决你的问题,请参考以下文章

jQuery鼠标滑过横向时间轴样式

鼠标滑过改变图片

JQuery实现鼠标滑过显示导航下拉列表

想用js或jquery来实现当鼠标滑过列表时指中或点击列表中的项名称字段自动动态弹出div

遍历并显示隐藏的子div jquery

鼠标滑过弹出层