DEV Community

Cover image for Responsive Navbar HTML CSS — 30 Patterns with Code (2025)
Ayoub Bahlouli
Ayoub Bahlouli

Posted on • Originally published at uixdraft.com

Responsive Navbar HTML CSS — 30 Patterns with Code (2025)

Navigation is the first thing users interact with — and the first thing developers copy-paste without thinking. This guide covers 30 responsive navbar patterns in HTML and CSS, from the simplest horizontal nav to accessible mega menus and glassmorphism headers.

üîó Interactive version with live nav demos: uixdraft.com/responsive-navbar-html-css


The Foundation: Responsive Navbar Pattern

Every responsive navbar follows this structure:

<nav class="navbar">
  <a href="/" class="logo">Brand</a>
  <button class="hamburger" id="hamburger"
          aria-label="Toggle menu" aria-expanded="false">
    <span></span><span></span><span></span>
  </button>
  <ul class="nav-links" id="nav-menu">
    <li><a href="/">Home</a></li>
    <li><a href="/about">About</a></li>
    <li><a href="/contact">Contact</a></li>
  </ul>
  <a href="/signup" class="nav-cta">Get Started</a>
</nav>
Enter fullscreen mode Exit fullscreen mode
.navbar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 0 24px;
  height: 64px;
  background: #0d1117;
  position: sticky; top: 0; z-index: 100;
}
.logo { font-weight: 800; color: #f1f5f9; text-decoration: none; }
.nav-links { display: flex; gap: 28px; list-style: none; }
.nav-links a { color: rgba(241,245,249,.6); text-decoration: none; }
.nav-links a:hover { color: #f1f5f9; }
.hamburger { display: none; }

@media (max-width: 768px) {
  .hamburger { display: flex; flex-direction: column; gap: 5px; }
  .nav-links  { display: none; }
  .nav-links.open { display: flex; flex-direction: column; width: 100%; }
}
Enter fullscreen mode Exit fullscreen mode
const btn  = document.getElementById('hamburger');
const menu = document.getElementById('nav-menu');
btn.addEventListener('click', () => {
  const open = menu.classList.toggle('open');
  btn.setAttribute('aria-expanded', open);
});
Enter fullscreen mode Exit fullscreen mode

1. Sticky Navbar with Backdrop Blur

Pins to the top, frosted glass background on scroll:

.sticky-nav {
  position: sticky;
  top: 0; z-index: 100;
  background: rgba(13, 17, 23, 0.92);
  backdrop-filter: blur(12px);
  -webkit-backdrop-filter: blur(12px);
  border-bottom: 1px solid rgba(255,255,255,.07);
}
Enter fullscreen mode Exit fullscreen mode

2. Glassmorphism Floating Navbar

Floats above the page with a glass effect:

.glass-nav {
  position: fixed;
  top: 16px; left: 50%;
  transform: translateX(-50%);
  width: calc(100% - 48px);
  max-width: 1000px;
  background: rgba(255, 255, 255, 0.06);
  backdrop-filter: blur(14px);
  -webkit-backdrop-filter: blur(14px);
  border: 1px solid rgba(255, 255, 255, 0.1);
  border-radius: 14px;
  z-index: 100;
}
Enter fullscreen mode Exit fullscreen mode

3. Transparent Hero Navbar (Gains BG on Scroll)

.hero-nav {
  position: fixed; top: 0; left: 0; right: 0;
  background: transparent;
  transition: background 0.3s, box-shadow 0.3s;
}
.hero-nav.scrolled {
  background: rgba(13, 17, 23, 0.95);
  box-shadow: 0 1px 0 rgba(255,255,255,.07);
}
Enter fullscreen mode Exit fullscreen mode
window.addEventListener('scroll', () => {
  document.querySelector('.hero-nav')
    .classList.toggle('scrolled', window.scrollY > 60);
});
Enter fullscreen mode Exit fullscreen mode

4. Scroll-Shrink Navbar

Height reduces as the user scrolls:

.nav-shrink {
  height: 72px;
  transition: height 0.3s ease;
}
.nav-shrink.scrolled { height: 48px; }
Enter fullscreen mode Exit fullscreen mode
window.addEventListener('scroll', () => {
  document.querySelector('.nav-shrink')
    .classList.toggle('scrolled', window.scrollY > 80);
});
Enter fullscreen mode Exit fullscreen mode

5. CSS-Only Hamburger Menu (No JavaScript)

Pure CSS toggle using a hidden checkbox:

<input type="checkbox" id="nav-toggle" hidden>
<label for="nav-toggle" class="hamburger">
  <span></span><span></span><span></span>
</label>
<ul class="nav-links">...</ul>
Enter fullscreen mode Exit fullscreen mode
/* Show menu when checkbox is checked */
#nav-toggle:checked ~ .nav-links { display: flex; flex-direction: column; }

/* Animate bars to √ó */
#nav-toggle:checked ~ .hamburger span:nth-child(1) {
  transform: rotate(45deg) translate(5px, 5px);
}
#nav-toggle:checked ~ .hamburger span:nth-child(2) { opacity: 0; }
#nav-toggle:checked ~ .hamburger span:nth-child(3) {
  transform: rotate(-45deg) translate(5px, -5px);
}
Enter fullscreen mode Exit fullscreen mode

6. Slide-in Drawer (Off-Canvas)

.drawer {
  position: fixed; top: 0; left: 0;
  width: 280px; height: 100vh;
  background: #161b22;
  transform: translateX(-100%);
  transition: transform 0.25s ease;
  z-index: 200; padding: 24px 20px;
}
.drawer.open { transform: translateX(0); }
.overlay {
  position: fixed; inset: 0;
  background: rgba(0,0,0,.5);
  display: none; z-index: 199;
}
.overlay.show { display: block; }
Enter fullscreen mode Exit fullscreen mode

7. CSS Dropdown Menu

.has-dropdown { position: relative; }
.dropdown {
  position: absolute; top: 100%; left: 0;
  min-width: 200px;
  background: #161b22;
  border: 1px solid rgba(255,255,255,.1);
  border-radius: 10px; padding: 6px;
  list-style: none;
  visibility: hidden; opacity: 0;
  transform: translateY(-6px);
  transition: all 0.2s ease;
}
/* Trigger on hover AND keyboard focus */
.has-dropdown:hover .dropdown,
.has-dropdown:focus-within .dropdown {
  visibility: visible; opacity: 1;
  transform: translateY(4px);
}
Enter fullscreen mode Exit fullscreen mode

8. Bottom Tab Navigation (Mobile)

.bottom-nav {
  position: fixed; bottom: 0; left: 0; right: 0;
  display: flex; height: 64px;
  background: #0d1117;
  border-top: 1px solid rgba(255,255,255,.07);
}
.tab-item {
  flex: 1; display: flex; flex-direction: column;
  align-items: center; justify-content: center; gap: 3px;
}
.tab-item.active .tab-label { color: #a78bfa; font-weight: 700; }
Enter fullscreen mode Exit fullscreen mode

Accessibility Checklist for Navbars

Always include these for production:

  • ‚úÖ aria-label="Main navigation" on <nav>
  • ‚úÖ aria-expanded="false/true" on hamburger button
  • ‚úÖ aria-controls="menu-id" pointing to the menu
  • ‚úÖ aria-current="page" on the active link
  • ‚úÖ :focus-visible styles ‚Äî never outline: none without a replacement
  • ‚úÖ Keyboard navigable dropdowns (:focus-within)
  • ‚úÖ Skip-to-content link as the first focusable element
<!-- First element in <body> -->
<a href="#main-content" class="skip-link">Skip to content</a>
Enter fullscreen mode Exit fullscreen mode
.skip-link {
  position: absolute; top: -40px; left: 0;
  background: #a78bfa; color: #06080f;
  padding: 8px 16px; z-index: 9999;
}
.skip-link:focus { top: 0; }
Enter fullscreen mode Exit fullscreen mode

All 30 Navbar Patterns

The complete collection — including mega menus, animated X hamburger, progress-aware sticky nav, vertical sidebar nav, breadcrumbs, and docs sidebar — is at:

üëâ uixdraft.com/responsive-navbar-html-css


More CSS references: CSS Buttons (50 styles) · CSS Grid (35 patterns) · CSS Animations (40 demos)

Top comments (0)