Designing navigation that works beautifully across screen sizes is essential. In this guide, you'll build a responsive mobile navigation menu using Tailwind CSS and React—with state-driven interactivity and smooth styling.
Features
- Hamburger menu toggle for small screens
- Horizontal links on large screens
- Tailwind-powered transitions and responsiveness
- Clean, reusable component structure
Navigation.js
import { useState } from 'react' import { Menu, X } from 'lucide-react' const links = [ { name: 'Home', href: '#' }, { name: 'Features', href: '#' }, { name: 'Pricing', href: '#' }, { name: 'Contact', href: '#' }, ] export default function Navigation() { const [open, setOpen] = useState(false) return ( <nav className="bg-white border-b shadow-sm"> <div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"> <div className="flex justify-between items-center h-16"> {/* Logo */} <div className="flex-shrink-0 font-bold text-xl text-indigo-600"> MySite </div> {/* Desktop Links */} <div className="hidden md:flex space-x-6"> {links.map((link) => ( <a key={link.name} href={link.href} className="text-gray-700 hover:text-indigo-600 transition" > {link.name} </a> ))} </div> {/* Mobile Button */} <div className="md:hidden"> <button onClick={() => setOpen(!open)} className="text-gray-700 hover:text-indigo-600 transition" > {open ? <X size={24} /> : <Menu size={24} />} </button> </div> </div> </div> {/* Mobile Menu */} {open && ( <div className="md:hidden px-4 pb-4 space-y-2"> {links.map((link) => ( <a key={link.name} href={link.href} className="block text-gray-700 hover:text-indigo-600 transition" > {link.name} </a> ))} </div> )} </nav> ) }
How It Works
- The component uses
useState
to track if the mobile menu is open. - On large screens (
md:
and up), links are shown inline. - On small screens, a hamburger menu toggles vertical links.
- Uses Lucide icons (
Menu
,X
) for visual clarity.
Tailwind Highlights
-
hidden md:flex
to show/hide links -
border-b
,shadow-sm
for clean header styles -
transition
on hover states for smooth effects -
space-y-2
for vertical spacing in mobile menu
Tips for Production
- Handle outside clicks to auto-close menu
- Animate menu open/close with
framer-motion
- Use
NavLink
from React Router for active state - Support accessibility with ARIA attributes
Final Thoughts
This mobile-first navigation pattern helps ensure your UI remains clean, responsive, and interactive—without adding unnecessary complexity.
For more scalable Tailwind UI strategies:
Mastering Tailwind at Scale: Architecture, Patterns & Performance
Start clean, stay fast—Tailwind and React make mobile menus a breeze.
Top comments (0)