0Pricing
React Academy · Pelajaran

Menangani Fokus dan Perangkap Keyboard dalam Modal

Pertahankan fokus di dalam modal yang terbuka demi aksesibilitas menggunakan useRef dan pemantau event.

Menangani Fokus dan Perangkap Keyboard dalam Modal adalah pelajaran React Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar React Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus React Academy mencakup 4 pelajaran total.

Selamat Datang

Dalam pelajaran ini, Anda akan menerapkan perangkap fokus di dalam modal agar pengguna keyboard tidak dapat berpindah dengan Tab ke luar modal yang terbuka — persyaratan aksesibilitas penting (WCAG 2.4.3).

Alasan Perangkap Fokus Diperlukan

Saat modal terbuka, pengguna keyboard seharusnya hanya dapat berinteraksi dengan konten modal. Tanpa perangkap fokus, menekan Tab memindahkan fokus ke elemen di balik lapisan modal — elemen tersebut tersembunyi secara visual, tetapi masih dapat dijangkau.

Apa Itu Perangkap Fokus

Perangkap fokus mencegat peristiwa tombol Tab dan Shift+Tab. Saat fokus akan keluar dari modal, perangkap tersebut mengembalikannya ke elemen focusable pertama atau terakhir di dalam modal.

Menemukan Elemen focusable

Gunakan querySelectorAll dengan pemilih yang mencakup semua elemen interaktif. Saring elemen yang dinonaktifkan dan tersembunyi.
const FOCUSABLE = [
  'a[href]', 'button:not([disabled])',
  'input:not([disabled])', 'select', 'textarea',
  '[tabindex]:not([tabindex="-1"])'
].join(',');

const focusable = Array.from(
  modalRef.current.querySelectorAll(FOCUSABLE)
);

Menerapkan Perangkap

Dengarkan peristiwa keydown pada kontainer modal. Saat Tab ditekan, jika fokus berada pada elemen terakhir, pindahkan fokus ke elemen first. Saat Shift+Tab ditekan, jika fokus berada pada elemen first, pindahkan fokus ke elemen last.
function handleTab(e) {
  const focusable = /* array of focusable elements */;
  const first = focusable[0];
  const last = focusable[focusable.length - 1];
  if (e.key !== 'Tab') return;
  if (e.shiftKey) {
    if (document.activeElement === first) {
      e.preventDefault(); last.focus();
    }
  } else {
    if (document.activeElement === last) {
      e.preventDefault(); first.focus();
    }
  }
}

Memindahkan Fokus Saat Modal Dibuka

Saat modal terbuka, pindahkan fokus ke elemen focusable pertama di dalamnya (atau ke kontainer modal itu sendiri menggunakan `tabIndex=-1`). Dengan demikian, fokus tidak tetap berada pada tombol yang membuka modal.
useEffect(() => {
  if (isOpen) {
    const first = modalRef.current?.querySelector(FOCUSABLE);
    first?.focus();
  }
}, [isOpen]);

Mengembalikan Fokus Saat Modal Ditutup

Saat modal ditutup, kembalikan fokus ke elemen yang aktif sebelum modal dibuka. Simpan ref ke `document.activeElement` pada saat modal dibuka.
const previousFocus = useRef(null);

useEffect(() => {
  if (isOpen) {
    previousFocus.current = document.activeElement;
  } else {
    previousFocus.current?.focus();
  }
}, [isOpen]);

Menggunakan Pustaka focus-trap-react

Untuk penggunaan produksi, pertimbangkan pustaka **focus-trap-react**. Pustaka ini menangani semua kasus khusus: DOM bayangan, iframe, elemen focusable yang ditambahkan secara dinamis, dan penonaktifan saat tombol Escape ditekan.
import FocusTrap from 'focus-trap-react';

{isOpen && (
  <FocusTrap>
    <div role="dialog" aria-modal="true">
      {children}
    </div>
  </FocusTrap>
)}

Atribut ARIA untuk Modal

Tambahkan `role="dialog"` dan `aria-modal="true"` ke kontainer modal. Tambahkan `aria-labelledby` yang menunjuk ke judul modal. Dengan demikian, pembaca layar mengetahui bahwa dialog tersebut adalah modal dan mengumumkannya dengan benar.
<div
  role="dialog"
  aria-modal="true"
  aria-labelledby="modal-title"
>
  <h2 id="modal-title">Confirm Delete</h2>
  ...
</div>

Atribut Inert untuk Latar Belakang

Atribut `inert` HTML pada kontainer menghapus semua elemennya dari urutan fokus dan aksesibilitas pembaca layar. Atur `document.getElementById('root').inert = true` saat modal terbuka untuk memblokir latar belakang dengan kuat.
useEffect(() => {
  const root = document.getElementById('root');
  if (isOpen) root.setAttribute('inert', '');
  else root.removeAttribute('inert');
}, [isOpen]);

Pemeriksaan Singkat

Apa yang seharusnya terjadi saat pengguna keyboard menekan Tab pada elemen focusable terakhir di dalam modal yang memiliki perangkap fokus?

Ringkasan

Anda telah menerapkan perangkap fokus: menemukan elemen focusable, mencegat Tab/Shift+Tab, memindahkan fokus saat modal dibuka, dan mengembalikan fokus saat modal ditutup. Gunakan focus-trap-react untuk produksi dan tambahkan role='dialog' serta aria-modal untuk pembaca layar.

Berikutnya

Pelajaran berikutnya: **Tooltip & Menu Tarik-Turun dengan Portal** — Anda akan merender tooltip dan menu tarik-turun yang keluar dari kontainer overflow tersembunyi menggunakan createPortal.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Menangani Fokus dan Perangkap Keyboard dalam Modal” gratis?

Ya — teks lengkap “Menangani Fokus dan Perangkap Keyboard dalam Modal” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus React Academy, upgrade ke CoddyKit PRO. Kursus React Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Menangani Fokus dan Perangkap Keyboard dalam Modal”?

Pertahankan fokus di dalam modal yang terbuka demi aksesibilitas menggunakan useRef dan pemantau event. Kamu berlatih React Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai React Academy?

Tidak diperlukan pengalaman sebelumnya. React Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.

Berapa lama pelajaran “Menangani Fokus dan Perangkap Keyboard dalam Modal” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran React Academy ini?

Ya. Setiap pelajaran React Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Apa Itu React Portal?
  2. Membangun Komponen Modal dengan Portal
  3. Menangani Fokus dan Perangkap Keyboard dalam Modal
  4. Tooltip dan Menu Dropdown dengan Portal
← Kembali ke React Academy