2012-05-07 18 views
15

En el safari móvil, durante el manejo de touchmove para un elemento, modifico el de ese elemento. Desafortunadamente, el cambio visual no ocurre mientras el usuario está desplazándose, o hasta el final de un desplazamiento inercial.JavaScript DOM cambia en touchmove demorado hasta que el desplazamiento finalice en el dispositivo móvil Safari

¿Qué puedo hacer para obtener el className para tomar visualmente de inmediato?

Más: Al parecer esto no se limita a los cambios className, pero aparentemente ningún cambio en el DOM, como innerHTML y style.

Respuesta

13

Desafortunadamente, esto es por diseño. iOS Safari pondrá en cola toda la manipulación DOM hasta el final de un desplazamiento o gesto. Efectivamente, el DOM está congelado durante un desplazamiento.

Pensé que podría encontrar una referencia a esto en una página de desarrollador de Apple, pero solo puedo encontrar este enlace en jQueryMobile: http://jquerymobile.com/test/docs/api/events.html.

Tenga en cuenta que los dispositivos con iOS congelan la manipulación del DOM durante el desplazamiento, poniéndolos en cola para aplicarlos cuando finaliza el desplazamiento. Actualmente estamos investigando formas de permitir que las manipulaciones DOM se apliquen antes de que se inicie un desplazamiento

Espero que esto ayude!

+0

Después de reflexionar, supongo que es tan pesada la manipulación DOM que no ralentiza la adorable inercia del scroll. – Andy

+0

Tristeza. Cuanto más lo intenté, más claro se volvió que este es el caso. –

+0

De alguna manera, este sitio supera esa limitación. Alguien entiende lo que hicieron? https://victoriabeckham.landrover.com/INT –

15

Realmente construí ese sitio, y sí, la forma de evitar esta limitación es no desplazar el sitio utilizando la funcionalidad incorporada del navegador, sino fingirlo. El JS escucha los eventos de la rueda de desplazamiento y el teclado y ajusta la propiedad css top del contenedor principal a su propia 'scrollTop'. La barra de desplazamiento a la derecha es, por supuesto, una JS personalizada. En este caso, se sincroniza con el mismo valor interno 'scrollTop'.

Todo el sitio es solo una gran interpolación realmente, con la línea de tiempo principal siendo su posición scrollTop, y todas las sub animaciones que se activan en determinados momentos. El JS no está minimizado, así que échale un vistazo al archivo ScrollAnimator.js, está todo allí.

+0

Una obra de arte de hecho. – matthoiland

+0

Sí, esto es muy impresionante. ¡Buen trabajo! – Brandon

+0

alguien puede proporcionar un enlace? ¿Dónde está ese sitio? –

2

Simplemente cambie la posición a -webkit-sticky. No ajuste la parte superior para que se vea como un elemento normal, pero funciona como un elemento fijo. Y puede actualizar su estilo excepto la posición inmediatamente.

+0

esto funciona maravillosamente en iOS y versiones más nuevas de safari de escritorio. Lo que hice para el encabezado fue específicamente para iOS. Uso esta propiedad, todo lo demás usa lo fijo, esto es debido a la compatibilidad. Obtenga más información acerca de esta propiedad aquí: http://updates.html5rocks.com/2012/08/Stick-your-landings-position-sticky-lands-in-WebKit – loriensleafs

+0

Esto! ¡Increíble! He estado tirando de mi pelo durante días tratando de encontrar soluciones para animar algo durante el movimiento y la posición: adhesivo; es exactamente lo que necesitaba Nunca hubiera llegado a esto por mi cuenta. Muchas gracias! – beefchimi

Cuestiones relacionadas