Project: Responsive Navigation Bar
Build a real sticky navigation bar from scratch — desktop horizontal layout, mobile hamburger menu, and smooth transitions. This combines everything from positioning, flexbox, media queries, and pseudo-classes.
HTML Structure
HTML
<header class="navbar"> <div class="nav-container"> <a href="/" class="nav-logo">MySite</a> <button class="nav-toggle" aria-label="Toggle menu"> <span></span> <span></span> <span></span> </button> <nav class="nav-links"> <a href="/">Home</a> <a href="/courses">Courses</a> <a href="/blog">Blog</a> <a href="/contact" class="nav-cta">Get Started</a> </nav> </div> </header>
CSS — Desktop First
CSS
.navbar { position: sticky; top: 0; z-index: 100; background: #fff; border-bottom: 1px solid #eee; box-shadow: 0 2px 8px rgba(0,0,0,0.08); } .nav-container { max-width: 1200px; margin: 0 auto; padding: 0 1.5rem; display: flex; align-items: center; justify-content: space-between; height: 64px; } .nav-logo { font-size: 1.25rem; font-weight: 700; color: #6c63ff; text-decoration: none; } .nav-links { display: flex; gap: 0.25rem; align-items: center; } .nav-links a { padding: 0.5rem 0.875rem; border-radius: 6px; color: #444; text-decoration: none; font-size: 0.95rem; transition: background 0.2s, color 0.2s; } .nav-links a:hover { background: #f0eeff; color: #6c63ff; } .nav-cta { background: #6c63ff !important; color: white !important; font-weight: 600; } .nav-cta:hover { background: #5a52d5 !important; } .nav-toggle { display: none; } /* hidden on desktop */
CSS — Mobile Menu
CSS
@media (max-width: 768px) { .nav-toggle { display: flex; flex-direction: column; gap: 5px; background: none; border: none; cursor: pointer; padding: 4px; } .nav-toggle span { display: block; width: 24px; height: 2px; background: #333; transition: transform 0.3s; } .nav-links { position: absolute; top: 64px; left: 0; right: 0; background: white; flex-direction: column; padding: 1rem; border-bottom: 1px solid #eee; display: none; /* hidden by default */ } .nav-links.open { display: flex; } .nav-links a { width: 100%; text-align: center; } }
JavaScript — Toggle Menu
JavaScript
const toggle = document.querySelector('.nav-toggle'); const links = document.querySelector('.nav-links'); toggle.addEventListener('click', () => { links.classList.toggle('open'); }); // Close menu when a link is clicked links.querySelectorAll('a').forEach(link => { link.addEventListener('click', () => links.classList.remove('open')); });