Advertisement
  1. Web Design
  2. HTML5

Native Popups dan Modals dengan Elemen "dialog" HTML5

Scroll to top
Read Time: 3 min
This post is part of a series called Strange and Unusual HTML.
How to Use HTML5 “picture”, “srcset”, and “sizes” for Responsive Images
HTML5 Form Validation With the “pattern” Attribute

Indonesian (Bahasa Indonesia) translation by ⚡ Rova Rindrata (you can also view the original English article)

Banyak proses di web hari ini memerlukan persetujuan penuh dari pengguna untuk diselesaikan. Misalnya, pengguna mungkin butuh menghapus akun, mengubah username mereka atau konfirmasi transaksi moneter.

Pendekatan UX umum dalam kasus tersebut adalah menampilkan kotak dialog, biasanya dengan dua tombol; satu untuk membatalkan dan satu untuk melanjutkan dengan tindakan. Kami telah mengandalkan library JavaScript untuk melakukan ini selama bertahun-tahun, namun dalam tutorial ini kita akan melakukan hal-hal secara native dengan percobaan elemen <dialog>.

Menggunakan Elemen Dialog

<dialog> adalah elemen HTML5 (tepatnya 5.1). Ia diklasifikasikan sebagai "sectioning root", mirip dengan <body>, <blockquote>, dan elemen-elemen <details>, yang masing-masing menetapkan bagian konten baru secara independen. Anda bisa menempatkannya sebagai anak dari body, atau menyarangkannya dalam elemen seperti <div> atau <section> - kedua pendekatannya sah.

1
<body>
2
  
3
	<div>
4
		<dialog></dialog>
5
	</div>
6
	
7
	<section>
8
		<dialog></dialog>
9
	</section>
10
11
	<dialog></dialog>	
12
</body>

Mendukung browser (Chrome 37+ dan Opera 27+) secara default akan me-render elemen <dialog> tersembunyi, hanya membuatnya terlihat berdasarkan permintaan dengan JavaScript menggunakan show() atau showModal(), dan metode close() untuk menyembunyikannya lagi. Biasanya, kami akan menjalankan metode ini dalam event click, seperti:

1
var $accountDelete = $('#delete-account'),
2
    $accountDeleteDialog = $('#confirm-delete');
3
4
	  $accountDelete.on('click', function() {
5
	    $accountDeleteDialog[0].showModal();
6
	  });
7
8
	  $('#cancel').on('click', function() {
9
	    $accountDeleteDialog[0].close();
10
	  });

Metode show() vs showModal()

Patut dicatat bahwa show() dan showModal() berperilaku berbeda.

Metode show() mengungkapkan elemen sesuai posisinya di aliran DOM. Jika Anda menambahkannya tepat sebelum tag penutup body, mungkin muncul di bagian bawah halaman web. Kami akan menambah style yang dikustomisasi untuk menyesuaikan posisinya, sebagai contoh, jika kita ingin menempatkannya di tengah halaman. Style ini biasanya akan menggunakan z-index untuk menumpuk elemen di atas elemen-elemen lain, properti position diatur absolute, bersamaan left dan top.

Metode showModal(), di sisi lain, akan menampilkan elemen sebagai modal. Itu akan ditampilkan di tengah halaman secara default, dan berada di lapisan atas, seperti API fullScreen yang mencegah terganggu oleh z-index, posisi relatif dan overflow dari elemen induk

Dalam kebanyakan kasus, ada kemungkinan bahwa kita akan menggunakan kenyamanan dari showModal() bukan metode show().

Mengkustomisasi Style

Kotak dialog membawa style default browser yang dapat dengan mudah diganti seperti kebanyakan elemen-elemen lain. Anda bisa, misalnya, membuat border kotak dialog lebih tipis, membuat sudut-sudut bulat, dan tambahkan drop shadow.

Selain itu, ketika elemen <dialog> ditampilkan sebagai modal (menggunakan metode showModal()), kita memiliki pseudo-element tambahan, ::backdrop. Elemen ::backdrop berada langsung di bawah kotak dialog, menutupi seluruh viewport dan seluruh elemen di bawahnya.

Hal ini umum untuk men-style latar belakang dengan opacity rendah warna gelap–klik tombol merah untuk melihatnya dalam aksinya:

Menambahkan Kepandaian dengan Transisi

Kustomisasi style kotak dialog harus langsung, tapi bagaimana dengan menambahkan transisi CSS? Bagaimana kita secara bertahap mengungkapkan kotak dialog, menggunakan efek skala, kurang lebih sebagaimana OS X melakukan hal itu?

Langkah 1

Untuk memulainya, kita akan skala dialog ke 90%, menentukan transisi, dan menghilangkannya dari pandangan.

1
dialog {
2
	visibility: hidden;
3
	transform: scale(0.1);
4
	transition: transform 200ms;
5
}

Langkah 2

Sekarang kita mendefinisikan kelas selector yang akan men-skala ukuran kotak dialog yang diinginkan dan membuatnya terlihat.

1
dialog.dialog-scale {
2
	visibility: visible;
3
	transform: scale(1);
4
}

Langkah 3

Trik kami sekarang adalah kita akan "memegang" kotak dialog di skala kecilnya untuk beberapa milidetik sebelum kita tambahkan kelas dialog-scale. Untuk mencapai hal ini kami menggunakan metode JavaScript setTimeout() untuk menambahkan kelas:

1
var transition;
2
3
$accountDelete.on('click', function() {
4
	$accountDeleteDialog[0].showModal();
5
	transition = setTimeout(function() {
6
	    $accountDeleteDialog.addClass('dialog-scale');
7
	}, 0.5);
8
});

Langkah 4

Jangan lupa untuk menghapus kelas ini dan membersihkan timeOut ketika kotak dialog ditutup.

1
$('#cancel').on('click', function() {
2
	$accountDeleteDialog[0].close();
3
	$accountDeleteDialog.removeClass('dialog-scale');
4
	clearTimeout(transition);
5
});

Kita sudah siap! Anda dapat mencobanya di demo berikut:

Kesimpulan

<dialog> benar-benar berguna, meskipun masih sangat miskin dalam hal dukungan browser. Jika dan ketika semua browser utama telah menerapkannya, kita akan menjadi kurang bergantung pada library, struktur konten kami akan lebih semantik, dapat diakses dengan benar oleh teknologi bantuan, dan kita akan memiliki cara standar dalam memberikan modal dialog.

caniuse dialogcaniuse dialogcaniuse dialog
http://caniuse.com/#feat=dialog

Sampai saat itu, Anda dapat menggunakan polyfill dari Google Chrome untuk mensimulasikan di browser yang tidak-mendukung.

Sumber Daya Lainnya

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Web Design tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.