Comment faire pour désactiver la bande de caoutchouc dans iOS web apps?
Ce:
$('body').on('touchmove', function(e) { e.preventDefault(); });
Fonctionne, mais va désactiver le défilement à travers l'ensemble de la page, ce qui est loin d'être idéale.
Ce:
$('*').on('touchstart', function(e){
var element = $(this).get(0);
if ( element.scrollTop <= 0 ) element.scrollTop = 1;
if ( element.scrollTop + element.offsetHeight >= element.scrollHeight ) element.scrollTop = element.scrollHeight - element.offsetHeight - 1;
});
Fonctionne sur les pages qui ont une zone de défilement. Cependant, quand il n'y a rien à faire défiler il montrera à nouveau la bande de caoutchouc.
Donc ma question:
Comment pouvez-vous désactiver la bande de caoutchouc en effet et toujours conserver la -webkit-overflow-scrolling
zones de défilement?
[Mise à jour]
Meilleure Solution
Désactiver le défilement sur tous les non-défilement des éléments tels qu'une barre d'onglet ou une barre de navigation.
anElement.addEventListener('touchmove', function( event ){ event.preventDefault() };
Attacher un gestionnaire de défilement pour le défilement des éléments comme le contenu principal.
anElement.addEventListener('touchstart', function( event ){
if( this.scrollTop === 0 ) {
this.scrollTop += 1;
} else if( this.scrollTop + this.offsetHeight >= this.scrollHeight ) {
this.scrollTop -= 1;
}
}
- J'ai exactement la même question!
- Je suis également à la recherche d'une réponse. Sur le bureau Safari elle aide à fixer les
body {overflow:hidden; height: 100%;}
mais qui ne fonctionne pas sur iOS. - Juste par curiosité, pourquoi voudriez-vous pour le désactiver?
- Pour la simple raison qu'il se sent plus comme une application native.
Vous devez vous connecter pour publier un commentaire.
A couru dans le même problème récemment avec un SPA où l'
<body>
de caoutchouc de la bande a été atteinte à l'expérience, mais j'avais besoin de faire défiler les sous-domaines. Merci beaucoup pour dSquared suggestions, comme la Méthode 1 qui a le mieux fonctionné pour moi. Voici ma petite extension de sa suggestion que j'ai mis en œuvre dans un projet de travail qui attend tout le chemin jusqu'à l'arbre pour trouver tous les éléments (et pas seulement les divs) qui ont un.scroll
classe à ce sujet:Et voici ce que le CSS ressemble à:
Vous avez seulement besoin d'une bibliothèque (jQuery ou Zepto) et vous obtenez natif de défilement avec de l'élan et pas en caoutchouc de la bande sur le corps. Aussi, j'ai ajouté les translateZ de réparer certains problèmes que j'ai eu avec des éléments de disparaître pendant le défilement et il peut être utilisé pour GPU pour accélérer vos éléments.
MAIS (et c'est un grand "mais"), comme dSquared, la page entière en caoutchouc-bandes lorsque le défilement de l'élément est à sa limite et tenté de faire défiler plus. Personnellement, je considère cela comme un échec, donc je vais continuer à travailler sur elle, je voulais juste à la hauteur sur le fait d'essayer de comprendre cela. Ajouter un contrôle sur les lignes de l'OP du code pourrait être la réponse, mais je n'ai pas essayé.
Mise à JOUR (10/7/12):
Après beaucoup de travail, j'ai obtenu le code suivant fonctionne parfaitement dans iOS6 (ne l'ai pas testé autre chose). Pas de caoutchouc des bandes sur le corps, pas plus de questions quand à la limite de la zone de défilement, et il est natif de défilement de la performance tout au long de. C'est évidemment beaucoup plus de code qu'à l'origine, mais je pense que cela va donner le comportement le plus proche de l'OP objectifs.
Malheureusement, il n'y a pas de formule magique pour résoudre ce problème tant que la bande de caoutchouc de défilement sur le navigateur Safari Mobile est une fonction intégrée de 'fonction' du navigateur lui-même. En utilisant un mécanisme de défilement par défaut fourni par le navigateur, vous allez vous retrouver avec le caoutchouc de la bande de défilement à un certain degré.
Il y a deux façons je suggère de s'attaquer à ce:
Méthode 1
Se lier à la
touchmove
de l'événement sur la</body>
élément et de vérifier la cible de latouchmove
événement pour voir si vous le souhaitez, feu ou aime pas tellement:HTML
JS
JSFiddle Exemple Ici
Cette méthode utilise le défilement par défaut du navigateur, il a cependant l'inconvénient que vous aurez encore le caoutchouc de la bande de la vitesse de défilement en haut ou en bas du parchemin
</div>
.Méthode 2
Se lier à la
touchmove
cas de la</body>
élément comme avant, mais dans ce cas nous empêcher Toustouchmove
événements et de compter sur l'excellent iScroll 4 plugin pour gérer le défilement, comme suit:HTML
JS
JSFiddle Exemple Ici
C'est ma méthode préférée, car il bloque tout le caoutchouc de la bande de défilement et offre une belle zone de défilement, cependant il s'appuie sur l'utilisation d'un plugin.
J'espère que cette aide
Voici une solution qui utilise jQuery et Hammer.js (jquery-mise en œuvre). C'est deux bibliothèques, mais si vous travaillez sur mobile, les chances sont que vous aurez envie d'inclure le Marteau de toute façon.
Pour chaque drag-événement que les bulles vers le haut (donc non-défilement de glisser interactions pouvez utiliser stopPropagation) le gestionnaire vérifie si il fait barboter à travers tous les éléments class=défilement, le cas échéant, si l'utilisateur fait défiler dans le permis limites de la scrollContainer et alors seulement est-il permis de natif de défilement.
De tuer traîne par pincement, etc.; s'échapper comme nécessaire pour permettre le zoom si votre vue est user-scalable
Testé sur ios7/safari, android4.3/webview et android4.3/firefoxMobile25 et la seule solution qui ne rompt pas.
touch-action
sont nécessaires pour faire ce travail?J'ai écrit, à mon avis, la meilleure solution pour ce problème. Il permet de désactiver le défilement en général, à moins que l'élément a y défilement.
Basé sur @Marc réponse, nous sommes arrivés avec cette alternative, qui semble fonctionner. Remplacer
.page_list
avec les noms de classe de défilement des éléments.Enfin j'ai mélangé quelques méthodes et ces codes sont la version de travail.
Mais vous devez comprendre la hammer.js
CSS
JAVASCRIPT
Il suffit d'ajouter une
-webkit-overflow-scrolling: auto;
à la div vous souhaitez empêcher de rebondir