Blog

Maak een geanimeerde hamburger menu knop in Nuxt en Tailwind

In deze blog gaan we samen kijken hoe we een hamburger menu knop kunnen maken in Nuxt met behulp van Tailwind. Je kan de button natuurlijk ook in actie zien op deze website!

Laten we samen beginnen om de knop te maken. Ik zal de code laten zien en je dan vervolgens per regel uitleggen wat het is, wat het doet en waarom we het doen.

We beginnen met het schrijven van onze HTML code. Omdat we in Nuxt werken, schrijven we dit natuurlijk binnen een template.

<template>
  <div
      class="cursor-pointer menu-button"
      :class="{ 'open' : menuOpened }"
      @click="menuOpened = !menuOpened">
    <div class="menu-hamburger" />
  </div>
</template>

Wat we hier doen is het volgende:

  • We maken een div aan welke als "wrapper" zal dienen. Hierbinnen wordt het hamburger menu dus weergegeven.
  • We voegen twee classes toe namelijk cursor-pointer en menu-button. De class cursor-pointer is een class uit Tailwind welke er voor zorgt dat wanneer je over het element gaat met je muis, dat de cursor in een pointer veranderd. Dit maakt het duidelijk voor de gebruiker dat er een interactie mogelijk is.
  • De class menu-button is een class welke wij zelf aanmaken zodat we hier wat styling aan kunnen toevoegen wanneer er een bepaalde staat actief is.
  • Natuurlijk voegen we ook een @click event toe. Wanneer de gebruiker op de div klikt zal de functie, of code die we meegeven aan de @click uitgevoerd worden en is het voor ons mogelijk om een status te wijzigen zodat we weten of het menu open of dicht is.
  • Nu we de HTML klaar hebben staan moeten we natuurlijk ook de variabele maken waarin we de status opslaan. Dit doen we met onderstaande code:
import { ref } from '@nuxtjs/composition-api'

export default {
  setup () {
    const menuOpened = ref(false)

    return {
      menuOpened,
    }
  },
}
  • Het eerste wat we doen is de ref functie importeren van de Nuxt Composition API. De ref functie zorgt er simpel gezegd voor dat we een reactieve waarde (reactive value) kunnen toekennen. Wanneer de waarde dus veranderd, zal dit direct ook reflecteren in je template en de rest van de code.
  • Vervolgens maken we een constante variabele met de naam menuOpened aan van het boolean type met de standaard waarde false.
  • Omdat we deze waarde ook in onze template willen kunnen gebruiken, moeten we hem ook returnen. Dit doen we aan het einde van de setup methode.
  • Nu we alles klaar hebben staan, rest ons alleen nog wat styling te schrijven.
.menu-button {
  @apply w-8 h-7 relative flex items-center justify-center;
}

.menu-hamburger {
  @apply bg-black w-6 h-1 rounded-2xl transition-all ease-in-out duration-500;
}

.menu-hamburger::after,
.menu-hamburger::before {
  content: '';
  @apply bg-black w-6 h-1 rounded-2xl absolute transition-all ease-in-out duration-500;
}

.menu-hamburger::before {
  @apply translate-y-2;
}

.menu-hamburger::after {
  @apply -translate-y-2;
}

.menu-button.open .menu-hamburger {
  @apply -translate-x-3 bg-transparent;
}

.menu-button.open .menu-hamburger::before {
  @apply rotate-45 -translate-y-0 translate-x-3;
}

.menu-button.open .menu-hamburger::after {
  @apply -rotate-45 -translate-y-0 translate-x-3;
}
  • Het eerste wat we doen is de style tag toevoegen aan onze code. We geven deze het attribuut scoped mee. Dit doen we zodat we zeker weten dat onze CSS alleen invloed heeft op dit specifieke component en niet op andere componenten binnen de website.
  • Nu kunnen we een hoogte en breedte toekennen aan onze button. Dit doen we door de Tailwind classes w-8 en h-7 te gebruiken. We gebruiken ook de classes flex, items-center en justify-center om er voor te zorgen dat alles binnen de div altijd horizontaal en verticaal in het midden staat.
  • Wat is een hamburger menu zonder de bekende drie streepjes!? We gaan deze nu toevoegen. We maken onze classe .menu-hamburger aan en voegen daar onder andere ook de classes transition-all, ease-in-out en duration-500 aan toe. Wat deze classes doen is er voor zorgen dat de animatie geleidelijk verloopt en niet in één keer gebeurd. De animatie gaat nu van punt A naar punt B tijdens een duratie van 500 milliseconden.
  • Wanneer je nu naar je pagina kijkt zal je zien dat er één zwarte streep staat. We missen er dus nog twee! Deze gaan we nu toevoegen door gebruik te maken van pseudo classes.
.menu-hamburger::after,
.menu-hamburger::before {
  content: '';
  @apply bg-black w-6 h-1 rounded-2xl absolute transition-all ease-in-out duration-500
}

.menu-hamburger::before {
  @apply translate-y-2
}

.menu-hamburger::after {
  @apply -translate-y-2
}

.menu-button.open .menu-hamburger::before {
  @apply rotate-45 -translate-y-0 translate-x-3
}

.menu-button.open .menu-hamburger::after {
  @apply -rotate-45 -translate-y-0 translate-x-3
}
  • Met het eerste stuk CSS definieren we een before en after zonder content. We zorgen er hiermee voor dat we twee extra streepjes krijgen. Het ene streepje zetten we een klein beetje omhoog door er later een translate-y-2 op te zetten, terwijl we het andere streepje weer wat verder naar ondere plaatsen met -translate-y-2.
  • Het laatste wat nu rest is het maken van de animatie voor elk net toegevoegd steepje. Dit kunnen we simpelweg doen door te kijken wanneer de open class is toegevoegd aan de div. We doen dit als volgt: .menu-button.open. Dit betekend letterlijk "Als de div met class menu-button" ook een class open heeft, dan..."
  • Vervolgens zie je dat we een transform uitvoeren. De classes rotate-45 -translate-y-0 translate-x-3 zorgen er voor dat de streep 45 graden draait en dat zijn positie op de x-as horizontaal corrigeert. Dit doen we voor beide stepen individueel natuurlijk.
  • Als het goed is heb je nu een mooie geanimeerde hamburger knop voor je website!

  • Over ons

  • Beltmolen 22
  • 3352XD, Papendrecht
  • Telefoon: +31 (0) 6 21 65 84 92
  • WhatsApp: +31 (0) 6 21 65 84 92
  • KVK: 82867208
  • NL02 ABNA 0101 9691 55
© 2005 ~ 2022 Digital Forge