2012-06-10 12 views
26

Sto provando ad avere un blocco di contenuto sempre mostrato all'utente, anche se scorre lungo la pagina. Dovrebbe anche essere in grado di scorrere su e giù per il blocco del contenuto. Ecco un violino con una versione ridotta di mostrare ciò che voglio dire:Evento di scrolling Choppy/Laggy su Chrome e IE

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

Si dovrebbe notare quando scorrendo verso il basso, fino a raggiungere la parte inferiore del blocco rosso, si fisserà il blocco sulla finestra, e quando si scorre indietro, lo rimette indietro.

In Firefox è possibile scorrere verso l'alto e verso il basso e il fissaggio/disaggregazione sopra descritto è impercettibile: liscio come la seta.

Una volta che si prova a scorrere in Chrome o IE, tuttavia, sembra che l'evento di scorrimento ritardi e si possa vedere il blocco "glitching" per un secondo. Non è code lag - sembra essere qualcosa con i browser.

C'è un modo per risolvere questo problema? Sono alla fine del mio spirito.

Apprezzerei suggerimenti su come posso ottenere lo stesso effetto in un modo diverso ... grazie

+0

direi che è qualcosa più a che fare con il modo in Firefox ha scorrimento facilitando e come fuochi Gecko/Rhino/interpreta l'evento di scorrimento in modo diverso da altri browser di qualsiasi altra cosa, in modo da esso probabilmente è qualcosa di difficile da risolvere ancora usando l'approccio listener 'scroll', e non vedo nessun altro approccio possibile, ma best of luck man. –

risposta

42

Poiché JavaScript viene eseguito nello stesso thread come l'interfaccia utente, un callback evento di scorrimento può bloccare l'interfaccia utente -la trama e quindi causare lag. Devi limitare il listener degli eventi di scroll perché alcuni browser ne licenziano molti. Soprattutto se sei su OS X con un dispositivo di scorrimento analogico. Poiché esegui molti calcoli di altezza nell'ascoltatore, it will trigger a reflow (molto costoso) per ogni evento di scorrimento che viene generato.

Per limitare l'ascoltatore, è necessario impedire ogni volta che il listener si attiva. Di solito si attende fino a quando il browser non attiva un evento per x millisecondi o ha un tempo minimo tra la chiamata alla richiamata. Prova a regolare il valore per vedere l'effetto. Anche 0 millisecondi possono essere d'aiuto, poiché ritardano l'esecuzione della richiamata fino a quando il browser non ha tempo (di solito 5-40 ms).

È anche buona norma attivare una classe per passare da uno stato all'altro (posizione statica e fissa) anziché codificarlo manualmente in JavaScript. Poi hai una separazione più chiara dei problemi e avoid potential extra redraws by mistake (vedi la sezione "I browser sono intelligenti").(example on jsfiddle)

Attendere una pausa di 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)); 
}; 

attendere almeno 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 Waypoint Visto che siete già usando jQuery, darei un'occhiata alloPluginche ha una soluzione semplice ed elegante al tuo problema. Basta definire una richiamata quando l'utente scorre verso un determinato waypoint.

Esempio: (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

Capisco da dove vieni. Ma puoi mostrarmi un jsfiddle che avrebbe la stessa funzionalità del mio, ma fornire i vantaggi che descrivi? –

+0

Non capisco a quale specifica funzionalità ti riferisci. Vuoi il tuo codice con l'attivazione e la limitazione della classe? – gregers

+2

Oh, capisco. La logica di scorrimento era un po 'più complicata del mio primo pensiero. Pensa che è necessario fare un calcolo tra posizioni fisse, ma le classi si semplificheranno per le posizioni fisse. Aggiornato jsfiddle qui: http://jsfiddle.net/b5hU8/4/ – gregers

1

Hai provato qualche plugin per jQuery per barra di scorrimento o utilizza l'animazione per scorrere su e giù? Costringerà tutti i browser a lavorare allo stesso modo (o chiude abbastanza) ..

Quello che succede è che Firefox (almeno v12) ha un'animazione di scorrimento "nativa". Quando navighi per qualsiasi URL, puoi notare la fluidità delle azioni di scorrimento e questo non è implementato in altri browser, come Chrome o IE.

Esempi di jquery scroller plugin:

+0

Non aiuta. Questi plug-in utilizzano lo stesso evento di scorrimento, né offrono uno scorrimento uniforme ai browser che non lo possiedono. Né fissare i glitching. –

+0

Questi plugin sono solo un esempio. Ce ne sono molti altri in un semplice google searh per plugin scroll jquery. Quello di cui hai bisogno è usare questi plguins senza l'evento di defaul scroll ... dovrai "rimuovere" la scrollbar e fare il tuo scroll con scrollTo animation e easing plguin ... come questo http://stackoverflow.com/questions/ 4710438/how-to-use-easing-in-the-jquery-plugin-jquery-scrollto hai bisogno di un esempio di codice? –

-6

perché non si utilizza style = "position: fixed; top: 00px; diritto; 00px;"

quindi la sua sempre visibile senza choppyness

+0

Poiché l'elemento è più alto della finestra, quindi la parte inferiore non è visibile finché non si scorre. – gregers

Problemi correlati