πŸ“Œ μ£Όμš” κΈ°λŠ₯

  1. 슀크둀 이동
  2. ν˜„μž¬ μœ„μΉ˜ν•œ μ„Ήμ…˜ ν‘œμ‹œ (activeSection)
  3. λͺ¨λ°”일 λ°˜μ‘ν˜• 메뉴
    • 햄버거 λ²„νŠΌ 클릭 μ‹œ 메뉴 μ—΄λ¦Ό/λ‹«νž˜
    • 메뉴 선택 μ‹œ μžλ™μœΌλ‘œ λ‹«νž˜

header.jsx

<aside> πŸ’¬

const [isMenuOpen, setIsMenuOpen] = useState(false);

// ν΄λ¦­ν•œ λ©”λ‰΄μ˜ id값에 따라 ν•΄λ‹Ή μ„Ήμ…˜μœΌλ‘œ λΆ€λ“œλŸ½κ²Œ μŠ€ν¬λ‘€ν•˜λŠ” ν•¨μˆ˜
  const scrollToSection = (sectionId) => {
    if (sectionId == "top") {
      window.scrollTo({
        top: 0,              // 맨 μœ„λ‘œ 슀크둀
        behavior: "smooth",  // 슀크둀이 λΆ€λ“œλŸ¬μ›Œμ§€λŠ” μ˜΅μ…˜
      });
    } else {                 // 아이디가 top이 μ•„λ‹ˆλ©΄ 각 νŽ˜μ΄μ§€λ‘œ 이동
      const section = document.getElementById(sectionId);
      if (section) {
        section.scrollIntoView({
          behavior: "smooth",
        });
      }
    }
  };

</aside>

<aside> πŸ’¬

<div className="flex justify-between items-center mx-auto">
        <Logo scrollTo={() => scrollToSection("top")} />

</aside>

<aside> πŸ’¬

<div className="md:hidden ml-auto" onClick={() => setIsMenuOpen(!isMenuOpen)}>
  <button className="text-3xl">☰</button>
</div>

</aside>

<aside> πŸ’¬

 <nav className="hidden md:flex md:flex-row md:space-x-6">
          <ul className="flex space-x-6">
            {["about", "stack", "project", "contact"].map((id) => (
              <NavLink
                key={id}
                id={id}
                section={id.toUpperCase()}
                activeSection={activeSection}
                onClick={scrollToSection}
              />
            ))}
          </ul>
 </nav>

</aside>

<aside> πŸ’¬

{/* λ°˜μ‘ν˜• λΆ€λΆ„ */}
      <MobileMenu
        isMenuOpen={isMenuOpen}
        setIsMenuOpen={setIsMenuOpen}
        activeSection={activeSection}
        scrollToSection={scrollToSection}
      />

</aside>

logo.jsx

<aside> πŸ’¬

const Logo = ({ scrollTo }) => (
    <div
        className="text-xl font-bold cursor-pointer"
        onClick={scrollTo}>
        LeeYurim's Portfolio
    </div>
);

</aside>