2012-06-10 58 views
26

Estoy intentando que un bloque de contenido siempre se muestre al usuario, incluso si se desplaza muy abajo en la página. También debería ser capaz de desplazarse hacia arriba y hacia abajo en el bloque de contenido. Aquí es un violín con una versión simplificada para mostrar lo que quiero decir:Evento de desplazamiento Choppy/Laggy en Chrome e IE

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

Uno debe darse cuenta cuando el desplazamiento hacia abajo, hasta llegar a la parte inferior del bloque de color rojo, que se solucionará el bloque en la ventana, y cuando se desplaza hacia atrás, lo vuelve a colocar.

En Firefox uno puede desplazarse hacia arriba y hacia abajo y la fijación/desinstalación descrita anteriormente es imperceptible, suave como la seda.

Una vez que uno intenta desplazarse en Chrome o IE, parece que el evento de desplazamiento se demora y se puede ver el bloque "glitching" por un segundo. No es un retraso de código, parece ser algo con los navegadores.

¿Hay alguna manera de arreglar esto? Estoy al final de mi ingenio.

lo agradecería sugerencias sobre cómo puedo conseguir el mismo efecto de una manera diferente ... gracias

+0

supongo que es algo más que ver con la forma en Firefox tiene desplazamiento aliviar y cómo los incendios Gecko/Rhino/interpreta el evento de desplazamiento diferente a otros navegadores que cualquier otra cosa, por lo que se probablemente sea algo difícil de arreglar aún usando el enfoque del oyente 'scroll', y no veo ningún otro enfoque posible de cajero automático, pero mejor hombre. –

Respuesta

42

Desde JavaScript se ejecuta en el mismo hilo como la interfaz de usuario, una devolución de llamada evento de desplazamiento se puede bloquear la interfaz de usuario -hecho y por lo tanto causa retraso. Necesita acelerar el escucha de eventos de desplazamiento porque algunos navegadores disparan muchos de ellos. Especialmente si tiene OS X con un dispositivo de desplazamiento analógico. Dado que realiza muchos cálculos de altura en su oyente, it will trigger a reflow (muy caro) por cada evento de desplazamiento que se dispara.

Para estrangular al oyente, debe evitar que el oyente se active siempre. Por lo general, esperas hasta que el navegador no desencadene un evento durante x milisegundos o que tengas un tiempo mínimo entre llamar a tu devolución de llamada. Intenta ajustar el valor para ver el efecto. Incluso 0 milisegundos pueden ayudar, ya que retrasará la ejecución de la devolución de llamada hasta que el navegador tenga tiempo (generalmente 5-40 ms).

También es una buena práctica alternar una clase para alternar entre estados (posición estática y fija) en lugar de codificarla en JavaScript. Luego tiene una separación más clara de preocupaciones y avoid potential extra redraws by mistake (consulte la sección "Los navegadores son inteligentes").(example on jsfiddle)

Espere una pausa de 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)); 
}; 

esperar al menos 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 Ya que estás Ya usando jQuery, echaré un vistazo al jQuery Waypoints plugin que tiene una solución simple y elegante para su problema. Simplemente defina una devolución de llamada cuando el usuario se desplaza a un determinado waypoint.

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

Entiendo de dónde vienes. Pero, ¿puede mostrarme un archivo jsfiddle que tenga la misma funcionalidad que el mío, pero proporcione las ventajas que describe? –

+0

No entiendo a qué funcionalidad específica se refiere. ¿Quieres tu código con clase de alternar y estrangular? – gregers

+2

Oh, ya veo. Sin embargo, la lógica de desplazamiento fue un poco más complicada de lo que yo primero. Creo que es necesario hacer algunos cálculos entre posiciones fijas, pero las clases se simplificarán para las posiciones fijas. Jsfiddle actualizado aquí: http://jsfiddle.net/b5hU8/4/ – gregers

1

¿Usted ha intentado algún plugin de jQuery para la barra de desplazamiento o utiliza la animación para desplazarse hacia arriba y abajo? Obligará a todos los navegadores a funcionar de la misma manera (o cierra lo suficiente).

Lo que ocurre es que firefox (al menos v12) tiene una animación de desplazamiento "nativa". Cuando navega por cualquier URL, puede notar la suavidad de las acciones de desplazamiento y esto no se implementa en otros navegadores, como Chrome o IE.

Ejemplos para jquery scroller plugins:

+0

No ayuda. Esos complementos usan el mismo evento de desplazamiento, y en realidad no dan un desplazamiento suave a los navegadores que no lo tienen. Ni arregles el glitching. –

+0

Estos complementos son solo un ejemplo. Hay muchos otros en un simple google searh para jquery scroll plugin. Lo que necesita es usar estos plújines sin el evento de desplazamiento predeterminado ... tendrá que "eliminar" la barra de desplazamiento y hacer su propio desplazamiento con la animación scrollTo y plguin ... easing this like http://stackoverflow.com/questions/ 4710438/how-to-use-easing-in-the-jquery-plugin-jquery-scrollto ¿necesita un ejemplo de código? –

-6

¿por qué no usar el estilo "position: fixed; superior: 00px; derecho; 00px;" =

entonces su siempre visible sin choppyness

+0

Como el elemento es más alto que la ventana gráfica, por lo que la parte inferior no está visible hasta que se desplaza. – gregers

Cuestiones relacionadas