Fokus gaya

Indikator fokus (sering ditandai dengan "lingkaran fokus") mengidentifikasi fokus pada halaman Anda. Untuk pengguna yang tidak dapat menggunakan {i>mouse<i}, alat ini ini sangat penting karena bertindak sebagai pengganti kursor mouse.

Jika indikator fokus {i>default<i} {i>browser<i} bertentangan dengan desain Anda, Anda dapat menggunakan CSS untuk menata ulang gayanya. Ingatlah untuk mempertimbangkan pengguna {i>keyboard<i} Anda.

Gunakan :focus untuk selalu menampilkan indikator fokus

:focus kelas semu diterapkan setiap kali elemen difokuskan, terlepas dari input perangkat (mouse, keyboard, stilus, dll.) atau metode yang digunakan untuk memfokuskannya. Misalnya, <div> di bawah memiliki tabindex yang membuatnya dapat difokuskan. Alat ini juga memiliki gaya kustom untuk status :focus-nya:

div[tabindex="0"]:focus {
  outline: 4px dashed orange;
}

Terlepas dari apakah Anda menggunakan {i>mouse<i} untuk mengkliknya atau {i>keyboard<i} untuk menekannya, <div> akan selalu terlihat sama.

Sayangnya, cara browser menerapkan fokus mungkin tidak konsisten. Apakah elemen yang tidak menerima fokus mungkin bergantung pada {i>browser<i} dan sistem operasi sistem file.

Misalnya, <button> di bawah juga memiliki gaya kustom untuk :focus-nya status.

button:focus {
  outline: 4px dashed orange;
}

Jika mengklik <button> dengan mouse di Chrome di macOS, Anda akan melihat gaya fokus kustomnya. Namun, Anda tidak akan melihat gaya fokus kustom jika klik <button> di Safari pada macOS. Hal ini karena di Elemen Safari tidak menerima fokus saat Anda mengkliknya.

Karena perilaku fokus tidak konsisten, diperlukan sedikit pengujian di perangkat yang berbeda untuk memastikan gaya fokus Anda dapat diterima oleh pengguna.

Gunakan :focus-visible untuk menampilkan indikator fokus secara selektif

Yang baru :focus-visible kelas semu diterapkan setiap kali elemen menerima fokus dan {i>browser<i} menentukan melalui heuristik bahwa menampilkan indikator fokus akan bermanfaat bagi pengguna. Khususnya, jika interaksi pengguna terbaru adalah melalui keyboard dan penekanan tombol tidak menyertakan meta, ALT / OPTION, atau tombol CONTROL, maka :focus-visible akan cocok.

Tombol dalam contoh di bawah ini akan menampilkan indikator fokus secara selektif. Jika Anda menggunakan {i>mouse<i} untuk mengkliknya, hasilnya akan berbeda dengan jika Anda pertama kali menggunakan {i>keyboard<i} untuk menekan tombol {i>tab<i}.

button:focus-visible {
  outline: 4px dashed orange;
}

Menggunakan :focus-within untuk menata gaya induk elemen yang difokuskan

Tujuan :focus-within kelas semu diterapkan ke elemen baik ketika elemen itu sendiri menerima fokus atau ketika elemen lain di dalam elemen itu menerima fokus.

Alat ini dapat digunakan untuk menyoroti bagian halaman untuk menggambar perhatian pengguna terhadap area tersebut. Misalnya, formulir di bawah ini menerima fokus saat formulir itu sendiri dipilih dan juga saat salah satu tombol pilihannya dipilih.

form:focus-within {
  background: #ffecb3;
}

Waktu menampilkan indikator fokus

Aturan praktis yang baik adalah bertanya pada diri sendiri, "Jika Anda mengklik kontrol ini saat menggunakan perangkat seluler, apakah Anda ingin menampilkan {i>keyboard<i}?"

Jika jawabannya "ya", maka kontrol mungkin harus selalu menunjukkan fokus indikator, terlepas dari perangkat input yang digunakan untuk memfokuskannya. Contoh yang baik adalah elemen <input type="text">. Pengguna harus mengirim input ke elemen input melalui keyboard, terlepas dari bagaimana elemen input pada awalnya diterima sehingga akan sangat membantu untuk selalu menampilkan indikator fokus.

Jika jawabannya "tidak," maka kontrol dapat memilih untuk menampilkan fokus secara selektif indikator. Contoh yang baik adalah elemen <button>. Jika pengguna mengkliknya dengan mouse atau layar sentuh, tindakan selesai, dan indikator fokus mungkin tidak diperlukan. Namun, jika pengguna menavigasi dengan keyboard, sebaiknya menampilkan indikator fokus sehingga pengguna dapat memutuskan apakah mereka ingin klik kontrol menggunakan tombol ENTER atau SPACE.

Menghindarinoutline: none

Cara {i>browser<i} memutuskan kapan harus menggambar indikator fokus, sejujurnya, sangat membingungkan. Mengubah tampilan elemen <button> dengan CSS atau memberi elemen tabindex akan menyebabkan perilaku lingkaran fokus default browser menjadi {i>kick-in<i}.

Anti-pola yang sangat umum adalah menghapus indikator fokus menggunakan CSS seperti:

/* Don't do this!!! */
:focus {
  outline: none;
}

Cara yang lebih baik untuk mengatasi masalah ini adalah menggunakan kombinasi :focus dan polyfill :focus-visible. Blok pertama kode di bawah ini menunjukkan cara polyfill berfungsi, dan aplikasi contoh di bawahnya menyediakan contoh penggunaan polyfill untuk mengubah indikator fokus pada tombol.

/*
  This will hide the focus indicator if the element receives focus via the
  mouse, but it will still show up on keyboard focus.
*/
.js-focus-visible :focus:not(.focus-visible) {
  outline: none;
}

/*
  Optionally: Define a strong focus indicator for keyboard focus.
  If you choose to skip this step, then the browser's default focus
  indicator will be displayed instead.
*/
.js-focus-visible .focus-visible {
  
}