01. Tailwind CSS Hamburger Menu with Slide-Out Drawer (No JavaScript) (opens in a new tab)
group-has-checked:, so the fragile :checked ~ .overlay ~ .drawer sibling chain is gone — the elements can sit anywhere inside the phone. Zero JavaScript.16 Tailwind CSS mobile navigation patterns for app shells, SaaS dashboards, e-commerce menus, and onboarding flows — spanning slide-out hamburger drawers, full-screen overlay menus, iOS bottom tab bars, radial FAB speed dials, swipeable sidebars, accordion mega menus, a glassmorphism drawer, a ⌘K command palette, and a neumorphic bottom bar. Scoped under .tmn-NN for no-collision pasting, prefers-reduced-motion guarded, framework-agnostic.
Related16 CSS Mobile Navigation Patterns28 Tailwind Hamburger Menus20 Tailwind CSS Responsive Navbars22 Tailwind Dropdown Menus
Premium upgradePartner: Untitled UI
Affiliate linkBuilding a whole Tailwind app, not just this component?
You just browsed 16 Tailwind mobile navigation. Untitled UI Pro unlocks 5,000+ components and sections and 250+ page examples for React, styled with Tailwind CSS v4. One licence is a one-time $349 with lifetime updates; teams start at $999.
Untitled UI React. We may earn a commission, at no extra cost to you.
group-has-checked:, so the fragile :checked ~ .overlay ~ .drawer sibling chain is gone — the elements can sit anywhere inside the phone. Zero JavaScript.clip-path reveal, then staggers five oversized serif links up through overflow masks. The port expresses the whole choreography as arbitrary values and per-item group-has-checked:delay-* utilities. Zero JavaScript.backdrop-blur-xl bar, filled-on-active SVG icons and a working notification badge. Radios hold the state; every page and tab reads it through group-has-[#id:checked]:. Zero JavaScript.<div>, so tapping outside never closed the menu — by making it a <label>. Zero JavaScript.group-data-open: utilities; the script only toggles one attribute.animate-ping location pulse and a place card. Zero JavaScript.translate instead of animating left and width. Zero JavaScript.max-height: 300px with the grid-rows-[0fr] → [1fr] technique, so every section animates to its real height with even easing. Zero JavaScript.@theme animation token, and adds a supports-[backdrop-filter]: fallback so browsers without blur get a solid, readable panel. Zero JavaScript.clip-path polygon, over scanlines and a cyan grid, then staggers five neon labels in from the left. Every glow is an arbitrary [text-shadow:…] property tuned per colour; the scanlines are a single after: gradient on the phone. Zero JavaScript.animation-play-state.top: 88px), adds the click-outside scrim the original's gotchas asked for, and uses real <nav><ol> breadcrumb semantics. Zero JavaScript.aria-activedescendant.#e0e5ec: raised cards, recessed wells, and a bottom bar whose active tab presses into the surface. Every shadow pair is a --shadow-tmn16-* theme token, so shadow-tmn16-up and shadow-tmn16-in are the whole design language. Zero JavaScript.for points at it. When the box is checked, a sibling-combinator rule (or :has() on the wrapper) flips the drawer from translate-x-full to translate-x-0 and fades the backdrop in. The three bars morph into an X with rotate-45 and -translate-y on the top and bottom spans while the middle span gets opacity-0. Because the state lives on a real form control, it works with zero script and the label is keyboard-focusable by default, so Space toggles it. The only extra piece is a second <label> over the backdrop pointing at the same checkbox, so tapping outside unchecks it and closes the drawer.overflow: hidden on the document, so a drawer like demo 01 needs a few lines of script to add a lock class to <body> on open. Do it properly: read the current scrollY, apply position: fixed plus a negative top to the body, then on close remove it and restore scrollTo — otherwise the page snaps to the top when the drawer closes. The swipe sidebar in demo 06 sidesteps this by calling preventDefault inside the tracked move handler, so the gesture pans the drawer instead of the page underneath it.aria-expanded reflecting the open state, and every panel needs a name via aria-label or aria-labelledby. When a menu covers the screen, like the overlays in demos 02 and 11, move focus into the panel on open, return it to the trigger on close, and set aria-hidden on the backgrounded content so a screen reader doesn't read through it. Escape must close: the command palette in demo 15 binds a <keydown> listener for Escape and the arrow keys, and the carousel in demo 12 listens for Left and Right. The pure-CSS drawers get keyboard toggling for free because the label wraps a real checkbox, but CSS alone cannot trap focus, so a tall drawer still needs a small script if you want Tab to stay inside it rather than reaching links behind the backdrop.transform: translateX() so the panel follows the finger exactly — and you must disable the CSS transition during the drag, or every frame lags behind. On <touchend> you re-enable the transition and decide the snap: if the drag passed roughly a third of the width, or the velocity is high, snap open, otherwise snap back closed. Demo 06 only begins tracking when the touch starts near the screen edge, so a swipe in the page body doesn't yank the sidebar. Call preventDefault in the move handler to stop the page scrolling while you pan, but only once the horizontal delta clearly beats the vertical one, so normal vertical scrolling still works.backdrop-blur-xl combined with a translucent background such as bg-white/70. The blur samples whatever sits behind the bar, so it only becomes visible when content scrolls underneath it. Two gotchas bite here. First, the element needs a semi-transparent background for the blur to show at all — a solid bg-white paints over it and you see nothing. Second, backdrop-filter is clipped by overflow: hidden on any ancestor, so a parent with clipped overflow silently kills the effect. Add a hairline border-white/20 to define the top edge. For the iOS tab bar in demo 03, the bar is fixed to the bottom with pb-[env(safe-area-inset-bottom)] so its row of targets clears the home indicator on notched phones.clip-path reveal is decoration that delays the user. For frequent switching between a few destinations, the bottom tab bar in demos 03 and 16 wins outright — the targets stay visible and sit one thumb-tap away. The speed-dial in demo 07 suits a single primary action with a few related ones, like compose or share; past about five items the arc gets cramped and labels start to collide. Match the pattern to how often the user navigates, not to which animation looks best in isolation.⌘K on Mac or Ctrl K elsewhere. The handler listens on <keydown>, checks e.metaKey || e.ctrlKey together with e.key === 'k', and calls preventDefault so the browser's own shortcut never fires. Live filtering compares the input value against each item's text and hides the non-matches; the highlighted row is tracked as an index so Up and Down move it and Enter activates it. The classic bug is forgetting to reset that active index when the filtered list shrinks — if the user types until only two results remain, a stored index of four now points at nothing and Enter does nothing. Clamp it to the visible count on every keystroke. Keep the input focused on open, and restore focus to the trigger element on close so keyboard users aren't dropped at the top of the page.clip-path rather than width or opacity, which keeps the reveal cheap for the compositor and smooth on mobile. The overlay is always full-screen in the DOM; closed, it is clipped to a tiny circle() positioned at the button, and open it animates out to a radius large enough to cover the viewport. Demo 11 instead uses a polygon() that wipes in from one corner. Two things to watch. Animate between two clip-paths that use the same shape function with the same number of points, or the browser can't interpolate and the shape simply snaps with no animation. And size the open circle in viewport units like 150vmax so it always clears the screen regardless of aspect ratio. Stagger the link fade-in with transition delays so the menu items arrive just after the shape finishes, not during the wipe.32 free CSS accordions covering pure-CSS FAQ blocks with details/summary, mobile navigation menus, e-commerce filter sidebars, nested tree views, exclusive single-open groups and smoothly animated height:auto — plus 26 visual variations in vertical, horizontal and hybrid layouts. Copy-paste HTML and CSS, no JavaScript.
39 hand-coded CSS breadcrumbs — Schema.org BreadcrumbList Microdata + WCAG 2.2 accessible (Google Rich Results eligible), :has() responsive collapse, dark/light theme toggle with color-mix, Shopify/Amazon e-commerce filter chip removal, Vercel/Linear/Notion SaaS dashboard app-shell pattern, Docusaurus/Mintlify sticky scroll-shrink header, Amazon-style dropdown sibling menus, NFT/Web3 holographic shimmer (@property + conic-gradient), SaaS marketing gradient text, Airbnb filter chip with container queries, editorial blog wave underline, developer docs one-click path copy (Clipboard API), and 26 more. Semantic HTML: <nav aria-label='Breadcrumb'> + <ol> + aria-current='page'. Framework-agnostic, MIT-licensed.
26 hand-coded CSS circular and radial menu designs, from the floating-action FAB speed dial and dashboard radial hubs to game-style pie-slice wheels, SVG gooey metaball fans, hexagonal honeycombs, iris-aperture reveals, orbiting satellites on offset-path, compass-rose directional nav, sci-fi HUD rings, glassmorphism popovers built on the native Popover API, vinyl-record players, and full-takeover nebula overlays on native dialog. Every design uses CSS trigonometry (sin(), cos()) or the counter-rotation trick for positioning, ships real keyboard navigation, aria-labels on icon-only buttons, and a prefers-reduced-motion guard. Copy-paste HTML, CSS and vanilla JS with zero framework dependencies — MIT licensed.