J'utilise le plugin scrollTo jQuery et je voudrais savoir s'il est possible de désactiver temporairement le défilement de l'élément window via Javascript? La raison pour laquelle je voudrais désactiver le défilement est que lorsque vous faites défiler pendant que scrollTo est en cours d'animation, cela devient vraiment moche;)
Bien sûr, je pourrais faire un $("body").css("overflow", "hidden");
puis le remettre sur auto lorsque l'animation s'arrête, mais il serait préférable que la barre de défilement soit toujours visible mais inactive.
javascript
jquery
scroll
Olivier Lalonde
la source
la source
Réponses:
L'
scroll
événement ne peut pas être annulé. Mais vous pouvez le faire en annulant ces événements d'interaction: défilement de lasouris et toucher et boutons associés au défilement.
[ Démo de travail ]
MISE À JOUR: bureau Chrome fixe et navigateurs mobiles modernes avec écouteurs passifs
la source
Faites-le simplement en ajoutant une classe au corps:
Ajoutez la classe puis supprimez lorsque vous souhaitez réactiver le défilement, testé dans IE, FF, Safari et Chrome.
Pour les appareils mobiles , vous devrez gérer l'
touchmove
événement:Et dissociez pour réactiver le défilement. Testé dans iOS6 et Android 2.3.3
la source
touchmove
événement, comme avec$('body').bind('touchmove', function(e){e.preventDefault()})
. Modifié cette réponse pour inclure cette solution mobile.$('body,html')
Voici une façon vraiment simple de le faire:
C'est un peu nerveux dans IE6.
la source
(0, 0)
, utilisez simplement la position de défilement actuelle.La solution suivante est un JavaScript basique mais pur (pas de jQuery):
la source
scroll-behavior: smooth
ça bouge. De plus, je ne suis pas d'accord avec Oto disant que c'est la faute du navigateur. Vous supposez essentiellement que quelque chose se produira instantanément alors qu'en réalité, il est asynchroneCette solution maintiendra la position de défilement actuelle pendant que le défilement est désactivé, contrairement à certains qui font remonter l'utilisateur vers le haut.
Il est basé sur la réponse de galambalazs , mais avec un support pour les appareils tactiles, et refactorisé comme un seul objet avec le plugin jquery wrapper.
Démo ici.
Sur github ici.
la source
mousewheel
fonctionnait à merveilleJe suis désolé de répondre à un ancien message mais je cherchais une solution et suis tombé sur cette question.
Il existe de nombreuses solutions pour que ce problème affiche toujours la barre de défilement, comme donner au conteneur une hauteur de 100% et un
overflow-y: scroll
style à .Dans mon cas, je viens de créer un div avec une barre de défilement que j'affiche en ajoutant
overflow: hidden
au corps:La barre de défilement de l'élément doit avoir les styles suivants:
Cela montre une barre de défilement grise, j'espère que cela aidera les futurs visiteurs.
la source
Je cherchais une solution à ce problème mais je n'étais pas satisfait de l'une des solutions ci-dessus (au moment d'écrire cette réponse ), j'ai donc trouvé cette solution.
CSS
JS
la source
overflow-y: scroll
le.scrollDisabled
style. Sinon, il y avait un petit saut car la barre de défilement se cachait à chaque fois. Bien sûr, cela ne fonctionne que pour moi car ma page est suffisamment longue pour avoir besoin d'une barre de défilement, même sur les plus grands écrans.Selon l'article de galambalazs , j'ajouterais la prise en charge des appareils tactiles, ce qui nous permet de toucher mais pas de faire défiler vers le haut ou vers le bas:
la source
À partir de Chrome 56 et d'autres navigateurs modernes, vous devez ajouter
passive:false
à l'addEventListener
appel pour que celapreventDefault
fonctionne. J'utilise donc ceci pour arrêter le défilement sur mobile:la source
Non, je n'irais pas avec la gestion des événements car:
tous les événements ne sont pas garantis pour atteindre le corps,
sélectionner du texte et se déplacer vers le bas fait défiler le document,
si à la phase d'événement, le détachement se passe mal, vous êtes condamné.
J'ai mordu par cela en faisant une action de copier-coller avec une zone de texte cachée et devinez quoi, la page défile chaque fois que je fais une copie car en interne je dois sélectionner la zone de texte avant d'appeler
document.execCommand('copy')
.En tout cas c'est comme ça que je vais, notez le
setTimeout()
:Un élan clignote lorsque les barres de défilement disparaissent momentanément, mais c'est acceptable, je pense.
la source
En fonction de ce que vous souhaitez réaliser avec le défilement supprimé, vous pouvez simplement corriger l'élément dont vous souhaitez supprimer le défilement (au clic, ou tout autre déclencheur dont vous souhaitez désactiver temporairement le défilement)
Je cherchais une solution "temp no scroll" et pour mes besoins, cela l'a résolu
faire un cours
puis avec Jquery
J'ai trouvé que c'était une solution assez simple qui fonctionne bien sur tous les navigateurs, et qui permet également une utilisation simple sur des appareils portables (par exemple, iPhones, tablettes, etc.). Puisque l'élément est temporairement corrigé, il n'y a pas de défilement :)
REMARQUE! Selon l'emplacement de votre élément "contentContainer", vous devrez peut-être l'ajuster à partir de la gauche. Ce qui peut facilement être fait en ajoutant une valeur CSS à gauche à cet élément lorsque la classe fixe est active
la source
Une autre solution:
De cette façon, vous avez toujours une barre de défilement verticale, mais comme la plupart de mon contenu est plus long que la fenêtre d'affichage, cela me convient. Le contenu est centré avec un div séparé, mais sans redéfinir la marge dans le corps, mon contenu resterait à gauche.
Ce sont les deux fonctions que j'utilise pour afficher mon popup / modal:
Résultat: fond non déroulant et pas de repositionnement du contenu à cause de la barre de défilement gauche. Testé avec FF, Chrome et IE 10 actuels.
la source
Que dis-tu de ça? (Si vous utilisez jQuery)
la source
J'utilise showModalDialog , pour afficher la page secondaire comme boîte de dialogue modale.
pour masquer les barres de défilement de la fenêtre principale:
et lors de la fermeture de la boîte de dialogue modale, montrant les barres de défilement de la fenêtre principale:
pour accéder aux éléments de la fenêtre principale à partir de la boîte de dialogue:
juste pour quiconque recherche showModalDialog : (après la ligne 29 du code original)
la source
L'annulation de l'événement comme dans la réponse acceptée est une méthode horrible à mon avis: /
Au lieu de cela, j'ai utilisé
position: fixed; top: -scrollTop();
ci-dessous.Démo: https://jsfiddle.net/w9w9hthy/5/
De mon projet popup jQuery: https://github.com/seahorsepip/jPopup
Ce code prend en compte les problèmes de largeur, hauteur, barre de défilement et saut de page.
Problèmes possibles résolus avec le code ci-dessus:
Si quelqu'un a des améliorations au code de gel / dégel des pages ci-dessus, faites-le moi savoir afin que je puisse ajouter ces améliorations à mon projet.
la source
la source
J'ai le même problème, voici la façon dont je le gère.
j'espère que cette aide.
la source
S'appuyant sur la réponse de Cheyenne Forbes, et celle que j'ai trouvée ici via fcalderan: Désactivez simplement le défilement pour ne pas le cacher? et pour résoudre le problème d'Hallodom de la disparition de la barre de défilement
CSS:
JS:
Ce code vous fait sauter en haut de la page, mais je pense que le code de fcalderan a une solution de contournement.
la source
Je sais que c'est une vieille question, mais j'ai dû faire quelque chose de très similaire, et après un certain temps à chercher une réponse et à essayer différentes approches, j'ai fini par utiliser une solution très simple.
Mon problème était très similaire, presque identique, la seule différence est que je n'avais pas à afficher la barre de défilement - je devais juste m'assurer que sa largeur serait toujours utilisée, donc la largeur de la page ne changerait pas pendant l'affichage de ma superposition .
Lorsque je commence à faire glisser ma superposition sur l'écran, je fais:
et après avoir fait glisser ma superposition hors de l'écran, je fais:
IMPORTANT: cela fonctionne parfaitement car ma superposition est positionnée
absolute
,right: 0px
quandvisible
.la source
La méthode la plus simple est:
Pour l'annuler:
Facile à mettre en œuvre, mais le seul inconvénient est:
Cela est dû à la suppression de la barre de défilement et à l'élargissement de la fenêtre d'affichage.
la source
body
dehtml
remplacer par.overflow:hidden
cela ne fonctionne pas làVoici ma solution pour arrêter le défilement (pas de jQuery). Je l'utilise pour désactiver le défilement lorsque le menu latéral apparaît.
J'ai mis 17px de padding-right pour compenser la disparition de la barre de défilement. Mais cela est également problématique, principalement pour les navigateurs mobiles. Résolu en obtenant la largeur de barre en fonction de cela .
Tous ensemble dans ce stylo.
la source
J'ai un problème similaire sur les appareils tactiles. L'ajout de "action tactile: aucune" à l'élément a résolu le problème.
Pour plus d'informations. Regarde ça:-
https://developer.mozilla.org/en-US/docs/Web/CSS/touch-action
la source
C'est la solution la plus simple que j'ai eu jusqu'à présent. Et croyez-moi, j'ai essayé tous les autres et c'est le plus simple. Cela fonctionne très bien sur les appareils Windows , ce qui pousse la page de droite pour avoir de la place pour la barre de défilement du système et les appareils IOS qui ne nécessitent pas d'espace pour leurs barres de défilement dans les navigateurs. Donc, en utilisant cela, vous n'aurez pas besoin d'ajouter de rembourrage à droite pour que la page ne scintille pas lorsque vous masquez le débordement du corps ou du HTML avec CSS .
La solution est assez simple si vous y réfléchissez. L'idée est de donner à window.scrollTop () la même position exacte au moment où une popup est ouverte. Modifiez également cette position lorsque la fenêtre se redimensionne (car la position de défilement change une fois que cela se produit).
Alors c'est parti ...
Créons d'abord la variable qui vous fera savoir que la fenêtre contextuelle est ouverte et appelez-la stopWindowScroll . Si nous ne le faisons pas, vous obtiendrez une erreur d'une variable non définie sur votre page et définissez-la sur 0 - comme non active.
Permet maintenant de créer la fonction popup ouverte qui peut être n'importe quelle fonction de votre code qui déclenche la popup que vous utilisez en tant que plugin ou personnalisé. Dans ce cas, ce sera une simple fenêtre contextuelle personnalisée avec un simple document sur la fonction de clic.
Donc, la prochaine chose que nous faisons est de créer la fonction close popup, qui, je le répète, peut être n'importe quelle fonction que vous avez déjà créée ou que vous utilisez dans un plugin. L'important est que nous avons besoin de ces 2 fonctions pour définir la variable stopWindowScroll sur 1 ou 0 pour savoir quand elle est ouverte ou fermée.
Permet ensuite de créer la fonction window.scroll afin que nous puissions empêcher le défilement une fois que stopWindowScroll mentionné ci-dessus est défini sur 1 - comme actif.
C'est ça. Aucun CSS requis pour que cela fonctionne, sauf vos propres styles pour la page. Cela a fonctionné comme un charme pour moi et j'espère que cela vous aide, vous et les autres.
Voici un exemple de travail sur JSFiddle:
Exemple JS Fiddle
Faites-moi savoir si cela a aidé. Cordialement.
la source
la source
Ce code fonctionnera sur Chrome 56 et plus (la réponse d'origine ne fonctionne plus sur Chrome).
Utilisez
DomUtils.enableScroll()
pour activer le défilement.Utilisez
DomUtils.disableScroll()
pour désactiver le défilement.la source
Pour éviter le saut, c'est ce que j'ai utilisé
et dans mon css
la source
J'ai trouvé cette réponse sur un autre site :
Désactiver le défilement:
Après avoir fermé le défilement de la version contextuelle:
la source
la solution de galambalazs est excellente! Cela a parfaitement fonctionné pour moi dans Chrome et Firefox. Et il peut également être étendu pour empêcher tout événement par défaut de la fenêtre du navigateur. Disons que vous faites une application sur la toile. Vous pouvez faire ceci:
Et puis sur votre application, disons que vous allez traiter vos propres événements, comme la souris, le clavier, les événements tactiles, etc. Vous pouvez désactiver les événements par défaut lorsque la souris pénètre dans le canevas et les réactiver lorsque la souris sort:
Vous pouvez même désactiver le menu clic droit avec ce hack:
la source
J'ai eu un problème d'animation similaire sur les écrans mobiles, mais pas sur les ordinateurs portables, lorsque j'essayais d'animer une div à l'aide de la commande animate de jquery. J'ai donc décidé d'utiliser une minuterie qui rétablissait la position de défilement de la fenêtre si fréquemment qu'à l'œil nu, le document semblait statique. Cette solution fonctionnait parfaitement sur un appareil mobile à petit écran comme Samsung Galaxy-2 ou iphone-5.
Logique principale de cette approche : Le minuteur pour définir la position de défilement de la fenêtre à la position de défilement d'origine doit être démarré avant la commande jquery animate, puis une fois l'animation terminée, nous devons effacer ce minuteur (
original scroll position
c'est la position juste avant le début de l'animation).J'ai trouvé à ma grande surprise que le document semblait en fait statique pendant la durée de l'animation si l'intervalle de temporisation était
1 millisecond
, ce que je visais.UNE AUTRE SOLUTION qui a fonctionné : Sur la base de la réponse de Mohammad Anini sous ce post pour activer / désactiver le défilement, j'ai également constaté qu'une version modifiée du code comme ci-dessous fonctionnait.
la source
Une solution simple qui a fonctionné pour moi (désactiver temporairement le défilement de la fenêtre).
Basé sur ce violon: http://jsfiddle.net/dh834zgw/1/
l'extrait de code suivant (à l'aide de jquery) désactivera le défilement de la fenêtre:
Et dans votre css:
Maintenant, lorsque vous supprimez le modal, n'oubliez pas de supprimer la classe noscroll sur la balise html:
la source