0Pricing
React Academy · บทเรียน

คำแนะนำเครื่องมือและเมนูดรอปดาวน์ด้วย Portals

ใช้พอร์ทัลเพื่อเรนเดอร์คำแนะนำเครื่องมือและเมนูดรอปดาวน์ที่หลุดออกจากคอนเทนเนอร์ overflow-hidden

คำแนะนำเครื่องมือและเมนูดรอปดาวน์ด้วย Portals เป็นบทเรียน React Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน React Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน

ยินดีต้อนรับ

ในบทเรียนนี้ คุณจะสร้างคอมโพเนนต์คำแนะนำเครื่องมือและเมนูดรอปดาวน์ที่ใช้ React Portals เพื่อเรนเดอร์ใน document.body และหลีกเลี่ยงข้อจำกัดของ overflow-hidden และบริบทการซ้อน z-index ของคอมโพเนนต์แม่

ปัญหา Overflow

คำแนะนำเครื่องมือที่จัดตำแหน่งสัมพันธ์กับปุ่มทริกเกอร์จะถูกตัด หากบรรพบุรุษใดมี `overflow: hidden` หรือ `overflow: scroll` การย้ายคำแนะนำเครื่องมือไปยัง document.body ผ่านพอร์ทัลจะแก้ปัญหานี้ได้อย่างสมบูรณ์

กลยุทธ์การจัดตำแหน่ง

หากต้องการจัดตำแหน่งคำแนะนำเครื่องมือที่เรนเดอร์ด้วยพอร์ทัลอย่างถูกต้อง ให้วัดสี่เหลี่ยมขอบเขตขององค์ประกอบทริกเกอร์ด้วย `getBoundingClientRect()` แล้วคำนวณพิกัดสัมบูรณ์ที่คำนึงถึงตำแหน่งการเลื่อน
const rect = triggerRef.current.getBoundingClientRect();
const top = rect.bottom + window.scrollY + 8;
const left = rect.left + window.scrollX;

คอมโพเนนต์คำแนะนำเครื่องมือ

สร้าง Tooltip ที่ห่อหุ้ม children ของตัวเอง แนบ ref เข้ากับทริกเกอร์ และสร้างพอร์ทัลกล่องคำแนะนำเครื่องมือที่จัดตำแหน่งแล้วเมื่อมีการชี้เมาส์
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>
  );
}

การอัปเดตตำแหน่งเมื่อเลื่อนและปรับขนาด

หากผู้ใช้เลื่อนหน้าขณะที่คำแนะนำเครื่องมือมองเห็นอยู่ ตำแหน่งของคำแนะนำจะล้าสมัย รับฟังเหตุการณ์ `scroll` และ `resize` เพื่อคำนวณตำแหน่งใหม่หรือปิดคำแนะนำเครื่องมือ
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]);

สถาปัตยกรรมเมนูดรอปดาวน์

เมนูดรอปดาวน์ใช้รูปแบบเดียวกับคำแนะนำเครื่องมือ ปุ่มทริกเกอร์จะแสดงหรือซ่อนเมนู เมนูจะเรนเดอร์ผ่านพอร์ทัล และตัวจัดการการคลิกภายนอกจะปิดเมนู

ตัวจัดการการคลิกภายนอก

ใช้ตัวรับฟัง `mousedown` บน `document` เพื่อตรวจจับการคลิกนอกเมนู เปรียบเทียบเป้าหมายการคลิกกับ ref ของเมนูและทริกเกอร์ เพื่อตัดสินใจว่าจะปิดหรือไม่
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]);

การนำทางด้วยแป้นพิมพ์ในเมนูดรอปดาวน์

นำ ArrowDown/ArrowUp มาใช้เพื่อย้ายระหว่างรายการเมนู ใช้ Enter เพื่อเลือก และ Escape เพื่อปิด ติดตามดัชนีที่มี focus ในสถานะ แล้วเรียก `.focus()` กับรายการเมนูด้วยโปรแกรม

การใช้ไลบรารีจัดตำแหน่ง

สำหรับการใช้งานจริง ให้ใช้ **@floating-ui/react** (เดิมคือ Popper.js) ไลบรารีนี้จัดการการพลิกตำแหน่งเมื่ออยู่ใกล้ขอบวิวพอร์ต การเลื่อนตำแหน่งเพื่อให้คำแนะนำมองเห็นอยู่ และการจัดตำแหน่งลูกศรโดยอัตโนมัติ
import { useFloating, flip, shift } from '@floating-ui/react';

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

การเข้าถึง: ARIA สำหรับคำแนะนำเครื่องมือ

สำหรับคำแนะนำเครื่องมือ ให้เพิ่ม `role='tooltip'` ให้กับองค์ประกอบคำแนะนำ และเพิ่ม `aria-describedby` ที่ชี้ไปยัง id ของคำแนะนำบนทริกเกอร์ วิธีนี้ทำให้โปรแกรมอ่านหน้าจอประกาศเนื้อหาของคำแนะนำเครื่องมือได้
<button aria-describedby="tip1">Hover me</button>
{visible && createPortal(
  <div id="tip1" role="tooltip">Helpful text</div>,
  document.body
)}

ตรวจสอบอย่างรวดเร็ว

คุณคำนวณตำแหน่งที่ถูกต้องบนหน้าจอสำหรับคำแนะนำเครื่องมือที่เรนเดอร์ด้วยพอร์ทัลได้อย่างไร

สรุปทบทวน

พอร์ทัลช่วยให้ทูลทิปและเมนูดรอปดาวน์หลุดออกจากองค์ประกอบแม่ที่กำหนด overflow-hidden ได้ ให้วัดตัวเรียกด้วย getBoundingClientRect เพิ่มค่าชดเชยการเลื่อนสำหรับการจัดตำแหน่งแบบสัมบูรณ์ ปิดเมื่อคลิกภายนอกหรือเลื่อนหน้า และเพิ่มแอตทริบิวต์ ARIA เพื่อการเข้าถึง

จบหลักสูตร

ยินดีด้วยครับ! คุณเรียนจบ **พอร์ทัลและโมดัลใน React** แล้ว ตอนนี้คุณสามารถสร้างโมดัล ทูลทิป และเมนูดรอปดาวน์ที่เข้าถึงได้และจัดตำแหน่งได้ถูกต้อง โดยไม่ติดข้อจำกัดด้านการซ้อนของ CSS

คำถามที่พบบ่อย

บทเรียน “คำแนะนำเครื่องมือและเมนูดรอปดาวน์ด้วย Portals” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “คำแนะนำเครื่องมือและเมนูดรอปดาวน์ด้วย Portals” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส React Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “คำแนะนำเครื่องมือและเมนูดรอปดาวน์ด้วย Portals”

ใช้พอร์ทัลเพื่อเรนเดอร์คำแนะนำเครื่องมือและเมนูดรอปดาวน์ที่หลุดออกจากคอนเทนเนอร์ overflow-hidden คุณปฏิบัติ React Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน React Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน React Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “คำแนะนำเครื่องมือและเมนูดรอปดาวน์ด้วย Portals” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน React Academy นี้ได้ไหม

ได้ บทเรียน React Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. React Portals คืออะไร
  2. การสร้างคอมโพเนนต์โมดัลด้วย Portals
  3. การจัดการโฟกัสและกับดักแป้นพิมพ์ในโมดัล
  4. คำแนะนำเครื่องมือและเมนูดรอปดาวน์ด้วย Portals
← กลับไปที่ React Academy