ResponsiveNavbar.jsx 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import { useState } from 'react';
  2. import { FaBars, FaTimes, FaChevronDown } from 'react-icons/fa';
  3. import logo from '../assets/logo.png';
  4. const menuItems = [
  5. { label: '회사소개', children: [] },
  6. { label: '사업소개', children: [] },
  7. { label: '사업실적', children: [] },
  8. { label: '고객지원', children: [] },
  9. ];
  10. const ResponsiveNavbar = () => {
  11. const [isOpen, setIsOpen] = useState(false);
  12. const [expandedMenu, setExpandedMenu] = useState(null);
  13. const toggleMobileMenu = () => {
  14. setIsOpen(prev => !prev);
  15. };
  16. const toggleSubMenu = (index) => {
  17. setExpandedMenu(prev => (prev === index ? null : index));
  18. };
  19. return (
  20. <header className="fixed top-0 left-0 w-full z-50 bg-white shadow">
  21. <div className="flex items-center justify-between px-4 md:px-10 py-4">
  22. <img src={logo} alt="Logo" className="h-8" />
  23. {/* Desktop Nav */}
  24. <nav className="hidden md:flex space-x-10 font-semibold">
  25. {menuItems.map((item, idx) => (
  26. <a href="#" key={idx} className="hover:text-blue-600">
  27. {item.label}
  28. </a>
  29. ))}
  30. </nav>
  31. {/* Mobile Toggle */}
  32. <button onClick={toggleMobileMenu} className="md:hidden text-2xl">
  33. {isOpen ? <FaTimes /> : <FaBars />}
  34. </button>
  35. </div>
  36. {/* Mobile Menu */}
  37. {isOpen && (
  38. <div className="md:hidden bg-white w-full h-screen fixed top-0 right-0 p-4 pt-20 z-40 overflow-auto">
  39. <img src={logo} alt="Logo" className="h-8 mb-6" />
  40. <ul>
  41. {menuItems.map((item, idx) => (
  42. <li key={idx} className="mb-4">
  43. <button
  44. onClick={() => toggleSubMenu(idx)}
  45. className="flex justify-between items-center w-full font-semibold text-lg"
  46. >
  47. {item.label}
  48. <FaChevronDown
  49. className={`ml-2 transform transition-transform ${
  50. expandedMenu === idx ? 'rotate-180' : ''
  51. }`}
  52. />
  53. </button>
  54. {expandedMenu === idx && (
  55. <ul className="ml-4 mt-2 space-y-2">
  56. {(item.children.length > 0 ? item.children : ['하위 메뉴 준비중']).map((sub, i) => (
  57. <li key={i} className="text-gray-600">
  58. <a href="#">{sub}</a>
  59. </li>
  60. ))}
  61. </ul>
  62. )}
  63. </li>
  64. ))}
  65. </ul>
  66. </div>
  67. )}
  68. </header>
  69. );
  70. };
  71. export default ResponsiveNavbar;