Su problema parece ser que solo cambia el color de fondo de los elementos que ya se han desplazado a la vista. Su código espera que el navegador espere que su código maneje el evento de desplazamiento antes de que el navegador vuelva a dibujar su vista. Probablemente esto no sea una garantía dada por las especificaciones de HTML. Es por eso que parpadea.
Lo que debe hacer en su lugar es cambiar los elementos que se desplazarán a la vista. Esto está relacionado con fuera de la pantalla que representa o doble buffering como se llama en la programación de juegos de computadora. Usted construye su escena fuera de la pantalla y copia la escena terminada en el búfer de cuadros visibles.
Modifiqué su primer JSFiddle para incluir un multiplicador para la altura del área de desplazamiento: http://jsfiddle.net/2YeZG/13/.
dad.bind('scroll', function() {
// new: query multiplier from input field (for demonstration only) and print message
var multiplier = +($("#multiplier")[0].value);
$("#message")[0].innerHTML=(multiplier*100)-100 + "% of screen rendering";
// your original code
var newScrollY = newScrollY = dad.scrollTop();
var isForward = newScrollY > oldScrollY;
var minVal = bSearch(bots, newScrollY, true);
// new: expand covered height by the given multiplier
// multiplier = 1 is similar to your code
// multiplier = 2 would be complete off screen rendering
var newScrollYHt = newScrollY + multiplier * dadHeight;
// your original code (continued)
var maxVal;
for (maxVal = minVal; maxVal < botsLen; maxVal++) {
var nxtTopSide = tops[maxVal];
if (nxtTopSide >= newScrollYHt) {
break;
}
}
maxVal = Math.min(maxVal, botsLen);
$(dadKids.slice(minVal, maxVal)).css('background', 'pink');
});
Su código tenía un multiplicador de 1, lo que significa que se actualizan los elementos que son actualmente visible (100% de la altura de la zona de desplazamiento). Si configura el multiplicador en 2, obtendrá actualizaciones completas fuera de la pantalla para todos sus elementos. El navegador actualiza elementos suficientes al nuevo color de fondo para que incluso un desplazamiento al 100% muestre los elementos actualizados. Dado que el navegador raramente se desplaza el 100% del área en un solo paso (¡depende del sistema operativo y del método de desplazamiento!), Puede ser suficiente reducir el multiplicador a p. Ej. 1.5 (lo que significa 50% de reproducción de pantalla). En mi máquina (Google Chrome, Mac OS X con panel táctil) no puedo producir ningún parpadeo si el multiplicador es 1.7 o superior.
BTW: Si hace algo más complicado que simplemente cambiar el color de fondo, no debe hacerlo una y otra vez. En su lugar, debe verificar si el elemento ya se ha actualizado y realizar el cambio solo después.
no flicker para mí (FF 16) – RASG
definitivamente parpadea en Chrome, esto podría ser un problema de implementación del navegador ... incluso en la demostración en la página que vinculó, verá algunos parpadeos incluso en su página optimizada. –
parpadea para mí en Chrome, pero si lo arrastro muy despacio, todos cambian como se esperaba, parece que omite algunos elementos si se desplaza rápidamente. – Neil