als Popup mit .show() oder dem open-Attribut positioniert es automatisch mit position: absolute im DOM. Grundlegende CSS-Stile wie Ränder und Rahmen werden auf das Element angewendet, und das erste fokussierbare Element im Fenster erhält durch das Autofokus-Attribut automatisch den Fokus. Der Rest der Seite bleibt interaktiv.
Die Mechanik eines modalen Fensters
Ein modales Fenster ist komplexer gestaltet und funktioniert komplexer als ein Popup.
Dokumentüberlagerung
Beim Öffnen eines modalen Fensters mit .showModal() wird der
Das Konzept der Ebenen bezieht sich auf den Stapelkontext, der definiert, wie Elemente entlang der Z-Achse relativ zum Benutzer positioniert werden. Durch Festlegen eines Z-Index-Werts in CSS wird ein Stapelkontext für ein Element erstellt, in dem die Position seiner untergeordneten Elemente innerhalb dieses Kontexts berechnet wird. Modale Fenster stehen immer an der Spitze dieser Hierarchie, daher ist kein Z-Index erforderlich.
Erfahren Sie mehr über den Stacking-Kontext auf MDN.
Um mehr über die in der obersten Ebene gerenderten Elemente zu erfahren, besuchen Sie MDN.
Sperrung von Dokumenten
Wenn ein modales Element in der obersten Ebene gerendert wird, wird ein ::backdrop-Pseudoelement mit der gleichen Größe wie der sichtbare Dokumentbereich erstellt. Dieser Hintergrund verhindert die Interaktion mit dem Rest der Seite, auch wenn pointer-events: none CSS-Regel festgelegt ist.
Das Inert-Attribut wird automatisch für alle Elemente außer dem modalen Fenster festgelegt und blockiert Benutzeraktionen. Es deaktiviert Klick- und Fokusereignisse und macht die Elemente für Bildschirmlesegeräte und andere unterstützende Technologien unzugänglich.
Erfahren Sie mehr über das inerte Attribut auf MDN.
Fokusverhalten
Wenn das Modal geöffnet wird, erhält das erste fokussierbare Element darin automatisch den Fokus. Um das ursprünglich fokussierte Element zu ändern, können Sie die Attribute autofocus oder tabindex verwenden. Das Festlegen von tabindex für das Dialogelement selbst ist nicht möglich, da es das einzige Element auf der Seite ist, bei dem keine inerte Logik gilt.
Nachdem der Dialog geschlossen wurde, kehrt der Fokus zu dem Element zurück, das ihn geöffnet hat.
Lösen von UX-Problemen mit modalen Fenstern
Leider ist die native Implementierung des
Scroll-Blockierung
Auch wenn das native modale HTML5-Fenster ein ::backdrop-Pseudoelement erstellt, das die Interaktion mit dem darunter liegenden Inhalt blockiert, ist der Seitenscroll weiterhin aktiv. Dies kann für Benutzer ablenkend sein, daher wird empfohlen, den Inhalt des Textkörpers abzuschneiden, wenn das Modal geöffnet wird:
<dialog>
<pre class="brush:php;toolbar:false">const popUpElement = document.getElementById("pop-up");
popUpElement.show();
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Eine solche CSS-Regel muss jedes Mal dynamisch hinzugefügt und entfernt werden, wenn das modale Fenster geöffnet und geschlossen wird. Dies kann durch Bearbeiten einer Klasse erreicht werden, die diese CSS-Regel enthält:
<dialog>
<pre class="brush:php;toolbar:false">const modalElement = document.getElementById("modal");
modalElement.showModal();
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Sie können auch den :has-Selektor verwenden, wenn sein Supportstatus den Anforderungen des Projekts entspricht.
<dialog open>Hi, I'm a popup!</dialog>
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Probieren Sie es aus: https://codepen.io/alexgriss/pen/XWOyVKj
Schließen des Dialogs durch Klicken außerhalb des Fensters
Dies ist ein Standard-UX-Szenario für ein modales Fenster und kann auf verschiedene Arten implementiert werden. Hier sind zwei Möglichkeiten, dieses Problem zu lösen:
Eine Methode, die auf dem Verhalten des Pseudoelements ::backdrop basiert
Ein Klick auf das Pseudoelement ::backdrop gilt als Klick auf das Dialogelement selbst. Wenn Sie daher den gesamten Inhalt des modalen Fensters in ein zusätzliches
und dann das Dialogelement selbst abdecken, können Sie bestimmen, wohin der Klick gerichtet war – auf den Hintergrund oder auf den modalen Fensterinhalt.
Vergessen Sie nicht, die standardmäßigen Abstands- und Rahmenstile des Browsers für den
<dialog>
<pre class="brush:php;toolbar:false">const popUpElement = document.getElementById("pop-up");
popUpElement.show();
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Jetzt wenden wir die allgemeinen Stile für die Rahmen und Ränder des modalen Fensters nur auf den inneren Wrapper an.
Wir müssen eine Funktion schreiben, die das modale Fenster nur schließt, wenn auf den Hintergrund geklickt wird, nicht auf das innere Wrapper-Element:
<dialog>
<pre class="brush:php;toolbar:false">const modalElement = document.getElementById("modal");
modalElement.showModal();
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Probieren Sie es aus: https://codepen.io/alexgriss/pen/mdvQXpJ
Eine Methode, die auf der Bestimmung der Größe des Dialogfensters basiert
Diese Methode unterscheidet sich von der ersten, die einen zusätzlichen Wrapper für den modalen Inhalt benötigte. Hier benötigen Sie keine zusätzliche Verpackung. Sie müssen lediglich überprüfen, ob die Position des Cursors beim Klicken den Bereich des Elements verlässt:
<dialog open>Hi, I'm a popup!</dialog>
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Probieren Sie es aus: https://codepen.io/alexgriss/pen/NWoePVP
Gestalten des Dialogfensters
Der
Den Hintergrund mit dem ::backdrop-Selektor gestalten: https://codepen.io/alexgriss/pen/ExrOQEO
Animiertes Dialogfenster zum Öffnen und Schließen: https://codepen.io/alexgriss/pen/QWYJQJO
Modalfenster als Seitenleiste: https://codepen.io/alexgriss/pen/GRzwxgr
Zugänglichkeit
Lange Zeit war der
Wenn ein
Standardmäßig ist der
Hier finden Sie einige Möglichkeiten, die Barrierefreiheit des
aria-labelledby
Fügen Sie immer einen Titel in Dialogfenster ein und geben Sie das aria-labelledby-Attribut für das
<dialog>
<pre class="brush:php;toolbar:false">const popUpElement = document.getElementById("pop-up");
popUpElement.show();
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Wenn Sie das Pseudoelement ::backdrop formatieren müssen, stellen Sie sicher, dass Sie diese Stile auch auf das entsprechende .backdrop-Element anwenden, um die Kompatibilität mit älteren Browsern sicherzustellen:
<dialog>
<pre class="brush:php;toolbar:false">const modalElement = document.getElementById("modal");
modalElement.showModal();
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Es wird empfohlen, das Polyfill über einen dynamischen Import zu verbinden und nur für Browser, die das
<dialog open>Hi, I'm a popup!</dialog>
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Abschluss
Das native HTML5
In diesem Artikel haben wir die folgenden Themen besprochen:
- Probleme im
- Interaktion mit dem
- Wie Dialogfenster auf Browserebene funktionieren;
- Häufige Probleme mit Modalitäten und ihre Lösungen;
- Verbesserung der Zugänglichkeit des
- Erweiterung der Browserunterstützung für
Abschließend lade ich Sie ein, sich die Implementierung der modalen Fensterkomponente in reinem JS anzusehen, die die im Artikel besprochenen Hauptaspekte berücksichtigt: https://codepen.io/alexgriss/pen/abXPOPP
Das ist alles, was ich über die Arbeit mit dem
Das obige ist der detaillierte Inhalt vonSo verwenden Sie das HTMLlt;dialog>-Element. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!