2010-12-02 3 views
0

누군가 내 코드를 평가하고 올바른지 알려주십시오.jquery animation 반복, 구문이 잘못 되었습니까?

애니메이션을 하나씩 실행하고 5000 밀리 초 동안 일시 중지하고 높이를 모두 0으로 재설정 한 다음 애니메이션을 무기한 반복합니다.

function animateThis(){ 
      $(".bars div:nth-child(1)").animate({'height':'49px'}, 2000, function() { 
       $(".bars div:nth-child(2)").animate({'height':'112px'}, 2000, function() { 
        $(".bars div:nth-child(3)").animate({'height':'174px'}, 2000, function() { 
         $(".bars div:nth-child(4)").animate({'height':'236px'}, 2000, function() { 
          $(".bars div:nth-child(5)").animate({'height':'298px'}, 2000, function() {    
           $('.bars div').delay(2000).css({"height" : "0"}), function() { animateThis()}; 
          }); 
         }); 
        });               
       }); 
      }); 
     } 
    $(".bars").ready(function(){animateThis()}); 

내가 어제받은 일부 답변에서 다시 포맷을 http://execusite.com/fazio/files/careers-banner/test.html

에서 볼 수 있지만 여전히 작동하지 않습니다와 나는 어떤 피드백을받지 못했습니다.

감사합니다.

+0

코드와 예상되는 동작을 설명했습니다. 실제 행동이란 무엇입니까? –

+0

@ 카를 링크에서 실제 행동을 볼 수 있습니다. 설명을하겠습니다. 각 높이 애니메이션이 연속적으로 실행됩니다. 그러나 높이를 0으로 변경하기 전의 지연 시간은 작동하지 않으며 전체 기능이 반복되지 않습니다. 따라서 다섯 번째 막대가 움직이면 즉시 모든 값을 0으로 되돌리고 중지합니다. –

+0

@JJ 왜'$ (". bars"). ready()'를 사용합니까? –

답변

2

당신은 이런 식으로 작업을 수행 할 수 있습니다

예 :http://jsfiddle.net/patrick_dw/T5acF/4/

function animateThis() { 
    var length = $('.bars div').stop().each(function(i, val) { 
     $(val).delay(i * 2000).animate({ height: (i * 62) + 49 }, 2000, function() { 
      if (i === (length - 1)) { 
       $('.bars div').animate({ height: 0 }, 2000, animateThis); 
      } 
     }); 
    }).length; 
} 

$(document).ready(function() { animateThis(); }); 

편집 : 다시 0에 애니메이션을 통보하지 않았다. 이 업데이트 된 버전으로 수정되었습니다.

편집 : 새로운 .each() 전에 .stop() 추가 내가 가지고 있던 문제를 정리하는 것 같았다.

편집 :$(this).index()i (동일한 색인을 나타냄)으로 대체하여 좀 더 효율적으로 만들었습니다.


분명히 충분히주의를 기울이지는 않습니다. 높이를 0으로 다시 애니메이션하고 싶지는 않지만 5000 밀리 초를 지연시키고 즉시 재설정하려고합니다.

예 :http://jsfiddle.net/patrick_dw/T5acF/5/

function animateThis() { 
    var length = $('.bars div').each(function(i, val) { 
     $(val).delay(i * 2000).animate({ height: (i * 62) + 49 }, 2000, function() { 
      if (i === (length - 1)) { 
       setTimeout(function() { 
        $('.bars div').height(0); 
        animateThis(); 
       }, 5000); 
      } 
     }); 
    }).length; 
} 

$(document).ready(function() { animateThis(); }); 
+0

클리너 구현입니다. +1 – Stephen

+0

감사합니다. 패트릭. 그것은 그것을 쓰는 더 좋은 방법으로 보인다. 매우 감사! 지연을 추가하기 위해 노력할 것입니다. –

+0

찾을 필요가있는 문제가 있지만 몇 분 동안 벗어날 필요가 있습니다. 다른 사람이 찾으면이 순간을 제대로 볼 수 없어서 대답을 수락해야합니다. – user113716

0
var animateThis = function(){ 
      $(".bars div:nth-child(1)").animate({'height':'49px'}, 2000, function() { 
       $(".bars div:nth-child(2)").animate({'height':'112px'}, 2000, function() { 
        $(".bars div:nth-child(3)").animate({'height':'174px'}, 2000, function() { 
         $(".bars div:nth-child(4)").animate({'height':'236px'}, 2000, function() { 
          $(".bars div:nth-child(5)").animate({'height':'298px'}, 2000, function() {    
           $('.bars div').delay(2000).animate({"height" : "0"}, 0), function() { animateThis()}; 
          }); 
         }); 
        });               
       }); 
      }); 
     }; 
    $(".bars").ready(function(){animateThis()}); 
+0

Svinto, 감사합니다. 이제 지연이 작용하고 있습니다. 그러나 여전히 반복되지 않습니다. –

0

여기 delay(2000).css({"height" : "0"})

, 당신은 지연 후에 무엇을해야하는지에 대한 콜백을 지정하지 않은; .delay이 즉시 반환하기 때문에 .css 콜이 즉시 실행됩니다. 콜백이 제공된 경우 콜백을 설정하여 나중에 실행합니다.

.css()은 애니메이션으로 변경하지 않고 즉시 변경합니다. 변경 전까지는 여전히 지연이 있지만, 이전 전환이 움직이기 때문에 쉽게 혼란 스러울 수 있습니다. div로 자리를 잡으려는 것처럼 보이지만 이전 전환으로 인한 시간을 고려해야합니다. 즉, 이전 전환이 완료되기 전에 완료되기를 기다리는 것입니다.여기

, function() { animateThis() };

, 당신은 animateThis()를 호출하는 이름이 지정되지 않은 콜백 함수를 정의하지만, 실제로 전화를하지 않는다 - 당신이 기능을 제공하지 않은 (예 : 지연 cssanimate)가 콜백을받습니다. 실제로 마지막 전환을 애니메이션으로 만들지는 않겠지 만 css 대신 animate을 사용하면 콜백을 사용할 수 있습니다.

스티븐은 답에 해결책을 제공했습니다. 이 시도 :

$('.bars div').delay(4000).animate({"height": 0}, 0, function() { animateThis(); }) 
+0

자신감의 투표에 감사 드리며 문제의 진단이 맞지만 해결책이 잘못되었습니다. – Stephen

+0

@Stephen : Blarg. 확실히 ** ** 나에게 보였다. 그러나 지금까지는 Javascript에서 코드의 작업 라인을 작성한 것보다 더 많은 Javascript 버그에 익숙하지 않은 것으로 보인다. –

+0

도움 주셔서 감사합니다. Karl! –

1

이 시도 :

function animateThis() { 
    var divs = $(".bars div").get(); 
    var time = 2000; 
    $(divs[0]).animate({'height': '49px'}, time, function() { 
     $(divs[1]).animate({'height': '112px'}, time, function() { 
      $(divs[2]).animate({'height': '174px'}, time, function() { 
       $(divs[3]).animate({'height': '236px'}, time, function() { 
        $(divs[4]).animate({'height': '298px'}, time, function() { 
         setTimeout(function() { 
          $(divs).css('height', '0px'); 
          animateThis(); 
         }, time); 
        }); 
       }); 
      }); 
     }); 
    }); 
} 

참고 :이 코드는 중복입니다. 코드를보다 효율적으로 만드는 방법을 보여주기 위해 (불필요한 선택기 쿼리를 제거하여) 작성했습니다. 내가 너라면 패트릭의 대답으로 갈거야.

+0

이것은 좋아 보인다. – Stephen

+0

감사합니다. Sime도 잘 작동하며 매우 유용합니다! –

+0

@JJ patrick의 비 중복 접근 방식을 권장합니다. –