Gunakan tombol
(gomakethings.com)- Di antarmuka web, menggunakan
alih-alihadalah pilihan yang benar dari sisi aksesibilitas dan fungsionalitas - `` tidak dikenali sebagai elemen interaktif oleh screen reader, dan juga tidak merespons fokus keyboard maupun input
Enter,Spacebar - Meskipun atribut seperti
[role="button"]atau[tabindex="0"]ditambahkan, masalah urutan fokus dan penanganan event keyboard tetap ada - Untuk mengatasi masalah ini, menambahkan banyak event listener dan conditional justru menimbulkan kompleksitas yang tidak perlu
- `` secara bawaan menyediakan aksesibilitas, fokus, dan penanganan input keyboard, sehingga menjadi solusi yang sederhana dan standar
Pendekatan yang salah: membuat tombol dengan ``
- Di kalangan pengguna React atau HTMX, cukup banyak kasus implementasi interaksi seperti membuka modal dengan bentuk ``
- Contoh kode:
Open Modal
- Contoh kode:
- Masalah dari pendekatan ini
- Screen reader tidak mengenali elemen tersebut sebagai elemen interaktif
- Tidak bisa dipindahi fokus dengan keyboard
- Hanya event
clickyang bekerja, dan tidak merespons inputEntermaupunSpacebar
Batasan dari upaya “memperbaiki” aksesibilitas
- Jika atribut
[role="button"]ditambahkan, masalah pengenalan oleh screen reader memang teratasi, tetapi masalah fokus maupun penanganan input keyboard tetap belum terselesaikan - Dengan menambahkan
[tabindex="0"], elemen bisa dibuat dapat difokuskan, tetapi ada risiko urutan fokus menjadi kacau atau perpindahan yang tidak terduga terjadi - Untuk menangani input keyboard, event
keydownharus didaftarkan secara global didocument, lalu mendeteksi tombolEnteratau' '(spasi) untuk mencari elemen yang sedang difokuskan dan mengeksekusinyadocument.addEventListener('keydown', (event) => { if (event.key !== 'Enter' && event.key !== ' ') return; const notRealBtn = document.activeElement.closest('[onclick]'); if (!notRealBtn) return; // 실행 코드 }); - Hasilnya, kita pada dasarnya mereimplementasikan secara rumit fitur yang sudah disediakan `` secara default
Fitur bawaan yang disediakan ``
- Elemen `` secara otomatis mendukung hal-hal berikut
- Peran implisit (
[role="button"]) - Kemampuan menerima fokus secara otomatis
- Saat dalam keadaan fokus, menjalankan event
clickketika menerima inputEnterdanSpacebar
- Peran implisit (
- Untuk membuat perilaku yang sama dengan
, **diperlukan banyak atribut dan skrip**, tetapi dengan, semuanya bisa diselesaikan hanya dalam satu barisOpen Modal
Kesimpulan: yang sederhana adalah yang terbaik
- `` adalah cara paling sederhana untuk memenuhi standar aksesibilitas sekaligus mengurangi jumlah kode
- Tanpa penanganan event tambahan atau penambahan atribut yang tidak perlu, menggunakan elemen HTML standar lebih unggul dari sisi maintainability dan efisiensi
- Dengan pesan “semakin malas seorang developer, semakin penting menggunakan elemen yang benar”, tulisan ini menekankan pentingnya kebiasaan pengembangan yang memanfaatkan fitur bawaan dan menghindari kompleksitas yang tidak perlu
7 komentar
Tulisan yang sangat bagus. Inti dari isi artikelnya bisa diringkas sebagai "mari gunakan tag HTML secara bermakna." Jika kita menyediakan event klik dengan tag
div(atau tag lainnya), menurut saya itu sama sekali tidak berbeda dengan masa ketika dulu kita menyusun layout dengan tagtable.Tentu, memasukkan atribut
aria-*bisa membuatnya lebih jelas, tapi daripada repot begitu mending pakai tag yang semestinya wkwkwkJadi nostalgia ya wkwkwk
Situs lembaga pemerintah di negara kita tampaknya sering memakai ``...
Komentar Hacker News
Salah satu keluhan saya adalah situs web yang mengimplementasikan navigasi dengan handler
onclickkalau cukup pakai tag ``, maka buka tab baru, integrasi perangkat aksesibilitas, menu klik kanan, dan semuanya langsung berfungsi dengan baik secara otomatis kalau itu navigasi, pakailah link alih-alih sup JavaScriptonClickbahkan elemen yang pada dasarnya adalah link semuanya ditangani dengan click handler, dan saya tidak mengerti kenapaSebagian besar tombol harus secara eksplisit menuliskan
type="button"nilai bawaannya adalahsubmit, jadi kalau berada di dalam form akan otomatis mengirim mungkin sebagian developer tidak tahu ini, jadi mereka memakai ``, danberbeda, Anda bisa menghindari masalah `type="submit"`pada awalnya kosong sehingga Anda hanya menambahkan fungsi yang diperlukan, dan nanti juga lebih mudah diubah sebaliknya, untuk memahami perilaku default ``, Anda harus membaca dokumentasi pada akhirnya ini soal memilih kontrol eksplisit vs fitur bawaanAkan lebih bagus kalau tulisan itu diperluas ke arah “mari pakai saja elemen HTML yang memang dibuat untuk tujuan itu” banyak developer SPA tidak terlalu paham makna elemen HTML, jadi mereka terus-menerus menciptakan ulang roda
Sekarang ada generasi yang harus menekan-nekan layar ke sana kemari hanya untuk mencari area yang bisa diklik sepuluh tahun lalu seseorang membuat drag link lebih penting daripada memilih teks, dan sekarang memilih teks hampir mustahil untuk memperbaiki ini, mungkin kita harus mem-fork browser
Saya sempat lama kebingungan karena stylesheet default Chrome punya
button {align-items: flex-start}, yang memicu bug ukuran flexbox meskipun begitu, saya tetap berusaha memakai elemen HTML yang benar sebisa mungkin, tetapi untuk side project kecil kadang `` terasa lebih praktisappearance: noneberguna untuk mereset gaya tombol saya membuat kelas.unbuttonifyagar sesuatu tetap berperilaku seperti tombol tetapi tampil berbedaSebisa mungkin, elemen harus digunakan sesuai tujuan aslinya
Saya punya dua keluhan soal tombol yang pertama, pada akhirnya Anda tetap harus mengganti stylenya lagi, dan yang kedua, ada peringatan bahwa tombol tidak bisa dinest ini dalam praktiknya cukup sering ditemui
LLM sering menghasilkan pola yang salah seperti ini mereka sering mengabaikan fitur bawaan browser lalu membuat implementasi yang rumit saya sering menyuruh Claude untuk menyederhanakan kode seperti itu di TypeScript juga ada kecenderungan membuat cara penanganan error jadi aneh
Saya sebisa mungkin menggunakan tombol sebagai default tetapi kalau dalam praktiknya sesuatu memang harus berperilaku seperti link, saya memakai tag ``
Saya penasaran kenapa ada pendapat yang menyarankan memakai ``
Gunakan tombol
background, border, outline, appearance, -webkit-appearance, cursor
Terlalu banyak stylesheet bawaan yang harus ditimpa sedih sedih
Makanya ada CSS Reset.