tersuai
Mari kita terokai ciri
Aspek teras penggunaan
HTML
Tetingkap timbul kerap digunakan untuk memaparkan pemberitahuan ringkas, seperti mesej kuki, makluman roti bakar yang hilang, petua alat atau elemen menu konteks klik kanan.
Tetingkap modal membantu pengguna menumpukan pada tugas tertentu, seperti pemberitahuan dan amaran yang memerlukan pengesahan pengguna, borang interaktif yang kompleks dan peti cahaya untuk imej atau video.
Tetingkap timbul tidak menghalang interaksi dengan halaman, manakala tetingkap modal menindih dokumen, meredupkan latar belakang dan menyekat tindakan lain. Tingkah laku ini berfungsi tanpa gaya atau skrip tambahan; satu-satunya perbezaan ialah kaedah yang digunakan untuk membuka dialog.
Kaedah pembukaan tetingkap dialog
— pop timbul:
<dialog>
<pre class="brush:php;toolbar:false">const popUpElement = document.getElementById("pop-up");
popUpElement.show();
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
— tetingkap modal:
<dialog>
<pre class="brush:php;toolbar:false">const modalElement = document.getElementById("modal");
modalElement.showModal();
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Dalam kedua-dua kes, membuka
<dialog open>Hi, I'm a popup!</dialog>
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Cubalah:
- Membuka pop timbul menggunakan kaedah .show(): https://codepen.io/alexgriss/pen/zYeMKJE
- Membuka tetingkap modal menggunakan kaedah .showModal(): https://codepen.io/alexgriss/pen/jOdQMeq
- Mengubah atribut terbuka secara langsung: https://codepen.io/alexgriss/pen/wvNQzRB
Pendekatan penutupan tetingkap dialog
Tetingkap dialog ditutup dengan cara yang sama, tidak kira bagaimana ia dibuka. Berikut ialah beberapa cara untuk menutup tetingkap pop timbul atau modal:
— dengan kaedah .close():
<dialog>
<pre class="brush:php;toolbar:false">const popUpElement = document.getElementById("pop-up");
popUpElement.show();
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
— dengan mencetuskan acara serah dalam borang dengan atribut method="dialog":
<dialog>
<pre class="brush:php;toolbar:false">const modalElement = document.getElementById("modal");
modalElement.showModal();
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
— dengan menekan kekunci Esc:
Penutupan dengan Esc berfungsi untuk tetingkap modal sahaja. Ia mula-mula mencetuskan acara pembatalan, kemudian ditutup, menjadikannya mudah untuk memberi amaran kepada pengguna tentang perubahan yang tidak disimpan dalam borang.
Cubalah:
- Menutup kotak dialog dengan kaedah tutup: https://codepen.io/alexgriss/pen/GRzwjaV
- Menutup kotak dialog melalui borang serahan: https://codepen.io/alexgriss/pen/jOdQVNV
- Menutup tetingkap modal dengan kekunci Esc: https://codepen.io/alexgriss/pen/KKJrNKW
- Menghalang tetingkap modal daripada ditutup dengan Esc: https://codepen.io/alexgriss/pen/mdvQObN
Nilai pulangan apabila ditutup
Apabila menutup dialog dengan borang menggunakan atribut method="dialog", anda boleh menangkap nilai butang serah. Ini berguna jika anda ingin mencetuskan tindakan yang berbeza berdasarkan butang yang diklik. Nilai disimpan dalam sifat returnValue.
Cubalah: https://codepen.io/alexgriss/pen/ZEwmBKx
Melihat lebih dekat bagaimana ia berfungsi
Mari kita mendalami mekanik tetingkap dialog dan butiran pelaksanaan penyemak imbasnya.
Mekanik pop timbul
Membuka
Mekanik tetingkap modal
Tetingkap modal direka bentuk dan berfungsi dengan cara yang lebih kompleks daripada pop timbul.
Tindanan dokumen
Apabila membuka tetingkap modal dengan .showModal(),
Konsep lapisan merujuk kepada konteks tindanan, yang mentakrifkan cara elemen diletakkan di sepanjang paksi Z berbanding pengguna. Menetapkan nilai indeks-z dalam CSS mewujudkan konteks tindanan untuk elemen, di mana kedudukan anak-anaknya dikira dalam konteks tersebut. Tetingkap modal sentiasa berada di bahagian atas hierarki ini, jadi indeks-z tidak diperlukan.
Ketahui lebih lanjut tentang konteks tindanan di MDN.
Untuk mengetahui lebih lanjut tentang elemen yang dipaparkan dalam lapisan atas, lawati MDN.
Menyekat dokumen
Apabila elemen modal dipaparkan di lapisan atas, elemen pseudo :: latar belakang dibuat dengan saiz yang sama dengan kawasan dokumen yang boleh dilihat. Tirai latar ini menghalang interaksi dengan seluruh halaman, walaupun acara penunjuk: tiada peraturan CSS ditetapkan.
Atribut lengai ditetapkan secara automatik untuk semua elemen kecuali tetingkap modal, menyekat tindakan pengguna. Ia melumpuhkan acara klik dan fokus serta menjadikan elemen tidak boleh diakses oleh pembaca skrin dan teknologi bantuan lain.
Ketahui lebih lanjut tentang atribut lengai pada MDN.
Tingkah laku fokus
Apabila modal dibuka, elemen boleh fokus pertama di dalamnya secara automatik mendapat fokus. Untuk menukar elemen fokus awal, anda boleh menggunakan atribut autofokus atau indeks tab. Menetapkan indeks tab untuk elemen dialog itu sendiri tidak boleh dilakukan, kerana ia merupakan satu-satunya elemen pada halaman yang tidak digunakan logik lengai.
Selepas dialog ditutup, fokus kembali kepada elemen yang membukanya.
Menyelesaikan masalah UX dengan tetingkap modal
Malangnya, pelaksanaan asli
Menyekat tatal
Walaupun tetingkap modal HTML5 asli mencipta elemen pseudo :: latar belakang yang menyekat interaksi dengan kandungan di bawahnya, tatal halaman masih aktif. Ini boleh mengganggu pengguna, jadi disyorkan untuk memotong kandungan badan apabila modal dibuka:
<dialog>
<pre class="brush:php;toolbar:false">const popUpElement = document.getElementById("pop-up");
popUpElement.show();
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Peraturan CSS sedemikian perlu ditambah dan dialih keluar secara dinamik setiap kali tetingkap modal dibuka dan ditutup. Ini boleh dicapai dengan memanipulasi kelas yang mengandungi peraturan CSS ini:
<dialog>
<pre class="brush:php;toolbar:false">const modalElement = document.getElementById("modal");
modalElement.showModal();
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Anda juga boleh menggunakan pemilih :has jika status sokongannya memenuhi keperluan projek.
<dialog open>Hi, I'm a popup!</dialog>
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Cubalah: https://codepen.io/alexgriss/pen/XWOyVKj
Menutup dialog dengan mengklik di luar tetingkap
Ini ialah senario UX standard untuk tetingkap modal dan ia boleh dilaksanakan dalam beberapa cara. Berikut adalah dua cara untuk menyelesaikan masalah ini:
Kaedah berdasarkan kelakuan elemen pseudo :: latar belakang
Mengklik pada elemen pseudo :: latar belakang dianggap sebagai klik pada elemen dialog itu sendiri. Oleh itu, jika anda membalut keseluruhan kandungan tetingkap modal dalam
dan kemudian menutup elemen dialog itu sendiri, anda boleh menentukan ke mana klik itu diarahkan — pada tirai latar atau pada kandungan tetingkap modal.
Jangan lupa untuk menetapkan semula pelapik lalai penyemak imbas dan gaya sempadan untuk
<dialog>
<pre class="brush:php;toolbar:false">const popUpElement = document.getElementById("pop-up");
popUpElement.show();
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Sekarang, kami menggunakan gaya biasa untuk sempadan dan jidar tetingkap modal hanya pada pembalut dalam.
Kita perlu menulis fungsi yang akan menutup tetingkap modal hanya apabila mengklik pada tirai latar, bukan pada elemen pembalut dalam:
<dialog>
<pre class="brush:php;toolbar:false">const modalElement = document.getElementById("modal");
modalElement.showModal();
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Cubalah: https://codepen.io/alexgriss/pen/mdvQXpJ
Kaedah berdasarkan penentuan saiz tetingkap dialog
Kaedah ini berbeza daripada yang pertama, yang memerlukan pembungkus tambahan untuk kandungan modal. Di sini, anda tidak memerlukan sebarang pembalut tambahan. Apa yang diperlukan ialah menyemak sama ada kedudukan kursor berada di luar kawasan elemen apabila diklik:
<dialog open>Hi, I'm a popup!</dialog>
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Cubalah: https://codepen.io/alexgriss/pen/NWoePVP
Menggayakan tetingkap dialog
Menggayakan tirai latar menggunakan :: pemilih tirai latar: https://codepen.io/alexgriss/pen/ExrOQEO
Membuka dan menutup tetingkap dialog animasi: https://codepen.io/alexgriss/pen/QWYJQJO
Tetingkap modal sebagai bar sisi: https://codepen.io/alexgriss/pen/GRzwxgr
Kebolehcapaian
Untuk masa yang lama,
Apabila
Secara lalai,
Berikut ialah beberapa cara untuk meningkatkan kebolehcapaian
aria-labelledby
Sentiasa sertakan tajuk di dalam tetingkap dialog dan nyatakan atribut aria-labelledby untuk
<dialog>
<pre class="brush:php;toolbar:false">const popUpElement = document.getElementById("pop-up");
popUpElement.show();
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Jika anda perlu menggayakan elemen pseudo ::backdrop, pastikan anda turut menggunakan gaya tersebut pada elemen .backdrop yang sepadan untuk memastikan keserasian dengan penyemak imbas lama:
<dialog>
<pre class="brush:php;toolbar:false">const modalElement = document.getElementById("modal");
modalElement.showModal();
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Adalah disyorkan untuk menyambungkan polyfill melalui import dinamik dan hanya untuk penyemak imbas yang tidak menyokong
<dialog open>Hi, I'm a popup!</dialog>
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Kesimpulan
HTML5
Dalam artikel ini, kami membincangkan topik berikut:
- Masalah
- Interaksi dengan
- Cara tetingkap dialog berfungsi pada peringkat penyemak imbas;
- Isu biasa dengan modal dan penyelesaiannya;
- Meningkatkan kebolehcapaian
- Meluaskan sokongan penyemak imbas untuk
Akhir sekali, saya menjemput anda untuk menyemak pelaksanaan komponen tetingkap modal dalam JS tulen, yang mengambil kira aspek utama yang dibincangkan dalam artikel: https://codepen.io/alexgriss/pen/abXPOPP
Itu sahaja yang saya ingin kongsikan tentang bekerja dengan
Atas ialah kandungan terperinci Cara Menggunakan Elemen HTMLlt;dialog>. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!