2012-06-10 3 views
26

Ich versuche, einen Inhaltsblock immer dem Benutzer angezeigt werden, auch wenn er weit nach unten scrollt. Er sollte auch in der Lage sein, den Inhaltsblock auf und ab zu scrollen. Hier ist eine Geige mit einer abgespeckten Version, die Sie zu zeigen, was ich meine:Choppy/Laggy Scroll-Ereignis auf Chrome und IE

http://jsfiddle.net/9ehfV/2/

One bemerken sollten, wenn Sie nach unten scrollen, bis der Boden des roten Block zu erreichen, wird es um den Block auf dem Fenster zu fixieren, und beim Zurückscrollen legt es es zurück.

In Firefox kann man nach oben und unten scrollen und das oben beschriebene Fixieren/Fixieren ist nicht wahrnehmbar - glatt wie Seide.

Sobald man versucht, in Chrome oder IE zu scrollen, sieht es jedoch so aus, als würde das Scroll-Ereignis nachlassen und man sieht den Block für eine Sekunde "glitching". Es ist nicht Code-Verzögerung - es scheint etwas mit den Browsern zu sein.

Gibt es eine Möglichkeit, das zu beheben? Ich bin mit meinem Latein am Ende.

ich Vorschläge zu schätzen wissen würde, wie ich die gleiche Wirkung auf andere Weise erreichen kann ... dank

+0

Ich würde vermuten, es ist etwas mehr zu tun, wie Scroll Firefox hat Lockerung und wie Gecko/Rhino Feuer/interpretiert das Scroll-Ereignis anders aus anderen Browsern als alles andere, ist es so will wahrscheinlich etwas schwer zu beheben immer noch mit der 'Scroll' Listener-Ansatz, und ich sehe keine andere mögliche Ansatz atm, aber viel Glück Mann. –

Antwort

42

Da JavaScript im selben Thread wie die UI ausgeführt wird, kann eine Bildlaufereignisrückruf die UI blockieren -thread und damit Verzögerung verursachen. Sie müssen den Scroll-Ereignis-Listener drosseln, da einige Browser viele davon auslösen. Vor allem, wenn Sie mit einem analogen Scroll-Gerät auf OS X arbeiten. Da Sie in Ihrem Listener viele Höhenberechnungen durchführen, ist it will trigger a reflow (sehr teuer) für jedes Scroll-Ereignis, das ausgelöst wird.

Um den Hörer zu drosseln, müssen Sie verhindern, dass der Hörer jedes Mal feuert. Normalerweise warten Sie, bis der Browser kein Ereignis für x Millisekunden auslöst oder eine Mindestzeit zwischen dem Aufruf Ihres Callbacks hat. Versuchen Sie, den Wert anzupassen, um den Effekt zu sehen. Sogar 0 Millisekunden können helfen, da es die Ausführung des Callbacks verzögert, bis der Browser Zeit hat (normalerweise 5-40 ms).

Es ist auch eine gute Übung, eine Klasse umzuschalten, um zwischen Zuständen (statische und feste Position) zu wechseln, anstatt sie in JavaScript hart zu codieren. Dann haben Sie eine sauberere Trennung von Bedenken und avoid potential extra redraws by mistake (siehe Abschnitt "Browser sind intelligent").(example on jsfiddle)

Warten auf eine Pause von x ms

// return a throttled function 
function waitForPause(ms, callback) { 
    var timer; 

    return function() { 
     var self = this, args = arguments; 
     clearTimeout(timer); 
     timer = setTimeout(function() { 
      callback.apply(self, args); 
     }, ms); 
    }; 
} 

this.start = function() { 
    // wrap around your callback 
    $window.scroll(waitForPause(30, self.worker)); 
}; 

Warten Sie mindestens x ms (jsfiddle)

function throttle(ms, callback) { 
    var timer, lastCall=0; 

    return function() { 
     var now = new Date().getTime(), 
      diff = now - lastCall; 
     console.log(diff, now, lastCall); 
     if (diff >= ms) { 
      console.log("Call callback!"); 
      lastCall = now; 
      callback.apply(this, arguments); 
     } 
    }; 
} 

this.start = function() { 
    // wrap around your callback 
    $window.scroll(throttle(30, self.worker)); 
}; 

jQuery Waypoints Da du bist bereits mit jQuery, würde ich mir dieansehenPlugin, das eine einfache und elegante Lösung für Ihr Problem hat. Definieren Sie einfach einen Rückruf, wenn der Benutzer zu einem bestimmten Wegpunkt scrollt.

Beispiel: (jsfiddle)

$(document).ready(function() { 
    // throttling is built in, just define ms 
    $.waypoints.settings.scrollThrottle = 30; 

    $('#content').waypoint(function(event, direction) { 
     $(this).toggleClass('sticky', direction === "down"); 
     event.stopPropagation(); 
    }, { 
     offset: 'bottom-in-view' // checkpoint at bottom of #content 
    }); 
}); 
+0

Ich verstehe, woher du kommst. Aber können Sie mir ein Spiel zeigen, das die gleiche Funktionalität wie meine hätte, aber die Vorteile bietet, die Sie beschreiben? –

+0

Ich verstehe nicht, auf welche spezifische Funktionalität Sie sich beziehen. Möchten Sie Ihren Code mit Class-Toggling und Throttling? – gregers

+2

Oh, ich verstehe. Die Scroll-Logik war ein bisschen komplizierter als ich zuerst. Denken Sie, dass es notwendig ist, einige Berechnungen zwischen festen Positionen durchzuführen, aber Klassen werden für die festen Positionen vereinfachen. Updated Jsfiddle hier: http://jsfiddle.net/b5hU8/4/ – gregers

1

Haben Sie einige jQuery-Plugin für Scrollbar versucht oder nutzt die Animation und bis nach unten zu rollen? Es wird alle Browser zwingen, auf die gleiche Weise zu arbeiten (oder schließt genug).

Was passiert ist, dass Firefox (mindestens V12) eine "native" Scroll-Animation haben. Wenn Sie für eine beliebige URL navigieren, können Sie die Sanftheit von Scroll-Aktionen feststellen, und dies ist in anderen Browsern wie Chrome oder IE nicht implementiert.

Beispiele für jquery Stellrad Plugins:

+0

Hilft nicht. Diese Plugins verwenden das selbe Scroll-Ereignis und geben den Browsern, die es nicht haben, kein glattes Scrollen. Noch beheben Sie das Glitching. –

+0

Diese Plugins sind nur ein Beispiel. Es gibt viele andere in einer einfachen Google-Suche für jquery Scroll-Plugin. Was Sie brauchen, ist, diese Plugins ohne das Defaul Scroll-Ereignis zu verwenden ... Sie müssen Scrollbar "entfernen" und machen Sie Ihren eigenen Scroll mit scrollTo Animation und Erleichterung pluguin ... so http://stackoverflow.com/questions/ 4710438/how-to-use-Beschleunigung-im-jquery-plugin-jquery-scrollto benötigen Sie ein Codebeispiel? –

-6

, warum Sie nicht style = "position: fixed; top: 00px; rechts, 00px;" verwenden

dann seine immer sichtbar, ohne choppyness

+0

Da das Element höher als das Ansichtsfenster ist, ist das untere Ende nicht sichtbar, bis Sie blättern. – gregers

Verwandte Themen