Tantangan UI: Switch
Switch memungkinkan pengguna untuk mengaktifkan atau menonaktifkan suatu opsi.
Di artikel ini
Spesifikasi
Komponen Switch adalah elemen interaktif dalam antarmuka pengguna yang memungkinkan pengguna untuk mengaktifkan atau menonaktifkan suatu fitur atau opsi. Secara visual, Switch biasanya ditampilkan sebagai sakelar yang dapat digeser dari satu posisi ke posisi lain, sering kali dengan indikasi warna yang berbeda untuk status “aktif” dan “non-aktif”.
Komponen Switch mirip dengan komponen inputan biner lainnya seperti Checkbox. Perbedaannya adalah Checkbox memiliki tiga kemungkinan status, yaitu tercentang, tidak tercentang, dan tercentang sebagian (indeterminate).
Berikut adalah beberapa spesifikasi dasar dari elemen Switch yang akan kita buat:
- Interaksi Pengguna: pengguna dapat mengklik elemen Switch untuk mengubah statusnya dari “aktif” ke “non-aktif” dan sebaliknya. Ketika fokus sedang berada pada elemen Switch, maka pengguna dapat mengubah statusnya dengan cara menekan spasi pada papan tombol.
- Umpan Balik Visual: Switch harus memberikan umpan valik visual yang jelas mengenai statusnya. Ini biasanya melibatakan perubahan warna atau animasi pergerakan.
- Aksesibilitas: status harus bisa terbaca oleh pengguna dengan alat bantu pembaca layar (screen reader). Kemudian, untuk membantu pemahaman/pengenalan dari status Switch pada orang dengan disabilitas kognitif, kita juga harus menampilkan teks yang ekuivalen dengan statusnya (red: “aktif” dan “non-aktif”).
- Integrasi dengan Formulir: Switch harus dapat berintegrasi dengan elemen formulir HTML sehingga statusnya dapat dikirimkan dalam pengiriman formulir.
- Dukungan rigth-to-left (RTL): dukungan bagi perangkat yang memiliki direksi atau arah penulisan dari kanan ke kiri, seperti Bahasa Arab.
Satu hal yang harus digarisbawahi adalah kita akan melakukannya dengan pendekatan peningkatan bertahap (progressive enhancement), yaitu dengan sebisa mungkin melakukannya tanpa JavaScript.
Ide Dasar
Ide dasarnya adalah menggunakan elemen Checkbox (<input type="checkbox" />
) sebagai kontrol utama. Kita akan menerapkan opacity: 0
pada elemen Checkbox tersebut agar tersembunyi secara visual tanpa menghilangkan fungsionalitasnya. Sebagai tampilan visual, kita akan menggantinya menggunakan elemen lain yang menyerupai sakelar. Sakelar ini terdiri dari elemen slider dan bullet.
Langkah 1: Markup dan Styling Dasar
Berikut adalah markup dasarnya. Tinjau bahwa kita menggunakan <input type="checkbox">
agar kita bisa menjaga fungsionalitas bawaan, termasuk dalam hal ini adalah interaksi dengan papan tombol dan integrasi dengan formulir tanpa menambahkan JavaScript. Penambahan atribut role="switch"
bertujuan agar statusnya terbaca sebagai “on” dan “off” oleh teknologi asistif seperti pembaca layar.
Kemudian, kita akan menggunakan CSS custom properties untuk mendeklarasikan nilai dimensi dan spasi agar nantinya bisa dirujuk di bagian lainnya.
Kode-kode markup dan styling dasar di atas akan menghasilkan tampilan seperti berikut:
Langkah 2: Umpan Balik Visual
Umbah balik visual yang akan kita terapkan sesuai dengan status “on” dan “off” adalah mengganti warna latar belakang dari .slider
dan menggeser posisi .bullet
ke sisi lainnya. Dalam hal ini, kita akan menggunakan selector berupa ~
(subsequent-sibling combinator) untuk menyeleksi elemen .slider
dan .bullet
yang merupakan sibling dari elemen input
yang sedang tercentang (via :checked
).
Ubah warna latar belakang
Geser posisi .bullet
Gunakan translateX
dengan nilai width - lebar bullet - (2 * gap)
.
Berikut adalah umpan balik visual yang dihasilkan dari penambahan kode-kode di atas. Untuk mempermudah ilustrasi, elemen input
dibuat lebih transparan.
Langkah 3: Indikator Teks
Teman-teman yang memiliki disabilitas kognitif seperti diseleksia terkadang akan mengalami kesulitan untuk membedakan status “on” dan “off” hanya dari umpan balik visual. Untuk membantu mereka dalam pemahaman atau pengenalan status dari Switch, kita bisa menambahkan indikator teks yang merepresentasikan masing-masing status.
Kita akan menambahkan dua elemen teks, yaitu “on” dan “off”. Kedua teks tersebut akan diberi atribut aria-hidden="true"
agar tidak masuk pada pohon aksesibilitas sehingga tidak akan terbaca oleh pembaca layar. Hal ini dilakukan karena pembaca layar akan secara otomatis membaca status dari Switch (via role=“switch”). Jadi, teks “on” atau “off” tidak perlu dibacakan lagi agar tidak redundan.
Salah satu dari keduanya akan disembunyikan atau ditampilkan secara bergantian menggunakan properti display
berdasarkan nilai dari input
(via pseudo-selector :checked
).
Hasil dari penambahan kode-kode tersebut adalah sebagai berikut:
Langkah 4: Finalisasi
Bagian-bagian fundamental sudah selesai kita buat. Selanjutnya, kita akan melakukan finalisasi yang terdiri dari beberapa hal berikut.
Membuat elemen input
menjadi transparan penuh
Menambahkan animasi
Agar tidak terlalu kaku, animasi ditambahkan pada elemen yang memiliki umpan balik visual, yaitu properti background-color
untuk elemen .slider
dan properti transform
untuk elemen .bullet
. Namun, untuk tetap mengindahkan pengaturan akesibilitas dimana pengguna bisa mematikan animasi pada perangkat mereka, kita akan terapkan transition: none;
pada @media (prefers-reduced-motion)
.
Indikator fokus
Indikator fokus digunakan untuk secara visual memberitahu pengguna bahwa suatu elemen menerima fokus, terutama yang berasal dari interaksi pengguna via papan tombol. Kita akan menambahkan fokus berupa outline pada elemen .root
ketika elemen input
mendapatkan fokus via :has
dan :focus-visible
. Sebelumnya, kita harus menghilangkan outline
bawaan dari elemen input
.
Dukungan right-to-left (RTL)
Hal terakhir yang akan kita lakukan adalah menyediakan dukungan bagi perangkat yang memiliki direksi atau arah penulisan dari kanan ke kiri, seperti Bahasa Arab. Pengaturan RTL biasanya lakukan dengan menambahkan atribut dir="rtl"
pada suatu elemen. Pada mode RTL, penyesuaian yang harus dilakukan adalah posisi geser dari elemen .bullet
yang awalnya bernilai positif (geser ke kanan) menjadi bernilai negatif (geser ke kiri).
Kesimpulan
Dengan menggunakan elemen <input type="checkbox" />
sebagai elemen utama dari Switch, semua interaksi dan fungsionalitas yang bisa dilakukan pada elemen tersebut juga akan bisa dilakukan pada elemen Switch yang kita buat. Termasuk di dalamnya adalah interaksi dengan papan tombol dan integrasi dengan formulir. Hal-hal tersebut kita dapatkan secara cuma-cuma, tanpa harus menambahkan kode JavaScript.