Anda Tidak Membutuhkan JavaScript untuk Itu
(htmhell.dev)- Untuk mengimplementasikan fitur web, meninjau teknologi yang kurang kuat terlebih dahulu—dengan urutan HTML, CSS, lalu JavaScript—lebih menguntungkan untuk mengurangi kegagalan pemuatan dan masalah aksesibilitas
- JavaScript dapat mengontrol perilaku browser secara langsung, tetapi karena membutuhkan resource tambahan dan memiliki kemungkinan error, ia mudah mengecualikan pengguna keyboard dan teknologi bantu
- Fitur seperti switch checkbox,
datalist,input type="color",details/summary, dandialogyang dulu membutuhkan JavaScript kini sebagian besar bisa dibuat dengan fitur bawaan HTML/CSS - Fitur deklaratif HTML dan CSS memungkinkan browser menangani perilaku native, pengaturan lingkungan pengguna, dan respons aksesibilitas, sehingga dapat menyediakan default yang lebih baik
- Meski implementasi JavaScript yang sudah familier tetap berjalan, periksa alternatif HTML/CSS terbaru secara berkala, dan saat menggantinya lakukan juga pengujian aksesibilitas
Aturan hak istimewa minimum
- Aturan hak istimewa minimum adalah prinsip pengembangan web yang menyarankan memilih bahasa yang paling kurang kuat namun tetap dapat mencapai tujuan
- Di web, ini biasanya diterapkan dengan mempertimbangkan HTML sebelum CSS, dan CSS sebelum JavaScript
- JavaScript adalah yang paling serbaguna di antara ketiga teknologi itu, tetapi bebannya juga paling besar
- Bisa rusak
- Bisa gagal dimuat
- Membutuhkan resource tambahan untuk diunduh, diparsing, dan dieksekusi
- Mudah mengecualikan pengguna keyboard dan pengguna teknologi bantu
- Berbeda dari JavaScript imperatif, HTML dan CSS bekerja secara deklaratif
- Developer memberi tahu browser apa yang diinginkan, dan browser memilih cara implementasinya
- Browser dapat memilih cara pemrosesan yang lebih efisien
- Ketika browser menangani fitur HTML/CSS, hal ini bisa menguntungkan dari sisi performa, perilaku native, dukungan pengaturan lingkungan pengguna, dan aksesibilitas
- Namun aksesibilitas tidak selalu otomatis terjamin
Fitur-fitur yang dulu membutuhkan JavaScript
- Pembuat browser dan penulis spesifikasi telah memindahkan fitur-fitur yang hingga beberapa tahun lalu membutuhkan JavaScript ke CSS dan HTML
- Web mempertahankan kompatibilitas mundur, sehingga cara implementasi yang pernah dipelajari cenderung tetap ada di toolbox dan digunakan berulang kali
- Meski Anda tahu suatu fitur membutuhkan JavaScript, sesekali memeriksa apakah hal itu masih benar dapat membantu membuat situs web yang lebih baik
Switch kustom yang dibuat dengan checkbox
- Switch kustom dapat diimplementasikan dengan checkbox bawaan dan CSS, alih-alih
div, handleronclick, dan state internal - Jika memasukkan
<input type="checkbox">ke dalam<label>, browser akan menghubungkan keduanya- Mengklik bagian mana pun dari label akan men-toggle checkbox
- Tidak perlu handler
onclickterpisah
appearance: nonemenghentikan rendering kontrol form bawaan browser dan memungkinkan Anda men-styling-nya sendiriinputitu sendiri dapat dihias seperti latar switch::beforedapat digunakan sebagai titik internal yang di-toggle
- Pseudo-class
:checkeddapat mengubah warna latar dan posisi::beforesesuai status checked - Untuk pengguna keyboard, indikator fokus diperlukan
- Menyembunyikan fokus dengan
outline: nonebukan cara yang baik :focus-visibledapat menampilkan ring fokus yang terlihat bagus hanya saat interaksi keyboardoutline-offsetdapat menyesuaikan garis fokus ke luar atau ke dalam elemen
- Menyembunyikan fokus dengan
input:focus { outline-color: transparent; }membuat garis fokus transparan dalam situasi normal, dan dalam mode kontras tinggi dapat membuatnya terlihat kembali dengan warna pilihan pengguna- Mode warna paksa dapat dibaca lebih lanjut di forced colors explained
Autocomplete native dengan datalist
datalistadalah fitur saran otomatis bawaan browser yang menampilkan daftar opsi saat pengguna mengetik- Susunannya sederhana
- Masukkan
iddan beberapaoptionke elemendatalist - Hubungkan dengan
datalisttersebut melalui atributlistpadainput
- Masukkan
- Saat pengguna mengetik, browser menampilkan dropdown dan otomatis memfilter opsi sesuai isi input
- Karena ini adalah field input biasa, pengguna juga dapat mengetik nilai yang tidak ada dalam daftar
- Setelah memilih field input, pengguna dapat menelusuri daftar dengan tombol panah, atau mengeklik ikon dropdown yang ditambahkan browser untuk melihat semua opsi
Color picker bawaan input type="color"
- Dengan satu baris
<input type="color">, Anda dapat menggunakan color picker native browser - Ini dapat menggantikan banyak UI canvas dan slider yang dibuat dengan JavaScript
- Color picker native di browser Chromium dapat memilih warna tidak hanya di dalam situs, tetapi juga dari mana saja di layar
- Karena tidak semua pengguna dapat memakai color picker browser, sebaiknya sediakan juga cara lain untuk memilih warna, seperti input teks biasa
Accordion dengan details dan summary
- Elemen
detailsdansummarymenyediakan accordion untuk melipat dan membuka konten sebagai fitur bawaan browser - Perilaku dasarnya sederhana
- Konten di dalam
details, kecualisummary, disembunyikan - Saat pengguna mengklik
summary, konten lainnya ditampilkan
- Konten di dalam
- Atribut
openmenentukan kondisi terbuka di awal- Ini bukan nilai yang tetap setelah interaksi pengguna; status berubah saat pengguna membuka dan menutupnya
- Marker segitiga bawaan dapat di-styling dengan
summary::marker- Kontennya dapat diganti dengan emoji dan sejenisnya
- Warna latar, gambar latar, ukuran font, dan lainnya dapat disesuaikan
- Banyak properti CSS tidak berfungsi, dan styling seperti menempatkannya di posisi yang sama sekali berbeda memiliki keterbatasan
- Di Safari, pseudo-element
::-webkit-details-markerdiperlukan - Perubahan konten marker dapat memengaruhi cara teknologi bantu mengumumkan accordion, jadi Anda dapat merujuk ke details/summary inconsistencies
summarydapat diklik, tetapi secara default tidak menampilkan kursor pointer seperti link maupun terlihat seperti tombol, sehingga perlu menambahkan status hover dan focus agar terlihat bisa diklik
Modal dengan dialog
alert(),prompt(), danconfirm()dapat memberi tahu atau meminta konfirmasi kepada pengguna, tetapi mengunci main thread dan sulit di-styling agar sesuai desain- Jika membuat dialog sendiri, penanganan aksesibilitas menjadi rumit
- Fokus harus tetap berada di dalam dialog
- Harus memberi tahu bahwa ini modal
- Harus mencegah pengguna keluar secara tidak sengaja
- Dapat berbenturan dengan widget yang memiliki
z-indexsangat tinggi
- Elemen
dialogbrowser menyediakan dialog native - Saat ini JavaScript diperlukan untuk membuka dialog
- Perubahan untuk membukanya tanpa JavaScript sedang berjalan, tetapi belum sepenuhnya dispesifikasikan atau diimplementasikan
- Dialog dapat dibuka dengan fungsi
showModal()
dialogdibuka di top layer- Top layer adalah layer baru yang terpisah dari HTML
- Elemen di layer ini selalu ditampilkan di atas, terlepas dari
z-indexdan tumpukan stacking context - Untuk penjelasan konsepnya, lihat Top layer di MDN
dialogtidak menyediakan UI penutup bawaan, sehingga Anda harus memasukkan UI sendiri- Saat
form method="dialog"disubmit, browser menutup dialog - Jika dua tombol submit diberi
valueberbeda, ini dapat digunakan seperti dialog konfirmasi - Pada event
close, Anda dapat membacadialog.returnValueuntuk memeriksa nilai tombol yang ditekan pengguna - Data form tambahan dapat dibaca dengan FormData
- Saat
dialog::backdropadalah layer di antara dialog dan bagian halaman lainnya- Ini dapat menggelapkan atau memburamkan latar belakang untuk mengarahkan perhatian pengguna ke dialog
- Karena browser yang menempatkannya, Anda tidak perlu menangani sendiri scrolling, elemen fixed, atau perubahan ukuran browser
Fitur yang bisa dibuat dengan lebih sedikit JavaScript
- Ada lebih banyak fitur yang dapat mengurangi JavaScript
- Smooth scrolling native dengan
scroll-behavior: smooth- Dengan syarat hanya digunakan saat
prefers-reduced-motion: no preferencecocok
- Dengan syarat hanya digunakan saat
- Carousel native dengan
scroll-snap - Elemen “in-view” dengan
position: sticky - Container query
- Smooth scrolling native dengan
- Ada juga fitur yang akan ditambahkan ke depan
- Animasi berbasis scroll
- Layout Masonry dengan
grid-template-rows: masonrytanpamasonry.js selectyang dapat di-styling sepenuhnya melalui elemen baruselectlist- Selector
:has()yang dapat mengurangi satu kategori kode seleksi JavaScript
- Konten terkait dapat dilihat lebih lanjut dalam video presentasi Stop Using JavaScript for That: Moving Features from JS to CSS and HTML.
- Saat mengganti implementasi yang sudah teruji dengan cara baru, uji aksesibilitas secara khusus agar tidak ada siapa pun yang tereksklusi
1 komentar
Komentar Hacker News
Hal yang terlewat dari tulisan ini adalah alasan memakai JavaScript di tempat seperti ini justru karena kompatibilitasnya lebih baik
JavaScript baru bisa ditranspilasi, tetapi mem-polifill fitur CSS atau HTML yang belum ada jauh lebih sulit, dan dalam beberapa kasus tidak mungkin. Lagi pula, polifill itu pada akhirnya juga memakai JavaScript
appearancebahkan di MDN pun disertai banyak peringatan untuk menguji dengan sangat teliti, termasukappearance: none. Ini mungkin kurang penting jika hanya mendukung browser modern, tetapi versi Safari lama ternyata bertahan lebih lama dari dugaandatalisttidak melakukan apa pun di Firefox Android, dan bagi saya hanya terlihat seperti kotak input tanpa saran apa punPemilih warna memang keren, tetapi sangat tidak standar sehingga bisa fatal bagi kebanyakan bisnis. Bukan cuma desainer yang akan mengeluh; tim dukungan pelanggan juga jadi sulit membantu pengguna. Chromium bahkan memberi fitur memilih dari halaman atau mengambil warna acak, sedangkan Firefox Android hanya memberi pelangi, abu-abu, dan hitam-putih semacam itu
Tulisan itu sendiri juga mengakui ketidakkonsistenan
detailsdandialog. Semoga suatu hari browser yang tidak mendukung fitur seperti ini, atau mendukungnya secara tidak konsisten, tidak lagi dipakai, tetapi untuk sementara elemen-elemen ini tampaknya hanya cocok untuk side project yang bisa sepenuhnya mengendalikan browser yang didukungDi iPhone, saat tombol ditekan, yang muncul adalah pemilih warna native sistem yang sesungguhnya. Itu kontrol yang memang disediakan OS dan terlihat di berbagai aplikasi, dan saya jauh lebih menyukainya daripada yang dibuat kustom
Saya jauh lebih suka web tanpa JavaScript, dan dampaknya pada daya tahan baterai laptop bisa sampai hitungan jam. Ada situs yang tidak kompatibel dengan ini lalu hanya merender halaman kosong atau mengeluh bahwa JavaScript diperlukan untuk menampilkan teks
Sementara itu Amazon juga punya salinan situs e-commerce tanpa JavaScript, yang menunjukkan bahwa pekerjaan sebesar itu pun bisa dilakukan tanpa JavaScript
dialogsekarang sudah punya cakupan dukungan yang cukup dalam, dan polifill untuk beberapa persen pengguna yang masih memakai Firefox atau Safari era 2021 sudah cukup layakKalau membuat modal, sangat direkomendasikan, dan peningkatan aksesibilitasnya luar biasa
Di tempat kerja lama saya, kami membahas masalah ini secara serius dan memutuskan memakai implementasi JS alih-alih hal seperti
datalist. Khususdatalist, kami sempat mencobanya tetapi hasilnya terlalu tidak konsisten sehingga harus ditinggalkanPada akhirnya, karena ketidakkonsistenan antar-browser, kami bahkan menghentikan dukungan selain untuk Chrome
Contoh HTML mungkin tampilannya salah di browser lama, tetapi konten sebenarnya tetap ada. Kalau JS, ya tidak ada apa-apa. Ini benar-benar merusak aksesibilitas
Dengan HTML, screen reader setidaknya masih bisa membacanya, tetapi konten yang dibuat dengan JS malah menghalangi itu. Saat JS tidak bisa menjalankan JS, tidak ada polifill atau JS lain yang bisa menyelamatkan JS. Ia harus “berfungsi” sejak awal agar aman bagi aksesibilitas, dan kalau begitu poin awal perdebatan jadi tidak bermakna
Saya sebelumnya tidak tahu soal
Datalist, tetapi setidaknya di Chrome Android tampaknya tidak berfungsi dengan baikOpsinya memang muncul di area keyboard tempat saran autocomplete ditampilkan: https://imgur.com/a/Ecb4503
Saya belum pernah melihat pendekatan seperti itu pada kontrol form di UI web mobile, kecuali saat aplikasi autocomplete kata sandi memakai area yang sama
Tidak buruk. Jauh lebih baik daripada menggulir dropdown JS kustom yang dibuat asal-asalan dengan canggung, tetapi saya tidak yakin pengguna biasa akan tahu cara memakainya. Jadi menurut saya di mobile ini praktis tidak punya harapan
Di Firefox Android malah sama sekali tidak didukung: https://caniuse.com/?search=datalist
datalist?Referensi: https://adrianroselli.com/2023/06/under-engineered-comboboxe...
JavaScript sudah cukup terstandarisasi dengan baik, sedangkan HTML dan CSS relatif belum sebaik itu
autocomplete="off"pada elemeninputakan mengubah perilakunyaBagaimanapun juga, itu memang diperlukan agar
datalistbisa dipakai dengan benar. Kalau tidak, riwayat nilai yang pernah dipilih akan ditambahkan ke daftar dropdown. Saya mengamati ini di ChromiumSelain itu, dalam beberapa situasi seperti saat nilai default sudah ditetapkan,
datalistjuga tetap memerlukan JS. Solusi sementara dan catatan perilaku khas per browser saya rangkum dalam kode situs web baru LibreOffice: https://git.libreoffice.org/infra/libreofficeorg/+/835a5cc59...Kabar baiknya, pengembang Firefox berencana meninjau perbaikan perilaku
datalist, jadi mungkin nantinya daftar bisa ditampilkan hanya dengan satu klikDi saya, opsinya biasanya muncul di area atas keyboard tempat saran kata ditampilkan
datalistdi dalam keyboard itu perubahan yang baru terjadi dalam beberapa bulan terakhirDulu “normal”, tetapi rasanya seseorang hanya ingin mengubahnya demi mengubah saja
Penggunaan
scroll-behavior: smoothuntuk scrolling halus native sebaiknya benar-benar dibatasiTernyata ini bukan ide yang bagus untuk sebagian besar kasus penggunaan, dan sering menimbulkan efek samping yang tidak diinginkan
Orang bilang
scroll-snapbisa dipakai untuk membuat carousel native, tetapi carousel tetap ide yang buruk, jadi ruang penggunaanscroll-snapyang benar-benar sah juga sangat terbatasHalaman yang memakai animasi berbasis scroll biasanya justru akan lebih baik kalau itu dihapus
Scrolling halus adalah contoh yang bagus. API native memungkinkan pengguna menghentikannya kapan saja. Sebagian besar implementasi JS tersendat parah dan bikin pengguna menderita
Kita bebas mengkritik pilihan desain, tetapi tanpa menjelaskan alasan nyata mengapa “carousel tetap buruk”, sulit berharap orang mau mendengarkan
Tapi halaman depan Amazon memakai carousel dengan sangat mencolok, dan setahu saya Amazon melakukan A/B testing variasi halaman depan tanpa ampun. Kalau begitu, mungkin saja carousel menunjukkan hasil yang bagus dalam pengujian, sehingga agak sulit mengatakan itu benar-benar “buruk” dalam arti yang universal dan objektif
Biasanya saya tetap menambahkannya setidaknya segera setelah membuat anchor bergaya daftar isi
Mengejutkan bahwa pada 2023 kita masih saja berdebat soal form dan UX umum untuk input data pengguna
Cukup lihat komentar tentang
datalistdan pemilih warna; sulit dipahami mengapa ini masih belum menjadi area yang selesaiDulu ada upaya untuk menyelesaikan semuanya sekaligus lewat XForms, tetapi itu tidak pernah diimplementasikan di browser
Sebagai gantinya, hampir semua framework komponen CSS/JS masing-masing menyediakan kumpulan elemen form terbatas dengan semantik yang berbeda-beda
Sepertinya kita akan menghabiskan hidup dengan membuat sendiri kontrol UI dasar
Kesan bahwa ini “belum selesai” hanya muncul karena sebagian orang punya obsesi aneh untuk menghindari JavaScript lalu memaksakan alternatif setengah matang
Kalau kita mau bertahan pada teknologi yang membosankan dan dasar, sebenarnya itu sudah selesai. Tetapi kalau kita keras kepala ingin menyelesaikannya lagi dengan React, lalu lagi dengan React hooks, dan terus mengulang tanpa akhir, ya jadinya memang tidak pernah selesai
Niat tidak bisa ditentukan secara terprogram, jadi dalam situasi tertentu kita tidak bisa punya fitur yang keren
Pada form kompleks terakhir yang saya kerjakan, saya harus membuat event klik memicu submit form dengan cukup langsung agar browser mau mengizinkannya
Saya sendiri tidak pernah meminta cara mengirim warna melalui halaman web
Jika memakai
detailsalih-alih JavaScript, Ctrl+F bisa mencari isinya dan membukanyaAccordion berbasis JavaScript tidak bisa dibuka seperti itu
hidden="until-found", hal ini juga bisa dilakukan pada accordion berbasis JS atau konten tersembunyi lain, tetapi sayangnya saat ini hanya ada di browser berbasis Chromium: https://developer.chrome.com/articles/hidden-until-found/Saya setuju dengan sebagian besar isinya, tetapi belum cukup memakai
dialoguntuk punya pendapat, dan menurut sayadatalistbukan pilihan yang layak kecuali untuk alat internalTampilannya jelek, kemampuannya terbatas, dan juga tidak bisa di-style. Inilah masalah dengan sebagian besar argumen “pakai saja fitur bawaan”.
date pickerjuga samaBukan cuma default-nya kurang bagus, tetapi saat ingin mengubahnya pun tidak bisa. Begitu menabrak salah satu dari sekian banyak batas dalam styling atau perubahan perilaku—misalnya ingin minggu dimulai dari Senin—itu tidak bisa. Lalu pilihannya biasanya tinggal pustaka pengganti total berbasis JS
Saya mendukung penggunaan opsi yang lebih ringan dan setuju dengan hierarki HTML > CSS > JS, tetapi kadang JS adalah satu-satunya jawaban jika kita ingin UI yang bagus sekaligus fitur yang diinginkan
datalistmungkin membantuItu bekerja baik sampai muncul kebutuhan untuk menampilkan opsi yang tidak benar-benar diawali oleh input pengguna. Misalnya, kalau input mengandung typo, opsinya tidak akan muncul
Karena tidak ada cara untuk memaksa semua item tetap ditampilkan, saya akhirnya memilih daftar berurutan
Saat saya mulai mengembangkan web, perubahan bisa memakan waktu sampai 10 tahun. IE6 memang menahan kita semua, tetapi saat itu w3c juga cukup tidak berdaya. Sekarang perubahan terjadi lebih cepat
Tahun depan mungkin saja styling
datalisttanpa prefiks akan tersedia di tiga browser utama, tetapi kalau kita sudah terikat pada solusi JS kustom, bisnis belum tentu mau membayar biaya pembangunan ulangJika kita memperluas fitur native dengan JS, kita bisa menghapus JS itu dengan biaya rendah saat dukungannya sudah cukup. Gunakan kontrol native sekarang jika sudah memadai, lalu terapkan JS seperti polyfill
input[type=date], sebagian besar kustomisasi yang sering diusulkan justru lebih baik tidak berada di bawah kendali pengembangKalender yang tepat untuk ditampilkan seharusnya bergantung pada locale. Platform pengguna sudah punya kemampuan untuk mengatur dan menampilkannya dengan cara yang kemungkinan paling efektif bagi pengguna
Pemilih tanggal milik platform lebih baik daripada sesuatu aneh buatan sendiri
Tombol toggle itu memang bagus
Tulisan ini tampaknya membuat para pengembang frontend pecinta meme marah, tetapi poin utamanya benar. Mengapa begitu banyak situs bodoh dibuat dengan JS? Jika orang-orang cukup mengikuti satu standar seperti HTML, semuanya bisa konsisten, dan hal-hal seperti aksesibilitas atau terjemahan juga bisa lebih mudah diselaraskan
Kalau masuk ke situs-situs sekarang, semuanya dimuat secara dinamis dalam satu halaman sampai-sampai tombol kembali pun tidak berfungsi
Dan tetap ada masalah “menunggu orang memperbarui”, karena setelah fitur baru diperkenalkan bisa butuh waktu bertahun-tahun sampai dukungannya cukup luas untuk benar-benar berguna
Saya pada umumnya setuju bahwa ada banyak implementasi buruk dan perangkat JavaScript yang rumit. Untuk konten dinamis pun sudah ada cukup banyak solusi terstandar untuk mempertahankan fungsi kembali, dan setahu saya framework web populer mendukungnya secara bawaan
Saya sudah membaca komentar-komentar teratas, tetapi tidak banyak yang bisa disebut kemarahan; yang terlihat hanya orang-orang yang mengemukakan poin valid soal dukungan browser
Ini memang satu langkah ke arah yang benar, tetapi CSS juga merupakan alat lain yang disalahgunakan oleh para “artistes” seperti kata Philip Greenspun untuk membuat halaman yang sulit dibaca
Saya bukan pendukung Gemini, tetapi pada dasarnya semua aspek tata letak dan tipografi seharusnya dikembalikan ke browser dan dikendalikan oleh pengguna. Para desainer sudah tanpa henti menunjukkan bahwa mereka tidak bisa dipercaya untuk urusan itu
Saya suka maksudnya, switch-nya juga keren, dan
summary/detailsjuga kadang bergunaTetapi elemen
datalisthampir bukan pilihan yang realistis untuk penggunaan di luar mainan atau prototipeHal-hal “cukup dengan CSS tanpa JS” yang saya sukai adalah sidebar drawer dan carousel
Di DaisyUI, pustaka komponen TailwindCSS, juga ada komponen siap pakai
https://daisyui.com/components/drawer/
https://daisyui.com/components/carousel/
Drawer dan konten lain yang muncul di halaman harus diumumkan, dan status
aria-expandedharus ada di samping kontrol targetnyaIni masih pertanyaan nyata. Mungkin ada caranya, atau mungkin para pengembang secara kolektif menganggapnya tidak penting. Para auditor mungkin tidak akan setuju
Tampaknya para penulis framework seperti ini sangat meremehkan seberapa banyak pengujian yang diperlukan agar benar-benar bekerja lintas browser
Komponennya sebanyak itu, ditambah lagi bisa diberi tema, sehingga sulit memastikan apakah perbaikannya bisa dilakukan tanpa merusak tema dan aplikasi yang sudah ada
components/carousel/baru pertama kali saya lihatSebenarnya apa itu snap dan bagaimana cara kerjanya? Layar saya tidak merespons klik jari
Saya rasa cara interaksi yang tidak dikenal bukan alasan yang baik untuk merekomendasikan pustaka elemen UI