Creëer een coole geanimeerde navigatie met CSS en jQuery

Animatie en visuele feedback zijn geweldige manieren om een ​​gebruiker te helpen bij het navigeren en communiceren met een website. Terwijl traditioneel Flash van Adobe de basis was voor alles wat geanimeerd was, kunnen we tegenwoordig met de magie van javascript Flash helemaal vermijden. Vandaag gaan we een echt cool geanimeerd navigatiemenu bouwen met alleen CSS en jQuery.

Demo en broncode


Overzicht

Het menu dat we bouwen, is te zien in de onderstaande schermafbeelding. Je kunt de definitieve werkversie hier ook bekijken.

Ik ga deze tutorial als volgt in vijf delen splitsen:

  • Ruwe schets
  • Resources maken
  • De HTML opschrijven
  • De CSS opschrijven
  • De animatie maken met jQuery

Stap 1: Ruwe schets

Laten we eerst eens kijken wat we hier moeten doen.

Dus hier is een globaal idee van wat we zouden moeten doen:

  • We zullen de pagina opdelen in 4 delen, header, navigatie en content header en de rest van de content
  • Het kopgedeelte zal eenvoudig zijn
    houder
  • Het navigatiegebied zal in meerdere worden gesplitst
    container die overeenkomt met het menu-item.
  • Nu gebruiken we meestal

    • container, maar omdat elk menu-item uniek is,
      Ik zie de voordelen van het gebruik niet
      • dus ik ga gebruiken
        container in plaats daarvan.

      • De inhoud zal eenvoudig zijn
        houder

      Dus om het samen te vatten

       
      huis
      wat betreft
      Diensten
      oplossingen
      contact

      Het kan helpen om de mappenstructuur die ik ben te laten zien. De directory-structuur is als volgt:

      Stap 2: Bronnen

      Ik neem aan dat je basiskennis hebt in het omgaan met Photoshop, dus ik zal niet te gedetailleerde instructies geven over het maken van de bronnen.
      Er zijn verschillende dingen die we moeten maken.

      • Header achtergrond
      • Inhoudstitel
      • Navigatie
      • Achtergrondstreep

      Merk op dat als u deze stap wilt overslaan, u de volledige zip van bestanden aan het einde van de zelfstudie kunt downloaden en mijn exemplaren kunt extraheren!

      Oké, laten we de header-achtergrond maken. Open Photoshop en maak een doek van 1x181 px, of u kunt het groter maken en vervolgens de afbeelding bijsnijden.
      Maak een laag en geef het een lineair verloop met Voorgrond naar achtergrond voorinstelling voor 171px, dit is het hoofdverloop.
      Maak nog een laag en geef het een lineair verloop met Voorgrond naar Transparant voorinstelling voor ongeveer 10px onderaan de eerste laag voor een schaduweffect.

      Hier is hoe het eruit zou moeten zien, het is 100x181 px dat ik later bijsnijd naar 1x181 px.

      Bewaar deze als 'Hdr-bkg.png' in onze 'Img' map.

      Vervolgens maken we de inhoudstitel. Nogmaals, open Photoshop en maak 934x284 px.
      Maak een afgeronde rechthoek met het juiste gereedschap, selecteer de gemaakte vorm, maak een nieuwe laag, voeg een verloop toe en geef het wat slagschaduw.
      Dan zullen we zoiets hebben als dit:

      Bewaar deze als 'Content-title.png' in 'Img' map.

      Laten we nu de middelen maken die de navigatie nodig heeft. We hebben twee navigatiesets en een witte doos nodig.

      De witte doos is eenvoudig. Maak gewoon een afgeronde rechthoek van ongeveer 98px x 58px en schilder deze met wit. Zorg ervoor dat de achtergrond transparant is.

      Bewaar deze als 'White.jpg' in 'Img' map.

      Voor het navigatie-item opent u uw Photoshop en maakt u een 490px x 58px-document.
      Maak een afgeronde rechthoek met ongeveer 98px x 58px en plaats wat tekst erin. We hebben twee exemplaren van elke tekst nodig.
      Ik heb een beetje slagschaduw op elke tekst toegepast, dit is natuurlijk optioneel. Je kunt je eigen kleuren kiezen om hier te plaatsen.

      Dupliceer nu eenvoudig deze laag langs de horizontale lijn. Pas verschillende kleuren en tekst toe.

      Bewaar deze als 'Nav.jpg' in 'Img' map.

      Tot slot, voor de achtergrondstreep heb ik eenvoudig een online tool gebruikt, de Stripe Generator. De uitvoer ziet er als volgt uit:

      Je kunt mijn instellingen hier bekijken.
      Natuurlijk kunt u de streep zelf gewoon in Photoshop maken, maar waarom zou u in plaats daarvan geen handige kleine webtool gebruiken :-)

      Stap 3: HTML-code

      Laten we nu onze HTML noteren.

         slick geanimeerd menu           
      huis
      wat betreft
      Diensten
      oplossingen
      contact

      Dit is volgens veel van onze gameplan uitgelegd in Stap 1.

      Ik heb een koppeling toegevoegd aan een 'main.css'-bestand dat nog moet worden aangemaakt en
      Ik heb ook enkele verwijzingen toegevoegd naar enkele Javascript-bestanden. Omdat elk navigatie-item uniek is, heb ik elk item een ​​ID gegeven.
      We zullen nog steeds een gemeenschappelijke stijl nodig hebben voor elk van de menu-items, dit zal het ons gemakkelijk maken om de stijl in latere stadia te beheren.

      We hebben ook een wit vak boven elk navigatie-item weergegeven, wanneer we over het menu zweven of een menu-item wordt geselecteerd, dus we hebben een ander item nodig

      container daarvoor. De uiteindelijke HTML ziet er als volgt uit:

         slick geanimeerd menu       
      huis
      wat betreft
      Diensten
      oplossingen
      contact

      Bewaar deze als 'Index.html'. Tot nu toe hebben we dit als onze HTML-pagina:

      Stap 4: CSS

      Laten we wat basisstijl toepassen op de webpagina. We beginnen met het definiëren van de achtergrond en het toevoegen van een koptekstgebied.

      body background: url (... /img/body-bkg.jpg) herhaal scroll; marge: 0; opvulling: 0;  .containe r margin: 0pt auto; width: 950px;  #header background: url (... /img/hdr-bkg.jpg) repeat-x scroll; Hoogte: 181px; 

      Bewaar deze als 'Main.css' in 'Css' map.

      Nu hebben we iets dat eruit ziet als:

      Laten we nu stijl aan elk van de menu-items toevoegen. Onthoud dat we het witte vak bovenaan elk menu-item willen hebben,
      dus de positie moet op absoluut zijn ingesteld. Voeg de volgende stijl toe in ons 'main.css'-bestand.

      #navigation height: 60px;  #home, #home div, #about, #about div, #services, #services div, #solutions, #solutions div, #contact, #contact div height: 80px; positie: absoluut; width: 97px; float: left;  #home, #about, #services, #solutions, #contact background-image: url (... /img/nav.jpg); achtergrond-bijlage: scroll; achtergrondherhaling: geen herhaling; top: 171px;  #home background-position: 0px -25px; margin-left: 6px;  #about background-position: -98px -25px; margin-left: 105px;  #services background-position: -196px -25px; margin-left: 204px;  #solutions background-position: -294px -25px; margin-left: 303px;  #contact background-position: -392px -25px; margin-left: 402px;  #home div, #about div, #services div, #solutions div, #contact div background-image: url (... /img/white.jpg); achtergrond-bijlage: scroll; achtergrondherhaling: geen herhaling; achtergrond-positie: 0px -60px; 

      Nu hebben we :

      Eén probleem: de koppeling wordt boven aan de menu-items weergegeven. Laten we deze met een groot tekstinkeping verwijderen, waardoor deze effectief van het scherm wordt verwijderd.
      Voeg dit toe aan onze stylesheet.

      .pri-nav a display: block; text-decoration: none; text-indent: -30000px; 

      Nu ziet het er zo uit:

      Er is nog steeds een probleem. We willen dat het navigatiemenu wordt weergegeven onder de koptekst. We kunnen dat bereiken door onze headerstijl aan te passen.

      #header background: url (... /img/hdr-bkg.jpg) repeat-x scroll; Hoogte: 181px; positie: absoluut; z-index: 100; / * zorg ervoor dat de header boven het navigatiegebied is * / top: 0px; left: 0px; Breedte: 100%; 

      Omdat we een PNG-bestand met transparantie hebben gebruikt, zou dit er als volgt uit moeten zien:

      Perfect! Laten we de inhoud toevoegen zodat we ons animatiescript kunnen openen.

      .inhoud margin-top: 160px;  # content-title background: url (... /img/content.jpg) no-repeat scroll; Hoogte: 323px; positie: absoluut; Breedte: 100%; 

      Stap 5: Animatiescript

      Laten we eerst het nieuwste jQuery-script downloaden en in de 'Js' map.

      De animatie is in feite een manipulatie van de achtergrondpositiestijl.
      Jammer genoeg heeft jQuery fouten bij het animeren van de achtergrondpositiestijl. Maar maak je geen zorgen! Alexander Farkas heeft een plug-in gemaakt die dit probleem oplost.
      Download het bestand en hernoem het naar jquery-bp.js en sla het op in de 'Js' map.

      Er is iets dat we moeten begrijpen voordat we verder gaan. Ik citeer uit de plugin-documentatie:

      Vanwege sommige browser bugs (zoals Firefox, moet je je (initiële) achtergrond-positie inline instellen:


      - Natuurlijk kunt u dit ook met JavaScript (jQuery) bereiken:
      $ ('# background'). css (backgroundPosition: '10px 20px');

      Oké nu dat we dat begrijpen, laten we beginnen. We zullen de achtergrondstijl van de achtergrond instellen voor elk item in het begin van ons script.

      // id voor elk van onze menu-items var nav = ['#home', '#about', '#services', '#solutions', '#contact']; $ (document) .ready (function () setBkgPos ();); function setBkgPos () for (i = 0; i < nav.length; i++ ) $(nav[i]).css(backgroundPosition: i*(-98) + 'px -25px'); $(nav[i] + ' div').css( backgroundPosition: '0px -60px');  

      Bewaar deze als 'Navigation.js' in 'Js' map.

      Nu zullen we 3 evenementen aan elk van de menu-items binden. We kunnen dit doen door de bindfunctie aan te roepen.

      $ (document) .ready (function () setBkgPos (); // bindt de gebeurtenis aan functie hier voor (i = 0; i < nav.length; i++ )  $(nav[i]).bind( 'mouseover', mMouseOver ); $(nav[i]).bind( 'mouseout', mMouseOut ); $(nav[i]).bind( 'click', mClick );  );

      Wanneer een gebruiker over het navigatie-item zweeft, roept ons script de functie 'mMouseOver'.
      Wanneer de gebruiker uit het navigatie-item zweeft, roept ons script de functie 'mMouseOut'.
      En wanneer de gebruiker op het navigatie-item klikt, zal ons script de 'mClick'-functie oproepen.

      Stap 5.1: Muis over

      Laten we een "storyboard" maken voor onze muis over animatie.

      Op 'Mouse Over':

      • Wijzig het beeld van het navigatiemenu (gloeien) en verander de cursor in wijzer.
      • De navigatie gaat een beetje omhoog.
      • De witte doos gaat naar beneden.
      • Het witte vak en het navigatiemenu zullen beide naar beneden gaan.
      • Het navigatiemenu en het witte vak bewegen naar de uiteindelijke positie.
      • En verander het beeld van het navigatiemenu naar de oorspronkelijke staat.

      Oké laten we deze functies toevoegen onder het vorige script:

      functie _getHPos (id) voor (i = 0; i < nav.length; i++ ) if ( '#' + id == nav[i] ) return i*(-98);   return 0;  function mMouseOver(e)  $(this) // stop any animation that took place before this .stop() // step 1. change the image file and change the cursor .css(backgroundImage: 'url('+site_url+'img/nav-over.jpg)',cursor: 'pointer') // step.2 move up the navigation item a bit .animate( backgroundPosition:'(' + _getHPos( this.id ) +'px -30px',"fast", // this section will be executed after the step.2 is done function() $(this) .children() // step. 3 move the white box down .animate(backgroundPosition:'(0px -40px)',20) // step 4. move the white box down .animate(backgroundPosition:'(0px -20px)',"fast"); $(this) // step 4. move the navigation item down .animate(backgroundPosition:'(' + _getHPos( this.id ) +'px 50px)',"fast") // step 5. move the navigation item to its final position .animate(backgroundPosition:'(' + _getHPos( this.id ) +'px 25px)',"fast"); // store the parent element id for later usage var parent = this; $(this) .children() // step 5. move the white box to its final position .animate( backgroundPosition:'(0px -45px)',"fast", // this section will be executed after the step.2 is done function() // step.6 change the image to its original image $(parent).css(backgroundImage: 'url(img/nav.jpg)'); ); ); 

      Ik moet hier verschillende dingen uitleggen:

      1. De _getHPos wordt gebruikt om de horizontale achtergrondpositie-navigatie voor elk item aan te passen.
        De achtergrond van het 'Beginpunt' start bijvoorbeeld vanaf 0, de horizontale positie 'Over' begint bij -98px, enzovoort.
      2. Merk ook op dat we vroeg in de functie de 'stop'-functie gebruiken. We doen dit om ervoor te zorgen welke animatie werd uitgevoerd voordat de 'muis over' gebeurtenis is gestopt.
        Waarom? We zullen later nog een animatie toevoegen voor de 'mouse out'-gebeurtenis.
        Laten we nu aannemen dat de gebruiker boven een item zweeft en dan de muisaanwijzer snel ergens anders heen en weer beweegt en snel over hetzelfde item beweegt..
        Als we de animatie niet vóór elke gebeurtenis stoppen, treedt er vertraging op omdat een deel van de animatie in de wachtrij staat of, nog erger, de animatie inconsistent wordt en de gebruiker irriteert.

      Stap 5.2: Muis eruit

      Dat is nu gebeurd. Laten we een "storyboard" maken voor het evenement 'mouse out'

      On 'Mouse Out':

      • Verplaats het navigatie-item naar beneden.
      • Verplaats het witte vak naar beneden.
      • Verplaats de navigatie omhoog.
      • Verplaats het navigatie-item naar de oorspronkelijke positie.
      • Verplaats de witte doos naar zijn oorspronkelijke positie (onzichtbaar).
      • Zet de cursor terug op normaal.

      De code:

      function mMouseOut (e) $ (this) // stop alle animatie die hiervoor plaatsvond. stop () // stap 1 navigeer item navigeer .anim (backgroundPosition: '(' + _getHPos (this.id) + 'px 40px)', "fast", // deze sectie zal worden uitgevoerd nadat stap 1 is gedaan, functie () // stap.2 wit vakje verplaatsen erg snel $ (this) .children (). animeren ( backgroundPosition: '(0px 70px)', "fast"); // step 3. verplaats het navigatie-item omhoog $ (this) .animate (backgroundPosition: '(' + _getHPos (this.id) + 'px -40px ) ', "fast", // deze sectie wordt uitgevoerd nadat stap 3 klaar is function () // stap 4. verplaats navigatie-item naar zijn oorspronkelijke positie $ (this) .animate (backgroundPosition:' ( '+ _getHPos (this.id) +' px -25px) ', "fast", // deze sectie wordt uitgevoerd nadat stap 4 klaar is function () // wit vak naar de oorspronkelijke positie verplaatsen, klaar voor volgende animatie $ (this) .children (). css (backgroundPosition: '0px -60px');))) .css (backgroundImage: 'url (img / nav.jpg)', cursor: ");

      Stap 5.3: Klik op

      Bijna daar! Nu moeten we behandelen wanneer een gebruiker op het navigatie-item klikt.

      function mClick (e) location.href = this.id; 

      Natuurlijk kunt u wijzen naar elke locatie die u hier ziet passen. Deze specifieke functie zal je browser naar [current_url] / [navigation_id] leiden, dus voor 'home' is het '[current_url] / home', voor 'about' is dit '[current_url] / about' enzovoort.

      Stap 5.4: Huidige pagina-indicator

      Natuurlijk hebben we een indicator nodig als we al op een pagina zijn. Daarvoor hebben we een andere CSS-klasse nodig.
      We zullen die klasse 'actief' noemen. Als we bijvoorbeeld nu 'thuis' zijn, wordt het HTML-bestand:

      huis

      Of als we 'ongeveer' zijn, wordt het:

      wat betreft

      enzovoorts.

      Dus nu het idee is dat nadat een pagina is geladen, ons script zal controleren om te zien welk navigatie-item de 'actieve' klasse heeft.
      Vervolgens passen we een animatie-effect toe. En we moeten ervoor zorgen dat eventuele andere gebeurtenissen ('mouseover', 'mouseout', 'klik') geen animatie-effect op dit 'actieve' item veroorzaken.

      Daarvoor moeten we onze code een beetje veranderen. Hier is de volledige code na de wijzigingen:

      var site_url = "; var nav = ['#home', '#about', '#services', '#solutions', '#contact']; $ (document) .ready (function () setBkgPos (); voor (i = 0; i < nav.length; i++ )  $(nav[i]).bind( 'mouseover', mMouseOver ); $(nav[i]).bind( 'mouseout', mMouseOut ); $(nav[i]).bind( 'click', mClick );  for ( i = 0; i < nav.length; i++ )  // element with 'active' class will start animation if ( $(nav[i]).get(0).className.indexOf('active') >= 0) $ (nav [i]) .animation (backgroundPosition: '(' + _getHPos (nav [i]) + 'px -30px', "fast", function () $ (this). children () .animation (backgroundPosition: '(0px -40px)', 20) .animation (backgroundPosition: '(0px -20px)', "fast"); $ (this) .animate (backgroundPosition: '(' + _getHPos (nav [i]) + 'px 50px)', "fast") .anim (backgroundPosition: '(' + _getHPos (nav [i]) + 'px 25px)', "snel "); var parent = this; $ (this) .children () .animation (backgroundPosition: '(0px -45px)'," fast ", function () $ (parent) .animate (backgroundPosition: ' ('+ _getHPos (parent.id) +' px 25px) ', "fast"); $ (parent) .css (backgroundImage:' url (img / nav.jpg) '););) ; pauze;);

      Afgewerkt!

      En daarmee hebben we ons hele handige, kleine menu.

      Download een ZIP van de site

      Bekijk een demo!