After installing Tailwind CSS on your GatsbyJS, you will want to make the menu sytem responsive for mobile devices. Though Tailwind makes this pretty easy to scaffold out, you will need to make some tweaks to your Gatsby React jsx in order for a hamburger menu to be functional. Here's a quick and easy way to make your menu responsive.

Here's the responsive header code from the Tailwind CSS site:

<nav class="flex items-center justify-between flex-wrap bg-teal-500 p-6"> <div class="flex items-center flex-shrink-0 text-white mr-6"> <svg class="fill-current h-8 w-8 mr-2" width="54" height="54" viewBox="0 0 54 54" xmlns="http://www.w3.org/2000/svg"><path d="M13.5 22.1c1.8-7.2 6.3-10.8 13.5-10.8 10.8 0 12.15 8.1 17.55 9.45 3.6.9 6.75-.45 9.45-4.05-1.8 7.2-6.3 10.8-13.5 10.8-10.8 0-12.15-8.1-17.55-9.45-3.6-.9-6.75.45-9.45 4.05zM0 38.3c1.8-7.2 6.3-10.8 13.5-10.8 10.8 0 12.15 8.1 17.55 9.45 3.6.9 6.75-.45 9.45-4.05-1.8 7.2-6.3 10.8-13.5 10.8-10.8 0-12.15-8.1-17.55-9.45-3.6-.9-6.75.45-9.45 4.05z"/></svg> <span class="font-semibold text-xl tracking-tight">Tailwind CSS</span> </div> <div class="block lg:hidden"> <button class="flex items-center px-3 py-2 border rounded text-teal-200 border-teal-400 hover:text-white hover:border-white"> <svg class="fill-current h-3 w-3" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><title>Menu</title><path d="M0 3h20v2H0V3zm0 6h20v2H0V9zm0 6h20v2H0v-2z"/></svg> </button> </div> <div class="w-full block flex-grow lg:flex lg:items-center lg:w-auto"> <div class="text-sm lg:flex-grow"> <a href="#responsive-header" class="block mt-4 lg:inline-block lg:mt-0 text-teal-200 hover:text-white mr-4"> Docs </a> <a href="#responsive-header" class="block mt-4 lg:inline-block lg:mt-0 text-teal-200 hover:text-white mr-4"> Examples </a> <a href="#responsive-header" class="block mt-4 lg:inline-block lg:mt-0 text-teal-200 hover:text-white"> Blog </a> </div> <div> <a href="#" class="inline-block text-sm px-4 py-2 leading-none border rounded text-white border-white hover:border-transparent hover:text-teal-500 hover:bg-white mt-4 lg:mt-0">Download</a> </div> </div> </nav>

On its own, the responsive navigation code from Tailwind's site doesn't expand and collapse when we click the hamburger icon so we need to make a few changes to the header.js file.

Step 1: Import useState with React

We will be using the useState hook to keep track of whether or not the menu is open.

import React, { useState } from "react"

Then update the tailwind html in your jsx file

function Header ({ siteTitle }) { const [isExpanded, toggleExpansion] = useState(false) return ( <nav className="flex items-center justify-between flex-wrap bg-teal-500 p-6"> <div className="flex items-center flex-shrink-0 text-white mr-6"> <svg className="fill-current h-8 w-8 mr-2" width="54" height="54" viewBox="0 0 54 54" xmlns="http://www.w3.org/2000/svg"><path d="M13.5 22.1c1.8-7.2 6.3-10.8 13.5-10.8 10.8 0 12.15 8.1 17.55 9.45 3.6.9 6.75-.45 9.45-4.05-1.8 7.2-6.3 10.8-13.5 10.8-10.8 0-12.15-8.1-17.55-9.45-3.6-.9-6.75.45-9.45 4.05zM0 38.3c1.8-7.2 6.3-10.8 13.5-10.8 10.8 0 12.15 8.1 17.55 9.45 3.6.9 6.75-.45 9.45-4.05-1.8 7.2-6.3 10.8-13.5 10.8-10.8 0-12.15-8.1-17.55-9.45-3.6-.9-6.75.45-9.45 4.05z"/></svg> <span className="font-semibold text-xl tracking-tight">{ siteTitle }</span> </div> <div className="block lg:hidden"> <button onClick={() => toggleExpansion(!isExpanded)} className="flex items-center px-3 py-2 border rounded text-teal-200 border-teal-400 hover:text-white hover:border-white"> <svg className="fill-current h-3 w-3" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><title>Menu</title><path d="M0 3h20v2H0V3zm0 6h20v2H0V9zm0 6h20v2H0v-2z"/></svg> </button> </div> <div className={`${ isExpanded ? `block` : `hidden` } w-full block flex-grow lg:flex lg:items-center lg:w-auto`}> <div className="text-sm lg:flex-grow"> <Link to={`/page-2`} href="#responsive-header" className="block mt-4 lg:inline-block lg:mt-0 text-teal-200 hover:text-white mr-4"> Docs </Link> <Link to={`/page-2`} className="block mt-4 lg:inline-block lg:mt-0 text-teal-200 hover:text-white mr-4"> Examples </Link> <Link to={`/page-2`} className="block mt-4 lg:inline-block lg:mt-0 text-teal-200 hover:text-white"> Blog </Link> </div> <div> <a href="#download" className="inline-block text-sm px-4 py-2 leading-none border rounded text-white border-white hover:border-transparent hover:text-teal-500 hover:bg-white mt-4 lg:mt-0">Download</a> </div> </div> </nav> ) }

Notes

  • We've added a couple of constants to keep track of our toggle state.
  • We've added an onClick to the hamburger button to toggle the menu visibility.
  • We've placed a conditional statement in our CSS class names which checks the toggle state and shows or hides the toggled menu.

Now, once you save and view your changes, you should have a fully responsive navigational menu built with React and Tailwind in Gatsby!

Credits

Thanks to ericbusch.net

Tailwindcss

© 2021 Marc Trudel, Built with Gatsby