2013-08-02 2 views
-1
$('#home').click(doWork); 

function doWork() { 
     var index = 0; 
     var boxes = $('.box1, .box2, .box3, .box4, .box5, .box6'); 

     function start() { 
      boxes.eq(index).addClass('animated'); 
      ++index; 
      setTimeout(start, 80); 
     }; 
     start(); 
    } 

링크를 클릭하면이 애니메이션이 시작됩니다. 애니메이션을 마친 후에 다른 링크를 클릭하면이 애니메이션을 뒤집어야합니다. 여기가 반대를 할 인터럽트로 당신은뿐만 아니라 프로세스를 시작할 수 있습니다 코드의JavaScript이 애니메이션을 뒤집는 방법, 다른 링크를 클릭하면

+1

질문이 너무 명확하지 않습니다. 이 문제를 효과적으로 재현하려면 관련 HTML 마크 업을 게시하십시오. –

+0

**'start()'에서'setTimeout (start)'**를 사용해서는 안됩니다. 당신은'start()'의 지수 더미를 가질 것이다. – Trojan

+1

@trojansdestroy 재귀라고합니다. 'setTimeout'은 각 호출을 지연시킵니다. 그게 뭐가 잘못 됐니? 내 말은, 이것에 관해 내가 바꿀만한 몇 가지가 있지만, 요점은 괜찮다. – Ian

답변

0

:

(function() { 
    "use strict"; 

    var doWork, 
     index, 
     boxes, 
     numBoxes, 
     workerTO; 

    index = 0; 
    boxes = $(".box1, .box2, .box3, .box4, .box5, .box6"); 
    numBoxes = boxes.length; 
    doWork = function (changer, reverse) { 
     var direction, worker; 

     clearTimeout(workerTO); 

     direction = reverse ? -1 : 1; 
     worker = function() { 
      if (reverse) { 
       if (index < 0) { 
        index = 0; 
        return; 
       } 
      } else { 
       if (index >= numBoxes) { 
        index = numBoxes - 1; 
        return; 
       } 
      } 
      console.log(index); 
      changer(boxes.eq(index)); 
      index += direction; 
      workerTO = setTimeout(worker, 80); 
     }; 
     worker(); 
    }; 

    $("#home").click(function() { 
     doWork(function (el) { 
      el.addClass("animated"); 
     }); 
    }); 

    $("#home2").click(function() { 
     doWork(function (el) { 
      el.removeClass("animated"); 
     }, true); 
    }); 
}()); 

DEMO :http://jsfiddle.net/NcdZT/1/

나는 몇 가지가 응축 될 수있는 확신과 더 효율적으로 만들었지 만 (예 : if) 읽기 쉽고 원하는 것을 얻을 수 있습니다.

setTimeout을 추적하면 프로세스가 중단 될 수 있습니다. 타임 아웃을 80에서 좀 더 눈에 띄게 늘리면 (또는 충분히 빨리 클릭하면) "애니메이션"이 중간에 반전 될 수 있습니다.

관련 문제