sous forme de popup avec .show() ou l'attribut open le positionne automatiquement avec position: absolue dans le DOM. Les styles CSS de base, comme les marges et les bordures, sont appliqués à l'élément, et le premier élément pouvant avoir le focus à l'intérieur de la fenêtre obtiendra automatiquement le focus via l'attribut autofocus. Le reste de la page reste interactif.
La mécanique d'une fenêtre modale
Une fenêtre modale est conçue et fonctionne de manière plus complexe qu'une popup.
Superposition de documents
Lors de l'ouverture d'une fenêtre modale avec .showModal(), le
Le concept de calques fait référence au contexte d'empilement, qui définit la façon dont les éléments sont positionnés le long de l'axe Z par rapport à l'utilisateur. La définition d'une valeur z-index en CSS crée un contexte d'empilement pour un élément, où la position de ses enfants est calculée dans ce contexte. Les fenêtres modales sont toujours au sommet de cette hiérarchie, aucun z-index n'est donc nécessaire.
En savoir plus sur le contexte d'empilage sur MDN.
Pour en savoir plus sur les éléments rendus dans la couche supérieure, visitez MDN.
Blocage de documents
Lorsqu'un élément modal est rendu dans la couche supérieure, un pseudo-élément ::backdrop est créé avec la même taille que la zone visible du document. Cette toile de fond empêche l'interaction avec le reste de la page, même si la règle CSS pointer-events: none est définie.
L'attribut inerte est automatiquement défini pour tous les éléments à l'exception de la fenêtre modale, bloquant les actions de l'utilisateur. Il désactive les événements de clic et de mise au point et rend les éléments inaccessibles aux lecteurs d'écran et autres technologies d'assistance.
En savoir plus sur l'attribut inerte sur MDN.
Comportement de concentration
Lorsque le modal s'ouvre, le premier élément pouvant être focalisé à l'intérieur obtient automatiquement le focus. Pour modifier l'élément initialement ciblé, vous pouvez utiliser les attributs autofocus ou tabindex. Définir tabindex pour l'élément de dialogue lui-même n'est pas possible, car c'est le seul élément de la page où la logique inerte ne s'applique pas.
Une fois la boîte de dialogue fermée, le focus revient sur l'élément qui l'a ouverte.
Résoudre les problèmes UX avec les fenêtres modales
Malheureusement, l'implémentation native du
Blocage du défilement
Même si la fenêtre modale HTML5 native crée un pseudo-élément ::backdrop qui bloque l'interaction avec le contenu en dessous, le défilement de la page est toujours actif. Cela peut distraire les utilisateurs, il est donc recommandé de couper le contenu du corps lorsque le modal s'ouvre :
<dialog>
<pre class="brush:php;toolbar:false">const popUpElement = document.getElementById("pop-up");
popUpElement.show();
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Une telle règle CSS devra être ajoutée et supprimée dynamiquement à chaque fois que la fenêtre modale est ouverte et fermée. Ceci peut être réalisé en manipulant une classe contenant cette règle CSS :
<dialog>
<pre class="brush:php;toolbar:false">const modalElement = document.getElementById("modal");
modalElement.showModal();
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Vous pouvez également utiliser le sélecteur :has si son statut de support répond aux exigences du projet.
<dialog open>Hi, I'm a popup!</dialog>
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Essayez-le : https://codepen.io/alexgriss/pen/XWOyVKj
Fermer la boîte de dialogue en cliquant en dehors de la fenêtre
Il s'agit d'un scénario UX standard pour une fenêtre modale et il peut être implémenté de plusieurs manières. Voici deux façons de résoudre ce problème :
Une méthode basée sur le comportement du pseudo-élément ::backdrop
Cliquer sur le pseudo-élément ::backdrop est considéré comme un clic sur l'élément de dialogue lui-même. Par conséquent, si vous enveloppez l'intégralité du contenu de la fenêtre modale dans un fichier
puis couvrez l'élément de dialogue lui-même, vous pouvez déterminer où le clic a été dirigé — sur l'arrière-plan ou sur le contenu de la fenêtre modale.
N'oubliez pas de réinitialiser les styles de remplissage et de bordure par défaut du navigateur pour le
<dialog>
<pre class="brush:php;toolbar:false">const popUpElement = document.getElementById("pop-up");
popUpElement.show();
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Maintenant, nous appliquons les styles courants pour les bordures et les marges de la fenêtre modale uniquement au wrapper interne.
Nous devons écrire une fonction qui fermera la fenêtre modale uniquement en cliquant sur le fond, pas sur l'élément wrapper interne :
<dialog>
<pre class="brush:php;toolbar:false">const modalElement = document.getElementById("modal");
modalElement.showModal();
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Essayez-le : https://codepen.io/alexgriss/pen/mdvQXpJ
Une méthode basée sur la détermination de la taille de la fenêtre de dialogue
Cette méthode est différente de la première, qui nécessitait un wrapper supplémentaire pour le contenu modal. Ici, vous n'avez pas besoin d'emballage supplémentaire. Il suffit de vérifier si la position du curseur sort de la zone de l'élément lorsqu'on clique dessus :
<dialog open>Hi, I'm a popup!</dialog>
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Essayez-le : https://codepen.io/alexgriss/pen/NWoePVP
Styliser la fenêtre de dialogue
Le L'élément est plus flexible en termes de style que de nombreux éléments HTML natifs. Voici quelques exemples de style des fenêtres de dialogue :
Styliser la toile de fond à l'aide du sélecteur ::backdrop : https://codepen.io/alexgriss/pen/ExrOQEO
Ouverture et fermeture de la fenêtre de dialogue animée : https://codepen.io/alexgriss/pen/QWYJQJO
Fenêtre modale sous forme de barre latérale : https://codepen.io/alexgriss/pen/GRzwxgr
Accessibilité
Pendant longtemps, le
Lorsqu'un
Par défaut, le
Voici quelques façons d'améliorer l'accessibilité de la fenêtre
aria-labelledby
Incluez toujours un titre dans les fenêtres de dialogue et spécifiez l'attribut aria-labelledby pour l'attribut
<dialog>
<pre class="brush:php;toolbar:false">const popUpElement = document.getElementById("pop-up");
popUpElement.show();
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Si vous devez styliser le pseudo-élément ::backdrop, assurez-vous d'appliquer également ces styles à l'élément .backdrop correspondant pour garantir la compatibilité avec les anciens navigateurs :
<dialog>
<pre class="brush:php;toolbar:false">const modalElement = document.getElementById("modal");
modalElement.showModal();
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Il est recommandé de connecter le polyfill via une importation dynamique et uniquement pour les navigateurs ne prenant pas en charge le
<dialog open>Hi, I'm a popup!</dialog>
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Conclusion
Le
Dans cet article, nous avons abordé les sujets suivants :
- Problèmes du l'élément résout ;
- Interaction avec le
- Comment fonctionnent les fenêtres de dialogue au niveau du navigateur ;
- Problèmes courants avec les modaux et leurs solutions ;
- Amélioration de l'accessibilité de la fenêtre
- Extension de la prise en charge du navigateur pour l'option
Enfin, je vous invite à découvrir l'implémentation du composant de fenêtre modale en JS pur, qui prend en compte les principaux aspects abordés dans l'article : https://codepen.io/alexgriss/pen/abXPOPP
C'est tout ce que je voulais partager sur le travail avec l'interface
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!