2009-08-03 5 views

Répondre

21

Si vous enregistrez le scrollX et défilez à la page de chargement et chaque fois qu'un événement de défilement se produit, vous pouvez comparer les valeurs précédentes avec les nouvelles valeurs pour savoir dans quelle direction vous avez défilé. Voici une preuve de concept:

function scrollFunc(e) { 
    if (typeof scrollFunc.x == 'undefined') { 
     scrollFunc.x=window.pageXOffset; 
     scrollFunc.y=window.pageYOffset; 
    } 
    var diffX=scrollFunc.x-window.pageXOffset; 
    var diffY=scrollFunc.y-window.pageYOffset; 

    if(diffX<0) { 
     // Scroll right 
    } else if(diffX>0) { 
     // Scroll left 
    } else if(diffY<0) { 
     // Scroll down 
    } else if(diffY>0) { 
     // Scroll up 
    } else { 
     // First scroll event 
    } 
    scrollFunc.x=window.pageXOffset; 
    scrollFunc.y=window.pageYOffset; 
} 
window.onscroll=scrollFunc 
+0

+1: c'est ce que j'allais dire aussi. Les seules choses que j'ai à ajouter est qu'il pourrait y avoir un périphérique d'entrée qui vous permet de faire défiler librement (pas limité à X ou Y), donc je casserais le grand IF en deux. Si c'est le premier parchemin, vous pouvez aussi supposer que ça va vers le bas ou vers la droite. En outre, vous devrez peut-être vérifier ce qui se passe avec les liens intrapage (par exemple: href = "# top"). – nickf

+0

Fonctionne vraiment bien! Je me demande comment je pourrais calculer la vitesse de défilement? –

+5

Je pense que vous pouvez obtenir l'horodatage des événements. Trouvez la différence entre deux événements consécutifs et divisez les différences calculées ci-dessus par la différence d'horodatage. –

0

J'ai eu du mal à faire ce travail dans IE8 (bien qu'il soit conforme pour IE9, FF et Chrome) - tous les rouleaux semblent être détectés comme horizontale.

Voici un script modifié demo qui fonctionne également dans IE8 et peut couvrir un peu plus de navigateurs.

function scrollFunc(e) { 

    function getMethod() { 
     var x = 0, y = 0; 
     if (typeof(window.pageYOffset) == 'number') { 
      x = window.pageXOffset; 
      y = window.pageYOffset; 
     } 

     else if(document.body && (document.body.scrollLeft || document.body.scrollTop)) { 
      x = document.body.scrollLeft; 
      y = document.body.scrollTop; 
     } 

     else if(document.documentElement && (document.documentElement.scrollLeft ||  document.documentElement.scrollTop)) { 
      x = document.documentElement.scrollLeft; 
      y = document.documentElement.scrollTop; 
     } 

     return [x, y]; 
    } 

    var xy = getMethod();    
    var xMethod = xy[0];   
    var yMethod = xy[1]; 

    if (typeof scrollFunc.x == 'undefined') { 
     scrollFunc.x = xMethod; 
     scrollFunc.y = yMethod; 
    } 

    var diffX = scrollFunc.x - xMethod; 
    var diffY = scrollFunc.y - yMethod; 


    if(diffX<0) { 
     // Scroll right 
    } else if(diffX>0) { 
     // Scroll left 
    } else if(diffY<0) { 
     // Scroll down 
    } else if(diffY>0) { 
     // Scroll up 
    } else { 
     // First scroll event 
    } 
    scrollFunc.x = xMethod; 
    scrollFunc.y = yMethod; 
} 

window.onscroll=scrollFunc​ 
2

Avec jquery, vous pouvez également enregistrer un événement de défilement personnalisé qui fournit le changement de défilement comme argument au gestionnaire d'événements:

var previous_scroll = $(window).scrollTop(); 

$(window).on('scroll', function() { 
    var scroll = $(window).scrollTop(), 
     scroll_change = scroll - previous_scroll; 
    previous_scroll = scroll; 
    $(window).trigger('custom_scroll', [scroll_change]); 
}); 

Ensuite, au lieu de scroll, se lient à custom_scroll:

Questions connexes