recherche
Maisoninterface Webtutoriel CSSEmpêcher le défilement de la page lorsqu'un modal est ouvert

Empêcher le défilement de la page lorsque la boîte modale est ouverte

Avez-vous déjà rencontré cette situation: ouvrez une boîte modale, faites défiler, fermez-la et la page saute vers un autre endroit?

En effet, la boîte modale n'est qu'un élément de la page, elle peut rester en place, mais le reste de la page fonctionne toujours correctement.

Parfois, cela n'a pas d'importance, comme lorsque la hauteur de l'écran est exactement égale à la hauteur de la fenêtre. Mais dans d'autres cas, un problème de défilement se produit. La bonne nouvelle est que nous pouvons empêcher cela avec certaines astuces CSS (et JavaScript).

Commencez par une solution simple

Nous pouvons réduire considérablement le problème du défilement de la page lorsque la boîte modale est ouverte en définissant la hauteur de tout le corps à la hauteur complète de la fenêtre et en cachant un débordement vertical lorsque la boîte modale est ouverte:

 <code>body.modal-open { height: 100vh; overflow-y: hidden; }</code>

C'est bien, mais si nous avons fait défiler les éléments de la page avant d'ouvrir la boîte modale, il y aura un léger réarrangement horizontal. La largeur de la fenêtre augmente d'environ 15 pixels, ce qui est exactement la largeur de la barre de défilement. Ajustez un peu le bon remplissage du corps pour éviter cela.

 <code>body { height: 100vh; overflow-y: hidden; padding-right: 15px; /* 避免宽度重排*/ }</code>

Notez que la hauteur de la boîte modale doit être inférieure à la hauteur de la fenêtre pour que cette méthode fonctionne. Sinon, la barre de défilement sur le corps sera nécessaire.

Que faire sur mobile?

Cette solution fonctionne bien sur le bureau et le mobile Android. Cependant, iOS Safari a besoin de plus de traitement car le corps fait toujours défiler lorsque la boîte modale s'ouvre en cliquant et en se déplaçant sur l'écran tactile.

Nous pouvons régler le corps sur le positionnement fixe comme une solution:

 <code>body { position: fixed; }</code>

C'est bon maintenant! Lorsque vous touchez l'écran, le corps ne répondra pas. Cependant, il y a encore un "petit" problème ici. En supposant que le déclencheur de la boîte modale est en bas de la page, nous cliquons pour l'ouvrir. très bien! Mais maintenant, nous faisons défiler automatiquement le haut de l'écran, ce qui est aussi déroutant que le comportement de défilement que nous essayons de résoudre.

Oups!

Nous devons donc utiliser JavaScript

Nous pouvons utiliser JavaScript pour éviter la bulle des événements tactiles. Nous savons tous qu'il devrait y avoir un calque d'arrière-plan lorsque la boîte modale est ouverte. Malheureusement, dans iOS, StopPropagation est un peu gênant à travailler avec des événements tactiles. Mais la prévention fonctionne très bien. Cela signifie que nous devons ajouter des écouteurs d'événements à chaque nœud DOM inclus dans la boîte modale - non seulement sur l'arrière-plan ou la couche de boîte modale. La bonne nouvelle est que de nombreuses bibliothèques JavaScript peuvent le faire, y compris la JQuery éprouvée.

Encore une chose: que se passe-t-il si nous devons faire défiler à l'intérieur de la boîte modale? Nous devons toujours déclencher la réponse à l'événement tactile, mais nous devons toujours arrêter le bouillonnement lorsqu'il atteint le haut ou le bas de la boîte modale. Cela semble très compliqué, donc nous n'avons pas complètement résolu le problème.

Méthode du corps fixe amélioré

Ce que nous utilisons est:

 <code>body { position: fixed; }</code>

Si nous connaissons la position supérieure de défilement et l'ajoutant à notre CSS, le corps ne fait pas défiler en haut de l'écran, donc le problème est résolu. Nous pouvons utiliser JavaScript pour calculer le dessus de défilement et ajouter cette valeur au style corporel:

 // Lorsque la boîte modale s'affiche, nous avons besoin d'un corps fixe
document.body.style.position = 'fixe';
document.body.style.top = `- $ {window.scrolly} px`;

// Lorsque la boîte modale est masquée, nous devons le garder en haut de la position de défilement document.body.style.position = '';
document.body.style.top = '';

Cela fonctionne, mais il y a encore une petite fuite après la fermeture de la boîte modale. Plus précisément, lorsque la boîte modale est ouverte et que le corps est réglé sur fixe, la page semble avoir perdu sa position de défilement. Nous devons donc récupérer l'emplacement. Modifions notre JavaScript pour résoudre ce problème.

 // Lorsque la boîte modale est cachée ...
const Scrolly = document.body.style.top;
document.body.style.position = '';
document.body.style.top = '';
window.scrollto (0, parseInt (Scrolly || '0') * -1);

j'y suis arrivé! Le corps ne fait plus défiler lorsque la boîte modale est ouverte et reste en position de défilement lorsque la boîte modale est ouverte et fermée. Vive!

Empêcher le défilement de la page lorsqu'un modal est ouvert

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Simulation du mouvement de la sourisSimulation du mouvement de la sourisApr 22, 2025 am 11:45 AM

Si vous avez jamais eu à afficher une animation interactive lors d'un discours en direct ou d'une classe, vous savez peut-être que ce n'est pas toujours facile d'interagir avec vos diapositives

Alimentation de recherche avec Astro Actions et Fuse.jsAlimentation de recherche avec Astro Actions et Fuse.jsApr 22, 2025 am 11:41 AM

Avec Astro, nous pouvons générer la plupart de notre site pendant notre version, mais avoir un petit peu de code côté serveur qui peut gérer les fonctionnalités de recherche en utilisant quelque chose comme Fuse.js. Dans cette démo, nous utiliserons du fusible pour rechercher un ensemble de «signets» personnels

Undefined: la troisième valeur booléenneUndefined: la troisième valeur booléenneApr 22, 2025 am 11:38 AM

Je voulais implémenter un message de notification dans l'un de mes projets, similaire à ce que vous verriez dans Google Docs pendant que un document enregistre. En d'autres termes, un

Pour défendre la déclaration ternairePour défendre la déclaration ternaireApr 22, 2025 am 11:25 AM

Il y a quelques mois, j'étais sur Hacker News (comme on le fait) et j'ai rencontré un article (maintenant supprimé) sur le fait de ne pas utiliser les déclarations. Si vous êtes nouveau dans cette idée (comme moi

Utilisation de l'API de discours Web pour les traductions multilinguesUtilisation de l'API de discours Web pour les traductions multilinguesApr 22, 2025 am 11:23 AM

Depuis les premiers jours de la science-fiction, nous avons fantasmé sur les machines qui nous parlent. Aujourd'hui, c'est monnaie courante. Même ainsi, la technologie de fabrication

Blocs de jetpack GutenbergBlocs de jetpack GutenbergApr 22, 2025 am 11:20 AM

Je me souviens quand Gutenberg a été libéré dans Core, parce que j'étais à WordCamp Us ce jour-là. Un certain nombre de mois se sont passés maintenant, donc j'imagine de plus en plus d'entre nous

Création d'un composant de pagination réutilisable dans VueCréation d'un composant de pagination réutilisable dans VueApr 22, 2025 am 11:17 AM

L'idée derrière la plupart des applications Web est de récupérer les données de la base de données et de la présenter à l'utilisateur de la meilleure façon possible. Quand nous traitons des données là-bas

En utilisant 'Box Shadows' et Clip-chemin ensembleEn utilisant 'Box Shadows' et Clip-chemin ensembleApr 22, 2025 am 11:13 AM

Laissez faire un peu étape par étape d'une situation où vous ne pouvez pas faire ce qui semble logique, mais vous pouvez toujours le faire avec la ruse CSS. En ce moment

See all articles

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Télécharger la version Mac de l'éditeur Atom

Télécharger la version Mac de l'éditeur Atom

L'éditeur open source le plus populaire

SublimeText3 Linux nouvelle version

SublimeText3 Linux nouvelle version

Dernière version de SublimeText3 Linux

mPDF

mPDF

mPDF est une bibliothèque PHP qui peut générer des fichiers PDF à partir de HTML encodé en UTF-8. L'auteur original, Ian Back, a écrit mPDF pour générer des fichiers PDF « à la volée » depuis son site Web et gérer différentes langues. Il est plus lent et produit des fichiers plus volumineux lors de l'utilisation de polices Unicode que les scripts originaux comme HTML2FPDF, mais prend en charge les styles CSS, etc. et présente de nombreuses améliorations. Prend en charge presque toutes les langues, y compris RTL (arabe et hébreu) ​​et CJK (chinois, japonais et coréen). Prend en charge les éléments imbriqués au niveau du bloc (tels que P, DIV),

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Listes Sec

Listes Sec

SecLists est le compagnon ultime du testeur de sécurité. Il s'agit d'une collection de différents types de listes fréquemment utilisées lors des évaluations de sécurité, le tout en un seul endroit. SecLists contribue à rendre les tests de sécurité plus efficaces et productifs en fournissant facilement toutes les listes dont un testeur de sécurité pourrait avoir besoin. Les types de listes incluent les noms d'utilisateur, les mots de passe, les URL, les charges utiles floues, les modèles de données sensibles, les shells Web, etc. Le testeur peut simplement extraire ce référentiel sur une nouvelle machine de test et il aura accès à tous les types de listes dont il a besoin.