Estoy trabajando en una aplicación web basada en iPad y necesito evitar el desplazamiento excesivo para que parezca menos una página web. Actualmente estoy usando esto para congelar la ventana gráfica y deshabilitar el desplazamiento excesivo:
document.body.addEventListener('touchmove',function(e){
e.preventDefault();
});
Esto funciona muy bien para deshabilitar el desplazamiento excesivo, pero mi aplicación tiene varios divs desplazables y el código anterior evita que se desplacen .
Solo apunto a iOS 5 y superior, así que he evitado soluciones piratas como iScroll. En su lugar, estoy usando este CSS para mis divs desplazables:
.scrollable {
-webkit-overflow-scrolling: touch;
overflow-y:auto;
}
Esto funciona sin el script de desplazamiento excesivo del documento, pero no resuelve el problema de desplazamiento div.
Sin un complemento de jQuery, ¿hay alguna forma de usar la corrección de desplazamiento excesivo pero eximir mis divs $ ('. Scrollable')?
EDITAR:
Encontré algo que es una solución decente:
// Disable overscroll / viewport moving on everything but scrollable divs
$('body').on('touchmove', function (e) {
if (!$('.scrollable').has($(e.target)).length) e.preventDefault();
});
La ventana gráfica aún se mueve cuando se desplaza más allá del principio o el final del div. Me gustaría encontrar una manera de desactivar eso también.
Respuestas:
Esto resuelve el problema cuando se desplaza más allá del principio o final del div
Tenga en cuenta que esto no funcionará si desea bloquear el desplazamiento de toda la página cuando un div no tiene desbordamiento. Para bloquear eso, use el siguiente controlador de eventos en lugar del inmediatamente anterior (adaptado de esta pregunta ):
fuente
.scrollable
directamente (que es lo que había intentado originalmente para resolver este problema). Si eres un novato de JavaScript y quieres un código fácil para eliminar estos controladores en algún momento, ¡estas dos líneas funcionan muy bien para mí!$(document).off('touchmove');
Y$('body').off('touchmove touchstart', '.scrollable');
El uso de la excelente respuesta de Tyler Dodge se mantuvo rezagado en mi iPad, así que agregué un código de aceleración, ahora es bastante suave. A veces hay algunos saltos mínimos durante el desplazamiento.
Además, agregar el siguiente CSS corrige algunos fallos de renderizado ( fuente ):
fuente
Primero, evite las acciones predeterminadas en todo su documento como de costumbre:
Luego, evita que tu clase de elementos se propague al nivel del documento. Esto evita que alcance la función anterior y, por lo tanto, e.preventDefault () no se inicia:
Este sistema parece ser más natural y menos intensivo que calcular la clase en todos los movimientos táctiles. Utilice .on () en lugar de .bind () para elementos generados dinámicamente.
También considere estas metaetiquetas para evitar que sucedan cosas desafortunadas mientras usa su div desplazable:
fuente
¿Puede simplemente agregar un poco más de lógica en su código de deshabilitación de desplazamiento para asegurarse de que el elemento objetivo en cuestión no sea uno que le gustaría desplazar? Algo como esto:
fuente
La mejor solución para esto es css / html: cree un div para envolver sus elementos, si aún no lo tiene y configúrelo en la posición fija y desbordamiento oculto. Opcional, establezca la altura y el ancho al 100% si desea que ocupe toda la pantalla y nada más que toda la pantalla
fuente
Compruebe si el elemento desplazable ya se ha desplazado hacia la parte superior cuando intenta desplazarse hacia arriba o hacia abajo cuando intenta desplazarse hacia abajo y luego evita que la acción predeterminada detenga el movimiento de toda la página.
fuente
Estaba buscando una manera de evitar que todo el cuerpo se desplace cuando hay una ventana emergente con un área desplazable (una ventana emergente de "carrito de compras" que tiene una vista desplazable de su carrito).
Escribí una solución mucho más elegante usando javascript mínimo para simplemente alternar la clase "noscroll" en tu cuerpo cuando tienes una ventana emergente o div que te gustaría desplazar (y no "desplazar demasiado" todo el cuerpo de la página).
mientras que los navegadores de escritorio observan desbordamiento: oculto - iOS parece ignorar eso a menos que establezca la posición en fija ... lo que hace que toda la página tenga un ancho extraño, por lo que también debe establecer la posición y el ancho manualmente. usa este CSS:
y este jquery:
fuente
He trabajado un poco sin jquery. No es perfecto, pero funciona bien (especialmente si tiene un scroll-x en un scoll-y) https://github.com/pinadesign/overscroll/
Siéntete libre de participar y mejorarlo
fuente
Esta solución no requiere que coloques una clase desplazable en todos tus divs desplazables, por lo que es más general. Se permite el desplazamiento en todos los elementos que son, o son hijos de, elementos INPUT contenteditables y overflow scroll o autos.
Utilizo un selector personalizado y también guardo en caché el resultado de la verificación en el elemento para mejorar el rendimiento. No es necesario comprobar el mismo elemento cada vez. Esto puede tener algunos problemas, ya que se acaba de escribir, pero pensé en compartirlo.
fuente
Aunque deshabilitar todos los eventos "touchmove" puede parecer una buena idea, tan pronto como necesite otros elementos desplazables en la página, esto causará problemas. Además de eso, si solo deshabilita los eventos "touchmove" en ciertos elementos (por ejemplo, el cuerpo si desea que la página no sea desplazable), tan pronto como se habilite en cualquier otro lugar, IOS causará una propagación imparable en Chrome cuando la URL barra alterna.
Si bien no puedo explicar este comportamiento, parece que la única forma de prevenir parece establecer la posición del cuerpo en
fixed
. El único problema es que perderá la posición del documento; esto es especialmente molesto en los modales, por ejemplo. Una forma de resolverlo sería usar estas funciones simples de VanillaJS:Con esta solución, puede tener un documento fijo y cualquier otro elemento en su página puede desbordarse usando CSS simple (por ejemplo,
overflow: scroll;
). No hay necesidad de clases especiales ni nada más.fuente
Aquí hay una solución compatible con zepto
fuente
este funciona para mí (javascript simple)
html:
fuente
Prueba esto Funcionará perfecto.
fuente
Tuve una suerte sorprendente con lo simple:
Funciona muy bien para deshabilitar el desplazamiento excesivo para ventanas emergentes o menús y no obliga a las barras del navegador a aparecer como cuando se usa la posición: fija. PERO: debe guardar la posición de desplazamiento antes de establecer la altura fija y restaurarla cuando se oculta la ventana emergente; de lo contrario, el navegador se desplazará hacia la parte superior.
fuente