0Pricing
React Academy · Pelajaran

Tooltip dan Menu Dropdown dengan Portal

Gunakan portal untuk merender tooltip dan dropdown yang keluar dari kontainer overflow-hidden.

Tooltip dan Menu Dropdown dengan Portal adalah pelajaran React Academy gratis di CoddyKit. Ini adalah pelajaran 4 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 membangun komponen tooltip dan menu tarik-turun yang menggunakan React Portal untuk merender di document.body, sehingga terbebas dari batasan overflow tersembunyi pada induk dan konteks penumpukan z-index.

Masalah Overflow

Tooltip yang diposisikan relatif terhadap tombol pemicunya akan terpotong jika salah satu leluhurnya memiliki `overflow: hidden` atau `overflow: scroll`. Memindahkan tooltip ke document.body melalui portal menyelesaikan masalah ini sepenuhnya.

Strategi Pemosisian

Untuk memosisikan tooltip yang dirender melalui portal dengan benar, ukur persegi panjang pembatas elemen pemicu menggunakan `getBoundingClientRect()` dan hitung koordinat absolut yang memperhitungkan posisi pengguliran.
const rect = triggerRef.current.getBoundingClientRect();
const top = rect.bottom + window.scrollY + 8;
const left = rect.left + window.scrollX;

Komponen Tooltip

Bangun Tooltip yang membungkus elemen anaknya, memasang ref pada pemicu, dan merender kotak tooltip yang sudah diposisikan melalui portal saat diarahkan dengan kursor.
function Tooltip({ content, children }) {
  const [visible, setVisible] = useState(false);
  const [pos, setPos] = useState({ top: 0, left: 0 });
  const ref = useRef();

  const show = () => {
    const r = ref.current.getBoundingClientRect();
    setPos({ top: r.bottom + window.scrollY + 4,
             left: r.left + window.scrollX });
    setVisible(true);
  };

  return (
    <span ref={ref} onMouseEnter={show} onMouseLeave={() => setVisible(false)}>
      {children}
      {visible && createPortal(
        <div style={{ position:'absolute', top: pos.top, left: pos.left }}
             className="tooltip">{content}</div>,
        document.body
      )}
    </span>
  );
}

Memperbarui Posisi Saat Menggulir & Mengubah Ukuran

Jika pengguna menggulir saat tooltip terlihat, posisinya menjadi kedaluwarsa. Dengarkan peristiwa `scroll` dan `resize` untuk menghitung ulang posisinya atau menutup tooltip.
useEffect(() => {
  if (!visible) return;
  const update = () => setVisible(false);
  window.addEventListener('scroll', update, true);
  window.addEventListener('resize', update);
  return () => {
    window.removeEventListener('scroll', update, true);
    window.removeEventListener('resize', update);
  };
}, [visible]);

Arsitektur Menu Tarik-Turun

Menu tarik-turun mengikuti pola yang sama seperti tooltip. Tombol pemicu menampilkan atau menyembunyikan menu, menu dirender melalui portal, dan penangan klik di luar menutupnya.

Penangan Klik di Luar

Gunakan pendengar `mousedown` pada `document` untuk mendeteksi klik di luar menu. Bandingkan target klik dengan referensi menu dan pemicu untuk menentukan apakah menu perlu ditutup.
useEffect(() => {
  if (!open) return;
  const handler = (e) => {
    if (!menuRef.current?.contains(e.target) &&
        !triggerRef.current?.contains(e.target)) {
      setOpen(false);
    }
  };
  document.addEventListener('mousedown', handler);
  return () => document.removeEventListener('mousedown', handler);
}, [open]);

Navigasi Keyboard pada Menu Tarik-Turun

Terapkan ArrowDown/ArrowUp untuk berpindah di antara item menu, Enter untuk memilih, dan Escape untuk menutup. Lacak indeks yang sedang difokuskan dalam status, lalu panggil `.focus()` secara terprogram pada item menu.

Menggunakan Pustaka Pemosisian

Untuk produksi, gunakan **@floating-ui/react** (sebelumnya Popper.js). Pustaka ini secara otomatis menangani pembalikan posisi (memosisikan ulang saat dekat tepi area pandang), pergeseran (menjaga tooltip tetap terlihat), dan pemosisian panah.
import { useFloating, flip, shift } from '@floating-ui/react';

const { refs, floatingStyles } = useFloating({
  middleware: [flip(), shift()],
});

Aksesibilitas: ARIA untuk Tooltip

Untuk tooltip, tambahkan `role='tooltip'` ke elemen tooltip dan `aria-describedby` yang menunjuk ke id tooltip pada pemicu. Dengan demikian, pembaca layar dapat mengumumkan konten tooltip.
<button aria-describedby="tip1">Hover me</button>
{visible && createPortal(
  <div id="tip1" role="tooltip">Helpful text</div>,
  document.body
)}

Pemeriksaan Singkat

Bagaimana cara menghitung posisi layar yang benar untuk tooltip yang dirender melalui portal?

Ringkasan

Portal memungkinkan petunjuk dan menu tarik-turun keluar dari induk yang menyembunyikan luapan. Ukur pemicu dengan getBoundingClientRect, tambahkan offset pengguliran untuk pemosisian absolut, tutup saat terjadi klik di luar atau pengguliran, dan tambahkan atribut ARIA untuk aksesibilitas.

Kursus Selesai

Selamat! Anda telah menyelesaikan **Portal & Modal di React**. Kini Anda dapat membuat modal, petunjuk, dan menu tarik-turun yang aksesibel serta diposisikan dengan benar tanpa terhalang batasan penumpukan CSS apa pun.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Tooltip dan Menu Dropdown dengan Portal” gratis?

Ya — teks lengkap “Tooltip dan Menu Dropdown dengan Portal” 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 “Tooltip dan Menu Dropdown dengan Portal”?

Gunakan portal untuk merender tooltip dan dropdown yang keluar dari kontainer overflow-hidden. 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 4 dari 4.

Berapa lama pelajaran “Tooltip dan Menu Dropdown dengan Portal” 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