Je travaille sur une application Web basée sur iPad et je dois éviter le défilement excessif pour que cela ressemble moins à une page Web. J'utilise actuellement ceci pour figer la fenêtre et désactiver le défilement excessif:
document.body.addEventListener('touchmove',function(e){
e.preventDefault();
});
Cela fonctionne très bien pour désactiver le défilement excessif, mais mon application a plusieurs divs défilables, et le code ci-dessus les empêche de défiler .
Je cible uniquement iOS 5 et au-dessus, j'ai donc évité les solutions de piratage comme iScroll. Au lieu de cela, j'utilise ce CSS pour mes divs à défilement:
.scrollable {
-webkit-overflow-scrolling: touch;
overflow-y:auto;
}
Cela fonctionne sans le script de survol du document, mais ne résout pas le problème de défilement div.
Sans un plugin jQuery, y a-t-il un moyen d'utiliser le correctif de dépassement mais d'exempter mes divs $ ('. Scrollable')?
ÉDITER:
J'ai trouvé quelque chose qui est une solution décente:
// Disable overscroll / viewport moving on everything but scrollable divs
$('body').on('touchmove', function (e) {
if (!$('.scrollable').has($(e.target)).length) e.preventDefault();
});
La fenêtre se déplace toujours lorsque vous faites défiler le début ou la fin du div. J'aimerais également trouver un moyen de désactiver cela.
Réponses:
Cela résout le problème lorsque vous faites défiler le début ou la fin de la div
Notez que cela ne fonctionnera pas si vous souhaitez bloquer le défilement de la page entière lorsqu'un div n'a pas de débordement. Pour bloquer cela, utilisez le gestionnaire d'événements suivant au lieu de celui immédiatement ci-dessus (adapté de cette question ):
la source
.scrollable
directement (ce que j'avais essayé à l'origine pour résoudre ce problème). Si vous êtes un noob JavaScript et que vous voulez un code facile pour supprimer ces gestionnaires quelque part, ces deux lignes fonctionnent très bien pour moi!$(document).off('touchmove');
AND$('body').off('touchmove touchstart', '.scrollable');
L'utilisation de l'excellente réponse de Tyler Dodge était restée à la traîne sur mon iPad, j'ai donc ajouté du code d'étranglement, maintenant c'est assez fluide. Il y a parfois des sauts minimes lors du défilement.
De plus, l'ajout du CSS suivant corrige certains problèmes de rendu ( source ):
la source
Commencez par empêcher les actions par défaut sur l'ensemble de votre document comme d'habitude:
Arrêtez ensuite votre classe d'éléments de se propager au niveau du document. Cela l'empêche d'atteindre la fonction ci-dessus et ainsi e.preventDefault () n'est pas lancé:
Ce système semble plus naturel et moins intensif que le calcul de la classe sur tous les mouvements tactiles. Utilisez .on () plutôt que .bind () pour les éléments générés dynamiquement.
Considérez également ces balises méta pour éviter que des choses malheureuses ne se produisent lors de l'utilisation de votre div à défilement:
la source
Pouvez-vous simplement ajouter un peu plus de logique à votre code de désactivation de défilement excessif pour vous assurer que l'élément ciblé en question n'est pas celui que vous souhaitez faire défiler? Quelque chose comme ça:
la source
La meilleure solution à cela est css / html: créez un div pour envelopper vos éléments, si vous ne l'avez pas déjà, et réglez-le sur une position fixe et un dépassement caché. Facultatif, réglez la hauteur et la largeur à 100% si vous voulez qu'il remplisse tout l'écran et rien que tout l'écran
la source
Vérifiez si l'élément défilant fait déjà défiler vers le haut lorsque vous essayez de faire défiler vers le haut ou vers le bas lorsque vous essayez de faire défiler vers le bas, puis empêchez l'action par défaut d'arrêter le déplacement de la page entière.
la source
Je cherchais un moyen d'empêcher le défilement de tout le corps lorsqu'il y a une fenêtre contextuelle avec une zone de défilement (une fenêtre contextuelle "panier" qui a une vue déroulante de votre panier).
J'ai écrit une solution beaucoup plus élégante en utilisant un javascript minimal pour simplement basculer la classe "noscroll" sur votre corps lorsque vous avez un popup ou un div que vous souhaitez faire défiler (et non "faire défiler" tout le corps de la page).
tandis que les navigateurs de bureau observent un débordement: caché - iOS semble ignorer cela à moins que vous ne définissiez la position sur fixe ... ce qui fait que la page entière a une largeur étrange, vous devez donc également définir la position et la largeur manuellement. utilisez ce css:
et cette jquery:
la source
J'ai travaillé un peu de contournement sans jquery. Pas parfait mais fonctionne bien (surtout si vous avez un scroll-x dans un scoll-y) https://github.com/pinadesign/overscroll/
N'hésitez pas à participer et à l'améliorer
la source
Cette solution ne vous oblige pas à mettre une classe scrollable sur toutes vos divs scrollables, elle est donc plus générale. Le défilement est autorisé sur tous les éléments qui sont, ou sont des enfants, d'éléments INPUT contenteditables et de débordement scroll ou autos.
J'utilise un sélecteur personnalisé et je cache également le résultat de la vérification de l'élément pour améliorer les performances. Pas besoin de vérifier le même élément à chaque fois. Cela peut avoir quelques problèmes comme juste écrit, mais je pensais que je partagerais.
la source
Bien que la désactivation de tous les événements "touchmove" puisse sembler une bonne idée, dès que vous aurez besoin d'autres éléments déroulants sur la page, cela posera des problèmes. En plus de cela, si vous désactivez uniquement les événements "touchmove" sur certains éléments (par exemple, body si vous voulez que la page ne puisse pas faire défiler), dès qu'il est activé ailleurs, IOS provoquera une propagation imparable dans Chrome lorsque l'URL la barre bascule.
Bien que je ne puisse pas expliquer ce comportement, il semble que le seul moyen d'empêcher semble de définir la position du corps sur
fixed
. Le seul problème à faire est que vous perdrez la position du document - c'est particulièrement ennuyeux dans les modaux par exemple. Une façon de résoudre ce problème serait d'utiliser ces fonctions simples de VanillaJS:En utilisant cette solution, vous pouvez avoir un document fixe et tout autre élément de votre page peut déborder en utilisant du CSS simple (par exemple,
overflow: scroll;
). Pas besoin de cours spéciaux ou de quoi que ce soit d'autre.la source
Voici une solution compatible zepto
la source
celui-ci fonctionne pour moi (javascript simple)
html:
la source
Essayez ceci Cela fonctionnera parfaitement.
la source
J'ai eu une chance surprenante avec simple:
Cela fonctionne très bien pour désactiver le défilement excessif pour les fenêtres contextuelles ou les menus et cela ne force pas les barres du navigateur à apparaître comme lorsque vous utilisez position: fixed. MAIS - vous devez enregistrer la position de défilement avant de définir une hauteur fixe et la restaurer en masquant la fenêtre contextuelle, sinon le navigateur défilera vers le haut.
la source