Panduan aksesibilitas untuk pengembang
Aksesibilitas penting bagi pengguna kami dan kami dapat memperbagus jika kami mempertimbangkan beberapa ide dan aturan dasar. Aksesibilitas itu rumit karena tidak ada standar teknis yang tetap dan diterima secara universal yang benar-benar bekerja secara konsisten dan untuk semua pengguna. Halaman ini tidak mencantumkan atau membahas masalah aksesibilitas khusus di MediaWiki. Halaman ini berupaya fokus pada pilihan teknologi serta hal-hal yang boleh dan tidak boleh dilakukan untuk mencegah masalah aksesibilitas.
Dari segi pengembangan, saya rasa ini seharusnya menjadi pedoman kita:
- Coba berdayakan pengguna kita (dan itu berarti semua pengguna)
- Coba atasi masalah aksesibilitas jika memungkinkan, tetapi jangan dengan segala cara.
- Kita sebaiknya menggunakan pendekatan Peningkatan progresif daripada Degradasi bertahap.
- Terapkan hal-hal yang secara teknologi tepat
Cara agar mudah diakses
Beberapa konsep penting yang harus Anda ingat.
Pengukuran aksesibilitas dalam berbagai bentuk
Aksesibilitas mencakup berbagai hal, mohon pertimbangkan hal-hal berikut:
- Sesuatu harus mudah dipahami: artinya secara tekstual, visual, logis, dan dari segi kompleksitas.
- Beberapa pengguna memerlukan pembaca layar untuk berinteraksi, tetapi yang sama keumumannya, atau bahkan lebih umum, adalah: kaca pembesar, kontras yang lebih tinggi, mesin teks ke ucapan, pengaturan CSS khusus, atau jenis papan ketik/perangkat masukan khusus.
- Ini harus mudah diraih; ketanggapan, keterjangkauan, lokasi, bahasa, perangkat keras, dll.
Singkatnya, aksesibilitas bukan hanya aksesibilitas papan ketik atau hanya aksesibilitas pembaca layar. Kita sering berfokus pada dua hal ini karena secara tradisional keduanya mudah diabaikan. Namun, masalah-masalah ini juga dapat diatasi dan seringkali menjadi dasar bagi kemungkinan perbaikan-perbaikan lainnya.
Beberapa masalah aksesibilitas cenderung merupakan masalah pada rancangan produk, pilihan strategis, khalayak sasaran, dsb. Karena area-area ini lebih sulit untuk dicantumkan dalam aturan tertulis yang berlaku secara universal untuk ekosistem MediaWiki, maka area-area tersebut berada di luar cakupan dokumen ini.
Navigasi papan ketik
Kita menyebut ini navigasi papan ketik, tetapi sebenarnya artinya adalah: Jangan bergantung pada perangkat penunjuk (sentuh, tetikus).
- Navigasi papan ketik adalah perihal memanipulasi fokus dan menjalankan tindakan dengan papan ketik Anda.
- Elemen yang dapat ditabkan juga dapat difokuskan, tetapi tidak semua yang dapat difokuskan juga ditabkan.
- Semua hal yang dapat Anda lakukan dengan tetikus seharusnya juga dapat dilakukan dengan papan ketik.
- Informasi navigasi papan ketik dapat digunakan oleh pembaca layar untuk meningkatkan pengalaman mereka.
Pembaca layar
- Pembaca layar menggunakan 'kursor' yang berbeda, yang biasanya menelusuri struktur logis dari DOM.
- Fokusnya cenderung mengikuti kursor pembaca layar dan sebaliknya, tetapi keduanya tidak sama.
- Anda dapat melacak elemen yang difokuskan dengan mengatur ekspresi langsung di Chrome. [1]
- Pembaca layar menggunakan API 'aksesibilitas', yang dapat Anda anggap sebagai 'tampilan' masukan/keluaran di atas DOM normal.
- ARIA adalah anotasi DOM yang meningkatkan atau memanipulasi bagaimana logika DOM diubah menjadi API aksesibilitas. Ini bukanlah alternatif untuk menulis HTML dan JavaScript yang benar. Navigasi papan ketik dapat dicapai dengan mudah melalui urutan DOM yang logis! Untuk informasi lebih tentang ARIA, lihat penjelasan w3.org dan penjelasan MDN.
- Pembaca layar tidak terbatas pada navigasi berdasarkan struktur DOM logis, itu hanya pengaturan bawaan.
- Pembaca layar dapat membaca apa yang ada di bawah penunjuk tetikus, misalnya.
- VoiceOver untuk iOS menggunakan kursor layar yang dimanipulasi oleh posisi dan gestur ibu jari pada layar sentuh.
- Sebagian besar perangkat lunak pembaca layar punya moda navigasi tambahan, di mana Anda dapat membuat daftar dan menavigasi berdasarkan area landmark, Daftar Isi yang dihasilkan otomatis, atau bahkan 'markah buku' yang ditentukan pengguna di dalam halaman.
- Berdasarkan poin di atas mengenai berbagai metode navigasi, berikut ini: Ada awal dan akhir, tetapi juga kiri, kanan, atas, dan bawah. Anda tidak boleh terlalu mengandalkan hal-hal ini dalam komunikasi Anda, tetapi Anda juga tidak perlu sepenuhnya menyangkal keberadaannya. Jangan samakan kemampuan visual pengguna dengan kesadaran ruang yang mungkin dapat disampaikan oleh pembaca layar kepada pengguna. Contoh:
- contoh kalimat panjang [gambar] gambar di atas menunjukkan... Still acceptable
- contoh kalimat panjang [gambar][gambar] gambar kiri menunjukkan, gambar kanan menunjukkan... Still acceptable
- contoh kalimat panjang [gambar][gambar] gambar kanan menunjukkan, gambar kiri menunjukkan... Not acceptable
- contoh kalimat panjang [gambar][gambar] gambar di atas menunjukkan... Not acceptable
- contoh kalimat panjang [gambar][gambar][gambar] gambar kiri menunjukkan, gambar kanan menunjukkan... Not acceptable
- contoh kalimat panjang [gambar][gambar] sesuatu yang sama sekali berbeda. gambar kiri menunjukkan, gambar kanan menunjukkan... Definitely not acceptable
Pedoman pengembagan
Terdapat beberapa standar terkait aksesibilitas dan jujur saja, hampir semuanya, meskipun tepat dalam mengidentifikasi masalah, masih punya masalah signifikan dalam hal solusi teknis (Hampir semua punya rasio 'solusi sementara yang buruk' yang tinggi). Ini telah menimbulkan banyak kontroversi di komunitas. Dengan demikian, kita harus mengidentifikasi hal-hal tak kontroversial yang seharusnya selalu (atau tidak pernah) kita lakukan dan alasannya. Akan jauh lebih mudah mencapai tujuan tertentu jika kita memisahkan hal-hal yang tak kontroversial dari hal-hal yang kontroversial.
Selalu gunakan atau sediakan
- Elemen HTML semantik yang tepat
- Gunakan elemen HTML sesuai dengan tujuan penggunaannya. Contoh:
- Gunakan
<button>dan bukan<div>atau<span>atau<a>dengan penangan klik. - Jika Anda merasa perlu menebalkan sesuatu, pertimbangkan apakah lebih tepat menggunakan tajuk atau elemen
strong.
- Gunakan
- Struktur tajuk logis
- Semua halaman harus selalu punya struktur tajuk yang logis dan konsisten. Tajuk merupakan salah satu alat navigasi utama yang digunakan oleh pengguna pembaca layar.
- Seharusnya tidak ada celah dalam penataan tingkat tajuk. (Jadi tak boleh H2->H4.)
- Tajuk harus bersifat deskriptif.
- Tajuk harus bersifat unik dalam tingkatnya masing-masing. (Seharusnya tidak ada dua H3 dengan isi yang sama di bawah bagian H2 yang sama)
- Harus ada pemisahan antara navigasi dan isi
- Atribut
altuntuk gambar dengan nilai yang bermakna - Jika suatu gambar bersifat menghias, gunakan nilai kosong secara eksplisit untuk atribut alt; atau lebih baik lagi, ubah itu menjadi gambar latar belakang CSS.
- alt gambar biasanya lebih diutamakan daripada atribut judul pada gambar, bahkan lebih diutamakan daripada atribut judul pada tautan yang membungkus gambar.
- Atribut
titleuntuk tautan - Ini biasanya ditampilkan sebagai tooltip
- Gunakan judul hanya jika berbeda dari teks tautan.
- Sebagian besar judul tautan sebenarnya tidak diucapkan oleh pembaca layar, kecuali jika pembaca tersebut telah dikonfigurasi secara eksplisit untuk tujuan ini.
- atribut
lang,dirandhreflang - Penggunaan
langdanhreflangmemungkinkan pemilihan suara yang tepat pada pembaca layar, pemilihan ralat ejaan yang benar pada peramban, dsb.
- Kontras memadai
- Selalu periksa warna Anda untuk kontras yang memadai. Untuk teks, kontras yang lebih tinggi diperlukan untuk teks yang lebih kecil (karena anti-pengaliasan)
- Fokus untuk navigasi papan ketik
- Jangan hapus garis luar dari elemen yang dapat difokuskan kecuali jika Anda menentukan sendiri garis luar untuk keadaan
:focus.- Jangan gunakan
outline: 0untuk keperluan lain. - Jika Anda mendefinisikan kelas semu apa pun, seperti
:hoveratau:active, mohon definisikan juga gaya:focus.
- Jangan gunakan
- Navigasi papan ketik
- Elemen interaktif pada suatu halaman harus dapat dinavigasi oleh papan ketik. Pastikan navigasi kunci tab dinyalakan di peramban Anda dan memungkinkan Anda mengendalikan masing-masing elemen interaktif tanpa menggunakan perangkat penunjuk.
- Gunakan
tabIndex: 0untuk menjadikan elemen dapat diakses papan ketik, yang sebelumnya secara tersirat tidak (Apa pun selain<a>,<area>,<button>,<input>,<object>,<select>,<textarea>).- Dalam hal ini, tambahkan juga penangan keydown yang menanggapi Enter (keyCode 13) dan spasi (keyCode 32).
- Gunakan
tabindex: -1untuk menghapus elemen dari aksesibilitas. (gunakan ini pada tautan yang merupakan label untuk tindakan di dalam $2 misalnya) (use this on links that are labels for the action inside an<li>...</li>for instance) - Elemen yang secara tersirat dapat diakses papan ketik akan meneruskan keydown enter/space ke penangan klik.
- Gunakan
- Dialog dsb.
Jika aksesibilitas tak diurus dengan baik, dialog menjadi salah satu elemen tersulit untuk diakses bagi pengguna pembaca layar dan papan ketik. Luangkan waktu untuk ini.
- Elemen yang membuka dialog harus punya
aria-haspopup - Dialog itu sendiri harus punya
role=[dialog | alertdialog | tooltip] - Dialog harus disisipkan dalam urutan DOM, [1] atau aria owns/controls perlu memperinci hubungan ini antara elemen pembuka dan dialog.
- Saat membuka dialog, ingat elemen terakhir yang difokuskan dan alihkan fokus ke elemen pertama yang
dapat difokuskandan del>dapat ditabkan di dalam dialog. - Ketika dialog bersifat modal, jadikan mustahil untuk berinteraksi dengan sisa halaman.
- Tangkap klik di luar dialog dan abaikan atau biarkan klik tersebut menutup dialog.
- Make sure you cannot tab to links or input elements outside of dialog
- Make elements outside of the dialog unreachable for screen reader, by using aria-hidden
- Make sure there is a close mode (Esc key and a focusable close button with a descriptive title)
- Closing should return the (keyboard) focus to the original focus point that you stored when you opened the dialog. For screen readers to return to the same point, be sure to specify the right owner of the dialog, if you have not inserted the dialog in DOM order.
- Read up: Aria modals, Aria modal dialog, ARIA nonmodal dialog, ARIA tooltips.
- WCAG 2.1 guidelines
- Follow wherever possible
- And its accompanying documents:
Don't
- There is common advice to use
left: -1000pxto push something (often the labels of icon buttons) out of the viewport for visual users and still have it in the accessibility DOM.text-indent: -9999pxis variant of this. This is BAD advice.- This breaks our RTL rendering in several browsers. Specifically in rtl mode it creates a large canvas left of the viewport and scrollbars, much as +1000px would create in ltr mode. (If needed,
top: -1000pxis preferred overleft: -1000pxto avoid this). - VoiceOver on mobile is unable to use this text as a fallback, since it is a 'positional' screen reader. You cannot move your finger over this text and thus the text will not be read either. (aria-label is often the better choice).
- Lastly, this enlarges the render surface needed to calculate the final webpage and this can impact performance [2] on mobile devices.
- Insightful overview of 'hide text offscreen' tricks are given by Jonathan Snook.
- This breaks our RTL rendering in several browsers. Specifically in rtl mode it creates a large canvas left of the viewport and scrollbars, much as +1000px would create in ltr mode. (If needed,
- Things should not be repeated often. If you have a 100 links on a page that can open a dialog, then don't add 100 labels to those 100 links telling the user that it can be used to open a dialog. Telling a user how to use/what to do with the interface is a good thing, doing it consistently is simply annoying. Find a different way to explain it once (an
aria-live=politemight be an idea in this case ?). <a href="#">Hide</a>with an onclick handler. VO reads such JS as "internal link Hide". Use a proper button, or<a role="button" tabindex="0">Hide</a>, with 'Space' and 'Enter' key handlers in the onclick. But no href attribute.- Do not nest interactive functionality inside another interactive element (links or buttons inside links). This confuses screen readers.
Avoid
- Unicode symbols
- Most assistive technologies are not good with symbols. Therefore, try to avoid characters such as ↑, → or more complex characters, because many screen reader won't understand them. If they are required, try to wrap with a span element with the title attribute, so that the title attribute can communicate the implicit meaning within the context to the reader.
- Small fonts
- Legibility is preferred. If you make something so small that it is hard to read, do you even need it to begin with? Also avoid small fonts with low or mediocre contrast values (even if they fall inside the WCAG guidelines, small sizes require more explicit contrast then large sizes, especially with anti aliasing enabled).
- Unusually large fonts
- If you make text much larger than normal, it can become similarly hard to read (unless it's very short). This applies mostly to body text, or anything that takes up more than a couple lines. But the larger the text is, the more lines it will take up.
- tabIndex > 0
- DOM order is preferred wherever possible. DOM order provides context for the actions.
- Workaround
- Traditionally, accomplishing 'full' accessibility has required a lot of workarounds for html itself, the browsers and even specific screenreader software. However these workarounds often come with side effects, make use of bugs or unspecified behavior and inevitably create technical debt.
- MediaWiki, because of the users it seeks to serve, the amount of code, it's (lack) of funding, etc tends to prefer future proof code over code that easily breaks. As such it generally avoids workarounds even if that might sometimes limit the accessibility we can deliver. Decisions on this are often influenced by the relative audience of the feature in MediaWiki. If something is ubiquitous for all users a workaround is more warrented than if the feature affected is only used by a tiny part of the audience (for instance, reading a page vs modifying the configuration of the installation).
Consider
- ARIA Roles
- If a div or span behaves like an actual button use
role="button". alsorole="dialog"androle="alert" - Be careful with roles. For instance, don't add
role="button"to a<th>element, since the<th>element has an implicitrole="columnheader", which will be overwritten. Instead use nested elements. Similarly for<li>which has an implicitrole="listitem" - If a button creates a popupdialog, use
aria-haspopup. - Use
aria-labelled-byfor contexts where this is not fully logical by itself (so everywhere except for labels in forms and headers in tables).
- If a div or span behaves like an actual button use
- Avoid tables for layout purposes and test on smaller screen widths.
- hide stuff: https://www.tpgi.com/html5-accessibility-chops-hidden-and-aria-hidden/
- skip/jump to links
Lihat pula
- Wikimedia Design Style Guide: Accessibility principles
- Open bugs and feature requests related to the accessibility in MediaWiki and other Wikimedia software
- W3C Web Accessibility Initiative: Tips for Getting Started
- W3C Web Accessibility Initiative: Web Accessibility Evaluation Tools List
- Firefox Developer Tools: Accessibility Inspector
- Chrome Developer Tools: Accessibility features
- Accessibility and usability cleanup
- Blogposts
- Software
- WAVE, a Web accessibility evaluation tool
- Accessibility simulation on MediaWiki. Experience a page as a color blind person would experience it.
- https://www.deque.com/axe/ browser extension for accessibility auditing a page
- https://www.powermapper.com/products/sortsite/checks/accessibility-checks/ webapp for accessibility auditing. See also https://www.powermapper.com/tests/
- University of Cambridge - Impairment simulator software (Microsoft Windows only)
- Guides by 3rd parties
- Designing accessible services by UK Home Office
- Inclusive Design by Microsoft