2010-07-14 1 views
0

사용자가 페이지를 스크롤 할 때 DOM 개체 4 개를 이동하려고합니다. 당신은 내가이 주소에 대해서 이야기하고 페이지를 확인할 수 있습니다jQuery 창 스크롤에 애니메이션 적용 : 더 많은 개체를 병렬로 이동하고 고정 된 CSS 위치로 개체의 원치 않는 지연을 방지합니다.

: 사용자가 스크롤로
http://www.tessuti-arredo.it/new/chi_siamo/rassegna/

- 내가 $ (창) .scroll을 사용하고을 (함수() - 내가 있는지 확인 window.scrollTop 일부 개체를 이동하려면 10 픽셀 이상입니다.이 작동하지 않는 것 같아요. ELSE 문을 (scrollTop 10 픽셀보다 작은 경우) - 및 해당 개체를 원래 위치로 다시 이동해야합니다. - 저는 이상한 행동을합니다. 특히 움직이는 4 개의 물체 중 2 개의 물체 (두 개의 고정 된 물체가 함께 움직여 클래스를 호출 함)

영어로는 설명하기가 다소 복잡 할 수도 있지만 위에 게시 한 주소를 보면 쉽게 이해할 수 있습니다. 페이지를 스크롤하십시오. 내가 이동하려는

객체는 다음과 같습니다 - (가) 개체가는 #header DIV = $ ("# 헤더의 H1은") 내부에 포함 된 링크 - 자신의 ID = 호출 왼쪽 사이드 바 메뉴 $ (" #sidebar ") - 두 개의 고정 된 div, 주 메뉴와 배경, 클래스 = $ (". moveMenu ")

중요한 마지막 한 가지 : Firefox의 경우 모든 것이 좋습니다. 다른 브라우저 내 코드에서 일부 오류처럼 보이는 가변 지연이 있습니다.

, 내 코드에 대해 말하기 여기있다 :

좀 빈 콜백가 알고
$(document).ready(function(){ 

    $(window).scroll(function(){ 
    if($(this).scrollTop() > 10) { 
     $("#sidebar").stop().animate({top:'119px'}, 100, function(){ 
         // some callback 
        }); 

     $("#header h1 a").stop().animate({marginTop:'30px'}, 100, function(){ 
         // some callback 
       }); 

     $(".moveMenu").stop().animate({top:'0'}, 300, function(){ 
       // here i change the class of fixed objects to call them back on else statement 
       $(this).removeClass('moveMenu').addClass('moveMenu2'); 
       }); 

     }else{ 

      // this is happening with unwanted delay 
      $(".moveMenu2").stop().animate({top:'90'}, 300, function(){ 
        $(this).removeClass('moveMenu2').addClass('moveMenu'); 
       }); 

      $("#sidebar").stop().animate({top:'89px'}, 100, function(){ 
         $(this).css({'padding-top' : '40px'}); 
       }); 

      $("#header h1 a").stop().animate({marginTop:'0px'}, 100, function(){ 
          // some callback 
       }); 
      } 
    }); 

}); 

가, 난 그냥 뭔가 채울가 준비하도록 유지, 내가 그들을 삭제 tryed, 아무것도 변경되지 않습니다 .

는 난 정말 당신이 내 코드에서 몇 가지 오류를 찾을 희망

, 나는 '알아 ... 내가 tryed 또 다른 한가지는 대신 클래스의 특정 ID를 가진 두 개의 지연 개체를 호출하는 것입니다하지만 아무것도 더 나은 사라 없다 별로 좋지 않아.

+0

별로 도움이되지 않지만 꽤 매끄러운 효과입니다. :) 명성. 지금 몇 가지 유용한 제안을 제공 할 수 있는지 확인하기 위해 코드를 살펴 봅니다. – Faisal

답변

0

IE에서 심각한 지연이 발생하고 Firefox에서 Chrome이 거의없고 (기본 브라우저 인 경우) 지연이 발생하지 않지만 매우 빠르게 위아래로 스크롤하면 스크립트가 완전히 애니메이션되지 않습니다. 스크롤이 발생하는 동안 window.onscroll은 놀라운 횟수를 발생시킵니다. 이것이 지연을 만드는 것입니다. 이 내가이 문제를 개선하기 위해 테스트를 몇 가지 시도는, 기본적으로 그들은 이벤트가 발생 될 때마다 발생하는 작업의 수를 최소화하는 것을 포함한다 :

  1. 내가 두 DIV 요소 'mainmenubg'와 'MAINMENU을 결합하여 시작을 '클래스'moveMenu '와 함께 하나의 div에. 이렇게하면 $ ('. moveMenu') 및 $ ('. moveMenu2')를 통해 하나의 요소 만 참조하고 애니메이션을 적용하여 효율성을 향상시킬 수 있습니다.
  2. 스크롤 이벤트 중에 개체를 참조하는 데 사용되는 세 가지 글로벌 JavaScript 변수를 만들었습니다. $ ('something')을 호출 할 때마다 검색이 발생하지만이 경우 동일한 객체가 항상 참조됩니다. 이렇게하면 이벤트 자체에서 '쿼리'를 제거하여 효율성을 높일 수 있습니다.

    var asidebar = $("#sidebar"); 
    var aheader = $("#header"); 
    var amenu = $(".moveMenu"); 
    

    그런 다음에 자바 스크립트 파일 각각의 애니메이션 호출에 대한이 같은 외부 : amenu.stop().animate({top:'0'},300,function(){$(this).removeClass('moveMenu').addClass('moveMenu2');});

  3. 내가 눈치 마지막 것은이 애니메이션의 호출에 관계없이 객체이 이미 있는지 여부의 발생이다 . 예를 들어 사용자가 페이지를 아래로 스크롤하면 메뉴와 머리글이 새 위치로 이동합니다. 음, 일단 거기에 있으면 사용자가 계속 스크롤하면서 애니메이션 통화를 계속할 이유가 없습니다. 대신 다음 애니메이션은 사용자가 10 픽셀 임계 값에 도달하고 객체를 재배치해야하는 경우에만 발생해야합니다. 이를 변경하는 한 가지 방법은 애니메이션이 발생해야 하는지를 결정하는 데 사용할 수있는 전역 변수를 만드는 것입니다. 예를 들어 : 문 상황을 테스트하는 경우 var change = 0;는 그런 다음 외부 파일에 중첩을 추가

else if(change == 1){ ...animations... change = 0;}

if($(this).scrollTop() > 10){ if(change == 0){ ...animations... change = 1;}}

일반적으로,이 코드를보다 효율적으로 만드는 방법에 대한 모든 것입니다. 나는이 문제가 발생하고 있지 않다 때문에, 당신이 무슨 뜻인지 모르겠어요

:

두 번째 질문에 대답. 죄송합니다!

관련 문제