2014-01-18 5 views
5

ich den folgenden Code unten bin mit zwei divs in verschiedenen Richtungen zu bewegen(), aber ich bin neugierig, zu wissen, ob Sie die Scroll begrenzen können, so dass es nur einmal pro feuert Spirale (anstatt es ständig Scrollen und Senden meine Funktionen in eine EndlosschleifeLimit ‚Mausrad‘ Delta Feuer einmal pro Scroll

$('.page-left, .page-right').bind('mousewheel', function(event, delta) { 
    var windowHeight = $(window).height(); 
    if (delta < 0) { 
     prevProject(); 
    } 
    if (delta > 0) { 
     nextProject(); 
    } 
}); 

Sie können sehen, wo ich bin oben bis zu hier:. http://dev.rdck.co/lyonandlyon/

Vielen Dank im Voraus, R

Animationsfunktionen als Referenz:

var prevProject = function() { // up arrow/scroll up 
    var windowHeight = $(window).height(); 

    $('.page-left .page-left-wrapper').css({bottom:'auto'}); 
    $('.page-left .page-left-wrapper').animate({top:0},800, function() { 
     $('.page-left .page-left-wrapper').prepend($('.page-left .project-left:last-of-type')); 
     $('.page-left .page-left-wrapper').css({top:-windowHeight}); 
    }); 
    $('.page-right .page-right-wrapper').css({top:'auto'}); 
    $('.page-right .page-right-wrapper').animate({bottom:+windowHeight*2},800, function() { 
     $('.page-right .page-right-wrapper').append($('.page-right .project-right:first-of-type')); 
     $('.page-right .page-right-wrapper').css({bottom:+windowHeight}); 
    }); 
}; 


var nextProject = function() { // down arrow/scroll down 
    var windowHeight = $(window).height(); 

    $('.page-left .page-left-wrapper').animate({top:0},800, function() { 
     $('.page-left .page-left-wrapper').prepend($('.page-left .project-left:last-of-type')); 
     $('.page-left .page-left-wrapper').css({top:-windowHeight}); 
    }); 
    $('.page-right .page-right-wrapper').animate({bottom:+windowHeight*2},800, function() { 
     $('.page-right .page-right-wrapper').append($('.page-right .project-right:first-of-type')); 
     $('.page-right .page-right-wrapper').css({bottom:+windowHeight}); 
    }); 
}; 
+1

Schauen Sie in debounce/Gas. – Brad

+1

'bind' ist veraltet. Verwenden Sie "an". –

+0

@JanDVorak Okay, wenn ich die Bindung an, okay, aber wie hilft das? –

Antwort

5

Sie können nur innerhalb der Mausrad-Funktion für die Animation überprüfen (demo)

$('.page-left, .page-right').on('mousewheel', function(event, delta) { 
    if ($('.page-left-wrapper, .page-right-wrapper').is(':animated')) { 
     return false; 
    } 
    var windowHeight = $(window).height(); 
    if (delta < 0) { 
     prevProject(); 
    } 
    if (delta > 0) { 
     nextProject(); 
    } 
}); 

Update: wir debounce verwenden aufgelöst als die lange Scroll (Finger über ein Touchpad) musste gestoppt werden (updated demo).

$(document).keydown($.debounce(250, function(e) { 
    switch (e.which) { 
    case 38: // up arrow 
     prevProject(); 
     break; 
    case 40: // down arrow 
     nextProject(); 
     break; 
    } 
})); 

$('.page-left, .page-right').on('mousewheel', $.debounce(250, function(event, delta) { 
    var windowHeight = $(window).height(); 
    if (delta < 0) { 
     prevProject(); 
    } 
    if (delta > 0) { 
     nextProject(); 
    } 
})); 
+0

Das ist großartig! Es ist immer noch ziemlich empfindlich .. wie auch immer du es pro Rolle machen kannst? Wie eine lange Schriftrolle? –

+1

Versuchen @ Friedi Antwort verwenden, sondern stattdessen die 'isAnimating' Flagge sofort von Clearing, klar es innerhalb einer' setTimeout' Funktion. – Mottie

+0

können Sie das ausarbeiten? 'setTimeout (function() { var isAnimating = false; }, 5000);' –

3

Sie können dieses Problem mit einer Flagge umgehen. Sie können ein globales Flag isAnimating verwenden und es auf "true" setzen, wenn Sie gerade die Position der divs Ihrer Website animieren.

So kann der Code wie folgt aussehen:

var isAnimating = false; 

$('.page-left, .page-right').bind('mousewheel', function(event, delta) { 
    // if the div will be animated at this moment return 
    if(isAnimating) { 
     return; 
    } 

    var windowHeight = $(window).height(); 
    if (delta < 0) { 
     prevProject(); 
    } 
    if (delta > 0) { 
     nextProject(); 
    } 
}); 

var prevProject = function() { 
    isAnimating = true; 

    var oneIsDone = false, 
     finish = function() { 
      // if both animations are done, set the flag to false 
      if(oneIsDone) { 
       isAnimating = false; 
      } 
      // at least one is done... 
      oneIsDone = true; 
     }; 

    // animate the previous project and set the flag to false (in the callback) 
    $('.page-left .page-left-wrapper').css({bottom:'auto'}); 
    $('.page-left .page-left-wrapper').animate({top:0},800, function() { 
     $('.page-left .page-left-wrapper').prepend($('.page-left .project-left:last-of-type')); 
     $('.page-left .page-left-wrapper').css({top:-windowHeight}); 
     finish(); 
    }); 
    $('.page-right .page-right-wrapper').css({top:'auto'}); 
    $('.page-right .page-right-wrapper').animate({bottom:+windowHeight*2},800, function() { 
     $('.page-right .page-right-wrapper').append($('.page-right .project-right:first-of-type')); 
     $('.page-right .page-right-wrapper').css({bottom:+windowHeight}); 
     finish(); 
    }); 
}; 

var nextProject = function() { 
    // the same as in the prevProject function, but only in the other direction 
}; 
+0

Vielen Dank für die Hilfe. Habe meine Frage mit den Animationsfunktionen aktualisiert. –

+0

+1 du schlägst mich dazu, P – Mottie

+0

@friedi Vielen Dank. Eine lange Schriftrolle, die zweimal ausgelöst wird (und somit durch zwei Projekte scrollt), um sie zu begrenzen? –

0

Ich schlage vor, extremums zu erkennen die Funktion Feuer:

var mw1 = 0; 
var mw2 = 0; 
var lock; 
$(document).bind('mousewheel', function(evt) { 
    var delta = evt.originalEvent.deltaY 
    if(((delta > 0 && delta < mw2 && mw2 > mw1) || (delta < 0 && delta > mw2 && mw2 < mw1)) && !lock){ 
     console.log(mw1 + " " + mw2 + " " + delta) 
     // call some function here 
     lock = true; 
     window.setTimeout(function(){ 
      lock = false; 
     },200) 
    } 
    mw1 = mw2; 
    mw2 = delta; 
}) 

Schloss ist, sollte eigentlich nicht notwendig sein, aber extremums sind manchmal mehr als einmal pro blättern aus irgendeinem Grund gefunden.