J'essaie de désactiver la barre de défilement html / body du parent pendant que j'utilise une lightbox. Le mot principal ici est désactiver . Je ne pas envie de le cacher avec overflow: hidden;
.
La raison en est que overflow: hidden
le site saute et occupe la zone où se trouvait le parchemin.
Je veux savoir s'il est possible de désactiver une barre de défilement tout en l'affichant.
javascript
jquery
html
css
Dejan.S
la source
la source
Réponses:
Si la page sous la superposition peut être "fixée" en haut, lorsque vous ouvrez la superposition, vous pouvez définir
vous devriez toujours voir la barre de défilement de droite, mais le contenu ne peut pas défiler. Lorsque vous fermez la superposition, rétablissez simplement ces propriétés avec
Je viens de proposer cette méthode uniquement parce que vous n'auriez pas besoin de modifier un événement de défilement
Mettre à jour
Vous pouvez également faire une légère amélioration: si vous obtenez la
document.documentElement.scrollTop
propriété via javascript juste avant l'ouverture du calque, vous pouvez affecter dynamiquement cette valeur en tant quetop
propriété de l'élément body: avec cette approche, la page restera à sa place, peu importe si vous '' re en haut ou si vous avez déjà fait défiler.Css
JS
la source
$('body').css('top', -($('body').scrollTop()) + 'px').addClass('noscroll');
Quatre petits ajouts à la solution sélectionnée:
Solution complète qui semble fonctionner pour la plupart des navigateurs:
CSS
Désactiver le défilement
Activer le défilement
Merci à Fabrizio et Dejan de m'avoir mis sur la bonne voie et à Brodingo pour la solution à la double barre de défilement
la source
afterLoad()
et lesafterClose
rappels. Peut être utile pour les autres personnes qui recherchent cette question.scrollTop
telle sorte que la ligne 2 du code «Désactiver le défilement» peut être exprimée sous la forme$( window ).scrollTop()
.if (scrollTop < 0) { scrollTop = 0; }
. Voici le code complet pour désactiver gist.github.com/jayd3e/2eefbbc571cd1668544b .Avec jQuery inclus:
désactiver
activer
usage
la source
Je suis l'OP
Avec l'aide de la réponse de fcalderan, j'ai pu trouver une solution. Je laisse ma solution ici car elle clarifie la façon de l'utiliser et ajoute un détail très crucial,
width: 100%;
J'ajoute cette classe
cela a fonctionné pour moi et j'utilisais Fancyapp.
la source
Cela a très bien fonctionné pour moi ....
enveloppez simplement ces deux lignes de code avec tout ce qui décide quand vous allez verrouiller le défilement.
par exemple
la source
Vous ne pouvez pas désactiver l'événement de défilement, mais vous pouvez désactiver les actions associées qui mènent à un défilement, comme la molette de la souris et le déplacement tactile:
la source
Vous pouvez masquer la barre de défilement du corps avec
overflow: hidden
et définir une marge en même temps afin que le contenu ne saute pas:Et puis vous pouvez ajouter une barre de défilement désactivée à la page pour combler l'écart:
J'ai fait exactement cela pour ma propre implémentation de lightbox. Semble bien fonctionner jusqu'à présent.
la source
C'est la solution que nous avons choisie. Enregistrez simplement la position de défilement lorsque la superposition est ouverte, revenez à la position enregistrée chaque fois que l'utilisateur tente de faire défiler la page et désactivez l'écouteur lorsque la superposition est fermée.
C'est un peu nerveux sur IE, mais fonctionne comme un charme sur Firefox / Chrome.
la source
z-index
de.overlay-shown
pour être supérieur à l' en- tête fixe. (J'ai ce code en cours de production sur un site avec un en-tête fixe et cela fonctionne très bien.)body
balise. J'ai testé votre code hier et j'ai un en-tête fixe en haut de ma page. Si je gère le défilement via labody
balise, la barre de défilement sera sous l'en-tête fixe.$("body")
, nous utilisons$(window)
. Et au lieu dez-index: -1
sur la superposition pour le cacher, vous pouvez utiliservisibility: hidden
ou similaire. Voir jsfiddle.net/8p2gfeha pour un test rapide pour voir si cela fonctionne. L'en-tête fixe n'apparaît plus en haut de la barre de défilement. J'essaierai éventuellement d'intégrer ces changements dans la réponse.J'ai eu un problème similaire: un menu de gauche qui, lorsqu'il apparaît, empêche le défilement. Dès que la hauteur a été fixée à 100vh, la barre de défilement a disparu et le contenu a basculé vers la droite.
Donc, si cela ne vous dérange pas de garder la barre de défilement activée (mais de régler la fenêtre sur toute sa hauteur pour qu'elle ne défile pas n'importe où), une autre possibilité consiste à définir une petite marge inférieure, qui gardera les barres de défilement montrant:
la source
overflow:hidden
n'empêche- t-il pas la marge d'avoir un effet?vous pouvez garder le débordement: caché mais gérer la position de défilement manuellement:
avant d'afficher la trace de la position réelle du défilement:
ça devrait marcher
la source
Le moyen grossier mais fonctionnel sera de forcer le défilement vers le haut, désactivant ainsi efficacement le défilement:
Lorsque vous ouvrez la lightbox, soulevez le drapeau et lorsque vous le fermez, abaissez le drapeau.
Cas de test en direct .
la source
J'aime m'en tenir à la méthode "overflow: hidden" et simplement ajouter un padding-right égal à la largeur de la barre de défilement.
Obtenez la fonction de largeur de la barre de défilement, par lostsource .
Lors de l'affichage de la superposition, ajoutez la classe "noscroll" au html et ajoutez padding-right au corps:
Lorsque vous vous cachez, supprimez la classe et le rembourrage:
Le style noscroll est juste ceci:
Notez que si vous avez des éléments avec position: fixed, vous devez également ajouter le remplissage à ces éléments.
la source
<div id="lightbox">
est à l'intérieur de l'<body>
élément, donc lorsque vous faites défiler la lightbox, vous faites également défiler le corps. La solution consiste à ne pas étendre l'<body>
élément à plus de 100%, à placer le contenu long à l'intérieur d'un autrediv
élément et à ajouter une barre de défilement si nécessaire à cetdiv
élément avecoverflow: auto
.Maintenant, faire défiler la lightbox (et le
body
aussi) n'a aucun effet, car le corps ne dépasse pas 100% de la hauteur de l'écran.la source
Tous les systèmes basés sur javascript modal / lightbox utilisent un débordement lors de l'affichage du modal / lightbox, sur la balise html ou la balise body.
Lorsque la lightbox est affichée, le js pousse un débordement caché sur le html ou la balise body. Lorsque la lightbox est masquée, certaines suppriment les autres masquées poussent un débordement automatique sur le html ou la balise body.
Les développeurs qui travaillent sur Mac, ne voient pas le problème de la barre de défilement.
Il suffit de remplacer le caché par un unset pour ne pas voir le contenu glisser sous le modal de la suppression de la barre de défilement.
Lightbox ouvert / montrer:
Fermer / masquer la visionneuse:
la source
Si la page sous la superposition peut être "fixée" en haut, lorsque vous ouvrez la superposition, vous pouvez définir
fournissez cette classe au corps défilant, vous devriez toujours voir la barre de défilement droite mais le contenu n'est pas défilable.
Pour conserver la position de la page, faites ceci en jquery
Lorsque vous fermez la superposition, rétablissez simplement ces propriétés avec
Je viens de proposer cette méthode uniquement parce que vous n'auriez pas besoin de modifier un événement de défilement
la source
CSS
JS
Il ne vous reste plus qu'à appeler les fonctions
la source
Vous pouvez le faire avec Javascript:
Et puis désactivez-le lorsque votre lightbox est fermée.
Mais si votre lightbox contient une barre de défilement, vous ne pourrez pas faire défiler pendant qu'elle est ouverte. En effet,
window
contient à la foisbody
et#lightbox
. Il faut donc utiliser une architecture comme la suivante:Et puis appliquez l'
onscroll
événement uniquement sur#global
.la source