2017-11-08 1 views
-2

Ich habe den folgenden JavaScript/jQuery-Code. Ich sehe kein Problem damit, aber es funktioniert nicht richtig.jQuery animiert läuft nur einmal korrekt, dann beginnt seltsam zu verhalten

$(document).ready(function(){ 
 
    $(window).scroll(function(){ 
 
     if($(window).scrollTop() > 0) { 
 
      $("#forumHeader").animate({top: '250px'}); 
 
     } 
 
     else 
 
     { 
 
      $("#forumHeader").animate({top: '60px'}); 
 
     } 
 
    }); 
 
});
#forumHeader 
 
{ 
 
    position: absolute; 
 
    top: 60px; 
 
    left: 0%; 
 
    height: 100px; 
 
    width: 200px; 
 
    color: white; 
 
    background-color: red; 
 
} 
 

 
#content 
 
{ 
 
    height: 1000px; 
 
    background-color: gray; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="forumHeader">Forum Header</div> 
 
<div id="content">Some content here</div>

Das erste Mal, dass ich es nach unten scrollen funktioniert, wie es sollte und #forumHeader oben Animieren: 250px. Aber wenn ich wieder zurück blättern kann, kann es mehrere Sekunden dauern, bevor es wieder nach oben animiert: 60px. Manchmal ändert es sich hin und her, manchmal kann es gar nichts tun. Was ist das Problem? Bitte helfen ..

+2

Das Scroll-Ereignisse läuft viel öfter als einmal, während Sie scrollen. Das Hinzufügen/Entfernen einer Klasse und das Animieren mit CSS würde wahrscheinlich bessere Ergebnisse bringen als Tausende von Animationen in die Warteschlange zu stellen. –

+1

Jede Lösung in Bezug auf die Handhabung des Scroll-Ereignisses sollte irgendeine Art von Drosselung/Entprellung verwenden, so dass das Scroll-Ereignis nicht wiederholt für eine (aus der Benutzerperspektive) Scroll-Aktion verarbeitet wird. Es wird auch empfohlen, Selektoren außerhalb des scroll -Ereignishandlers zu verschieben, z. B. '$ (" # forumHeader ")', und zwischengespeichert, sodass eine variable Referenz auf das Element verwendet werden kann, anstatt jedes Mal ausgeführt zu werden, um die Leistung zu erhöhen. – Taplar

+0

@Taplar, die mir nicht einmal in den Sinn kam, danke. Ich habe den folgenden Code aktualisiert. –

Antwort

0

ich würde die jQuery verwenden, um hinzuzufügen, und eine Klasse zu entfernen, dann einen CSS-Übergang verwenden

$(document).ready(function(){ 

    // EDIT - Move the selector outside of the scroll event as suggested 
    var header = $("#forumHeader"); 

    $(window).scroll(function(){ 

     if($(window).scrollTop() > 0) { 
      header.addClass('slide'); 
     } else { 
      header.removeClass('slide'); 
     } 
    }); 
}); 
#forumHeader{ 
    top: 60px; 
    -webkit-transition: top 500ms ease-out ; 
    -moz-transition: top 500ms ease-out ; 
    -o-transition: top 500ms ease-out ; 
    transition: top 500ms ease-out ; 
} 
#forumHeader.slide{ 
    top: 250px; 
} 
#content 
{ 
height: 1000px; 
background-color: gray; 
} 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
<div id="forumHeader">Forum Header</div> 
<div id="content">Some content here</div> 

hoffte, das hilft

+0

Ich bekomme, dass dies die Funktion eine Menge feuert, aber ich habe ähnliche Lösungen auf Websites verwendet und keine Leistungsprobleme bemerkt. Wenn Sie einen anderen Vorschlag zur Verbesserung dieser Art von Scroll-Funktion, die sehr geschätzt werden würde :) –

+0

Das scheint zu arbeiten, wie ich es will, und ich erkenne auch, dass es eine effektivere Methode ist. Vielen Dank für Ihre Zeit! :) – Galaniitoluodda

+0

@ Jim-miraidev schnelles Beispiel zusammengeworfen mit einer Form einer Entprellung. https://jsfiddle.net/6bp0mzap/ – Taplar