În acest tutorial, vom crea o bară de navigare care să rămână cu dvs. pe măsură ce vă defilați în jos - și vom arunca, de asemenea, un gimmick sau două în amestec pentru ao lustrui.
"Toată lumea iubește panglicile", spune Chris Coyier atunci când discută despre virtuțile lui :inainte de
și :după
-elemente pseudo. Am văzut aceste panglici stilizate, triunghiulare, care au apărut peste tot pe Internet (un exemplu proeminent fiind pagina de prezentare a paginii Facebook) și, în timp ce ei au un anumit apel, trebuie să recunosc că efectul spațial pe care îl creează nu- Arăți bine la mine.
Panglicile sunt plăcute pentru un motiv, totuși - ei sparge paradigma de proiectare cea mai mare parte pe care suntem obligați în mod tradițional și sunt unul dintre puținele elemente vizuale care o fac într-un mod neclar. Dar, așa cum se spune în vechime, ar trebui să existe mai mult decât o modalitate de a pielea o pisică - deci, în acest tutorial, voi propune un stil vizual alternativ pentru astfel de elemente, pe care le găsesc mult mai natural și estetic plăcut. Sper că îți place și folosești bine!
În acest tutorial, vom folosi unul dintre elementele noi HTML5 nav
etichetă, ca un container pentru o listă orizontală de linkuri. Voi explica pe scurt cum se poate face sa arate destul folosind un pic de CSS.
Cel mai important, vă veți familiariza cu elementele de bază ale pluginului jQuery Waypoints, care va oferi funcționalități avansate: pe măsură ce utilizatorul scroll în jos, bara de navigare se va lipi de partea superioară a ferestrei de vizualizare, precum și schimbarea pentru a indica secțiunea curentă . Ca un pic adăugat, vom folosi un alt plugin, ScrollTo, pentru a oferi o derulare ușoară și o poziționare convenabilă atunci când utilizatorul face clic pe linkurile de navigare.
Sunt sigur că deja cunoașteți diferitele elemente noi introduse cu HTML5. În acest exemplu vom folosi două dintre ele: și
. Vom începe cu următoarele:
O poziție destul de mare.
Lorem ipsum ...
Va trebui să oferim barei de navigare o lățime explicită. Faceți-o 28px mai largă decât ambalajul și împingeți-o în poziție cu o margine negativă stângă. Să mai oferim, de asemenea, niște margini superioare rotunjite de frontieră - * - rază
, precum și unele umpluturi arbitrare.
nav poziție: relativă; lățime: 928px; padding: 2em; margin-stânga: -14px; raza de sus-dreapta-stânga: 14px 7px; raza de sus-dreapta-dreapta: 14px 7px;
Apoi, vom adăuga o listă neordonată de linkuri din bara de navigare și vom seta elementele afișare: inline-block
pentru a le pune pe o singură linie. Nu avem nevoie de gloanțe, așa că vom arunca și noi listă: nu există
în amestec.
nav li afișare: inline-block; listă: nu există;
Până acum, ar trebui să aveți ceva de genul:
Acum, dacă numai CSS ne-a permis să avem mai multe pseudo-elemente (adică,. :: după :: după
), am putea completa cu ușurință marginile rotunjite ale barei de navigație într-un mod curat semantic. Dar nu putem face asta, așa că trebuie să adăugăm două ne-semantice div
s la sfârșitul anului nav
. Dați-le clasele nav stânga
și nav-dreapta
(sau le-ai putea numi ceva imaginativ, ca Castor și Pollux). Sunt de 14px lățime de 14px înălțime și sunt absolut
localizat la 14px de la capătul inferior al nav
.
După cum se vede mai sus, border-radius
familia de proprietăți poate lua două valori pentru fiecare colț. Acestea pot fi, de asemenea, procente ale lățimii elementului, care este destul de util - această abordare permite razei de margine să se adapteze automat la modificările dimensiunilor cutiei.
Micile "umbre" care completează aspectul benzii de navigație sunt create folosind ::după
-elemente pseudo. Lățimea și înălțimea lor, precum și raza lor de graniță, sunt de asemenea stabilite folosind procente.
/ * swap 'left' cu 'right' pentru celelalte două * / .nav-stânga position: absolute; stânga: 0; fund: -14px; lățime: 14px; înălțime: 14px; fundal: # 848a6a; raza de rază de fund - partea stângă - stânga: 100% 50%; .nav-stânga :: după conținut: "; poziția: absolută; dreapta: 0; lățimea: 66%; înălțimea: 66%; fundal: # 000; - raza din stânga-stânga: 100% 50%;
Și am terminat aici!
După ce am scăpat de cea mai mare parte a geometriei imposibile a panglicilor drepte, să continuăm.
Pentru a obține efectul plutitor al antetului, vom folosi un plugin jQuery numit Waypoints, de Caleb Troughton. Singurul său scop este să declanșeze evenimente atunci când utilizatorul avansează la un anumit element. După cum veți vedea, este extrem de simplu, dar oferă o mulțime de flexibilitate - puteți să aruncați o privire la câteva exemple de pe pagina sa de pornire.
Includeți jQuery și Waypoints în pagina dvs. și să începem!
Primul lucru pe care trebuie să-l faceți este să înregistrați un punct prin apelul .punct de drum()
pe un element. Desigur, acest lucru nu face nimic de la sine - va trebui să definiți o funcție de manipulare a evenimentului. Cel mai simplu mod de a face acest lucru este trecerea acestei funcții ca parametru .punct de drum()
.
Încercați acum: adăugați următoarele în scriptul dvs. și vedeți un mesaj care apare în timp ce parcurgeți bara de navigare.
$ (functie () // Atunci cand pagina este incarcata, $ ('nav'). waypoint (// creaza o functie pointpoint () alert ("Waypoint reached";)));
Acum, pentru a obține efectul dorit, lucrurile vor deveni în mod necesar un pic mai complicate. În primul rând, trebuie să închidem bara noastră de navigație într-un container, care va fi punctul nostru real de referință și va servi ca un loc convenabil (mai jos).
În CSS, creați următoarea regulă CSS. (În timp ce sunteți la ea, mutați orice margini verticale nav
ar putea avea de a nav-container
)
.lipicios poziție: fix; top: 0;
Și suntem gata pentru partea bună! Modificați conținutul scriptului dvs. la următoarele:
$ (funcția () // Căutăm DOM în prealabil var nav_container = $ ("nav-container"); var nav = $ ("nav"); nav_container.waypoint nav.toggleClass ("lipicios", direcție == "jos");););
Bine, de unde naiba au făcut toate astea, întreabă pe bună dreptate. Probabil că ați dat seama că atașăm un punct de referință la nav-container
; numai de data asta, o facem diferit. În loc să treacă direct funcția de manipulare la .punct de drum()
, o încapsulăm într-un obiect. Pe cont propriu, acest lucru nu face nici o diferență: ambele sunt modalități complet valabile de a face același lucru. Obiectul pe care îl parcurgem, totuși, poate conține mai multe alte valori ale opțiunilor - astfel încât utilizarea acestuia face mai târziu un cod mai consistent.
Funcția de manipulare pe care am definit-o primește doi parametri: primul este jQuery standard eveniment
obiect, care nu este interesant aici. Cea de-a doua este specifică Punctelor-Way: este un șir a cărui valoare este fie 'jos'
sau 'sus'
în funcție de modul în care utilizatorul a derulat atunci când au atins punctul de parcurs.
Acum, cunoașterea în ce fel merge utilizatorul este un element foarte important de informație, pur și simplu pentru că ne permite să executăm comportamente diferite în ambele direcții. În corpul funcției de manipulare, folosim o variantă relativ puțin cunoscută a jQuery .toggleClass ()
, ceea ce face ca o sintagmă utilă: în această sintaxă, al doilea parametru determină dacă clasa va fi adăugată la elementul țintă sau eliminată din ea. Când utilizatorul scroll în jos, expresia Direcția === „în jos“
evaluează pentru Adevărat
, astfel încât bara noastră de navigare primește lipicios
clasă și se lipeste în partea de sus a ferestrei de vizualizare. De îndată ce utilizatorul revine din nou înapoi, clasa este eliminată din bara de navigare, care se întoarce la locul ei. Încearcă acum.
Tare nu? Cu toate acestea, dacă vă deplasați încet în jos pe punctul de parcurs pe care tocmai l-ați creat, probabil veți observa că, pe măsură ce îl transmiteți, conținutul "sare" puțin, din cauza faptului că bara de navigare este eliminată din fluxul de conținut. Pe langa faptul ca arata foarte neplacuta, un astfel de comportament poate observa o parte din continutul dvs. si poate afecta gradul de utilizare. Din fericire, tot ce trebuie este o reparație simplă - adăugarea următorului cod la funcția de manipulare face ca saltul să dispară.
dacă (direcția == 'jos') nav_container.css ('height': nav.outerHeight ()); altceva nav_container.css ('height': 'auto'));
Ce se întâmplă aici este destul de evident: folosim nav-container
ca substituent, așa cum am menționat mai sus. Când mergem în jos, ne extindem înălțimea, iar conținutul de mai jos rămâne în vigoare. Există o captură, totuși - pentru ca aceasta să funcționeze ca atare, orice margini verticale pe care ați putea dori să le aveți în jurul barei de navigare ar trebui să fie aplicate nav-container
și nu la nav
.
Așa este! Ne-am înființat o bară de navigare fixă, la fel ca multe alte site-uri deja făcute. Show-ul sa terminat, oameni buni ...
… sau este? Ei bine, există încă un truc sau două pe care ați putea dori să le vedeți și care ar putea să vă pună în fața ambalajului. Dacă este cazul, citiți mai departe.
Dacă vă gândiți la asta, există multe cazuri în care declanșarea unui eveniment când un element ajunge la marginea ferestrei de vizualizare a browserului nu este ceea ce doriți să faceți. Din fericire, Waypoints oferă o opțiune convenabilă pentru aceasta: ofset
. Iată cum arată:
nav.waypoint (operator: ..., offset: 50)
ofset
vă permite să creați punctul real de parcurs la o distanță variabilă de la partea de sus a elementului. O valoare pozitivă declanșează punctul de parcurs atunci când vârful elementului este la distanța specificată sub partea superioară a ferestrei de vizualizare, iar o valoare negativă declanșează punctul de parcurs atunci când elementul este cu mult mai sus de partea superioară a ferestrei de vizualizare (adică utilizatorul a derulat bine după el ).
Valoarea offsetului poate fi un număr (reprezentând o sumă fixă de pixeli), un șir care conține un procentaj (interpretat ca procent din înălțimea ferestrei de vizualizare) sau o funcție care returnează un număr de pixeli. Ultimul poate oferi o flexibilitate serioasă și o vom folosi mai târziu. Pentru moment, să rămânem la valori fixe și să vedem la ce sunt bune.
Primul lucru care vine în minte este adăugarea unui spațiu deasupra elementului lipicios. Utilizarea ofset
variabilă, este ușor: pentru un decalaj de 15 pixeli din partea de sus, adăugați ofset: 15px
la .punct de drum()
lui, și schimbare top: 0px
la top: 15px
în .lipicios
Regula CSS.
Dacă designul dvs. îl solicită, un mic gradient de deasupra barei de navigare ar putea fi, de asemenea, o atingere plăcută. Acest lucru este ușor de realizat prin adăugarea unui altul div
în interiorul nav
, și scriind un pic de CSS:
.lipicios .nav-deasupra position: absolute; sus: -15px; stânga: 1em; dreapta: 1em; înălțime: 15px; fundal: gradient liniar (top, rgba (255,255,255,1) 0%, rgba (255,255,255,0) 100%); / * adăugați codul de gradient încrucișat după cum este necesar * /
Acest pic destul de subtil de bomboane ochi ar funcționa frumos în design minimalist.
Un lucru pe care Caleb l-a inclus în Waypoints a fost în măsură să genereze dinamic un punct de referință, astfel:
nav.waypoint (operator: ..., offset: function () return - (nav.outerHeight () + 50);)
Acest lucru ne permite să avem un handler care să se declanșeze atunci când utilizatorul a făcut deja o deplasare de 50px în partea de jos a elementului, fără a fi nevoie să știe înălțimea în avans.
Notă: Astfel de compensări generate de procedură (precum și cele date ca procente) sunt recalculate de fiecare dată când fereastra este redimensionată, se adaugă puncte noi sau se modifică opțiunile punctului. Dacă faci altceva care ar putea afecta pozițiile punctelor de trecere (cum ar fi schimbarea DOM sau aspectul paginii), asigurați-vă că apelați $ .waypoints (Refresh)
după aceea pozițiile care urmează să fie recalculate.
În contextul tutorialului nostru, o utilizare pentru această funcție este glisarea fără probleme a barei de navigare din partea de sus. Fiți pregătiți - următoarea este cea mai mare bucată de cod până acum. Nu ar trebui să existe nimic în care să nu fiți familiarizați, totuși, aici mergeți:
var top_spacing = 15; var waypoint_offset = 50; nav_container.waypoint (handler: funcție (eveniment, direcție) if (direcție == 'jos') nav_container.css ('height': nav.outerHeight ()); stop () .css ("top", -nav.outerHeight ()) .animate ("top": top_spacing) altceva nav_container.css ('height': ' ("top", "top", nav.outerHeight () + waypoint_offset) .animate ("top": " .outerHeight () + waypoint_offset););
Nu e prea ciudat! Este tot destul de standard jQuery tarif: imediat ce adăugăm sau eliminăm lipicios
clasa la nav
, depășim poziția verticală a elementului folosind .css ()
, și apoi .anima()
la ceea ce ar trebui să fie. .Stop()
servește pentru a preveni posibilele erori prin ștergerea coadă de evenimente a jQuery.
Există însă un efect secundar pentru acest lucru, deși, deoarece codul în mod eficient preia poziția verticală a elementului de navigație atunci când este fixată, top: 15px
declarație din CSS. Dacă sunteți parte dintr-un proiect mare, cu oameni separați care lucrează la proiectarea și script-ul front-end, acest lucru ar putea constitui o problemă deoarece este ușor să pierdeți urmărirea unor astfel de hack-uri. Doar pentru a vă spune că există pluginuri - cum ar fi excelentul jQuery.Rule al lui Ariel Flesler, care poate fi folosit pentru a reduce decalajul dintre scripturi și stiluri. Va trebui să decideți singur dacă aveți nevoie de așa ceva.
S-ar putea obține cu siguranță un efect similar cu CSS @keyframes
în schimb, există mult mai puțin sprijin pentru ei (și o mulțime de prefixe de furnizori), sunt mai puțin flexibile, iar animația "sus" ar fi un mare nu-nu. Deoarece nu părăsim pista de îmbunătățire progresivă, nu există nici un motiv să nu rămânem la funcționalitatea robustă a jQuery.
S-ar putea să vă aflați nevoiți să schimbați ce element este evidențiat în timp ce cititorul trece pe lângă diferite secțiuni ale paginii dvs. Cu puncte de traseu, acest lucru este ușor de realizat. Va trebui să adăugați următoarele în scriptul dvs.:
$ (functie () ... // copie de aici ... var secțiuni = $ ('secțiune'); var navig_links = $ ('nav a'); codul handler, offset: '35% '); // ... aici;
De data aceasta folosim o compensare exprimată ca procent din înălțimea ferestrei. Efectiv, aceasta înseamnă că linia imaginară care ne spune scriptului ce secțiune se află în prezent este plasată cu aproximativ o treime din partea de sus a ferestrei de vizualizare - exact despre locul în care spectatorul ar fi privit atunci când citește un text lung. O soluție mai robustă ar putea folosi o funcție pentru a se adapta schimbărilor înălțimii barei de navigație.
Codul pe care îl vom folosi în funcția de handler este cu totul mai puțin explicativ. Aici este:
var active_section; active_section = $ (acest lucru); dacă (direcția === "sus") active_section = active_section.prev (); var activ_link = $ ('nav a [href = "#" + active_section.attr ("id") +' "] '); navigation_links.removeClass ( "selectat"); active_link.addClass ( "selectat");
În primul rând, trebuie să știm ce secțiune este în prezent vizionată. Dacă mergem în jos, atunci secțiunea căreia îi aparține punctul de referință este aceea care devine activă. Deplasarea trecând peste un punct de referință, totuși, înseamnă că este secțiunea anterioară care este adusă în vedere - așa că vom folosi .prev ()
pentru ao selecta. Apoi, eliminăm selectat
din toate legăturile din bara de navigare, înainte de a le aplica la cel al cărui href
atributul corespunde cu id
din secțiunea curentă activă.
Acest lucru funcționează destul de frumos; dacă doriți să mergeți dincolo de adăugarea și eliminarea clasei, este posibil să doriți să căutați un plugin, cum ar fi LavaLamp.
La un moment dat, este posibil să fi observat că făcând clic pe linkurile din bara de navigare plasează partea de sus a secțiunii chiar în partea de sus a ferestrei de vizualizare a browserului. Acest lucru este suficient de contraintuitiv atunci când nimic nu ascunde acea parte a ecranului; acum că avem o bară de navigare acolo, devine o enervare enormă. Aici se află ScrollTo-ul lui Ariel Flesler. Includeți-l în pagină, apoi adăugați următorul cod:
navigare pe linia de comandă (funcția (eveniment)) $ $ .scrollTo ($ (this) .attr ("href"), duration: 200, offset: left: 0, top: 0.15 * .height ()););
(desigur, acel cod merge deasupra ultimei bretele curse!)
Deși există modalități mai bune de a lega o funcție pentru a face clic pe evenimente, vom rămâne la cel mai simplu: .clic()
. .scrollTo ()
metoda este chemată într-un mod care este foarte asemănător .punct de drum()
. Este nevoie de doi parametri - o țintă de defilare și un obiect care conține opțiuni diferite, care, în acest caz, sunt destul de explicative. Link-ul clicat href
atributul funcționează frumos ca o țintă de defilare, iar expresia folosită drept offset de top plasează ținta la 15% din înălțimea ferestrei de vizualizare.
Și se pare că am terminat. Te-am prezentat în plugin-ul mic care este Waypoints și am trecut peste câteva cazuri de utilizare care ar trebui să-ți dea o idee despre diferitele lucruri pe care le-ai putea realiza cu asta. De asemenea, am implementat un comportament mult mai intuitiv de derulare pentru a merge cu navigația noastră. Aruncați unele Ajax în mix și sunteți pe cale de a construi un fel de experiență Web fără sudură, imersivă, care va fi viitorul Web ... ei bine, mai probabil va fi trendy pentru un timp scurt și apoi să devină obișnuit, făcând veteranii web nostalgici despre felul în care lucrurile erau folosite. Dar hei, așa merg lucrurile.
În ceea ce privește panglicile, cel mai mare dezavantaj este că acestea sunt doar o iluzie. Părțile laterale ale panglicii nu merg de fapt în jurul marginilor containerului; ele apar doar în acest fel, care devine destul de evident ca panglica trece peste un element care iese din marginea paginii.
Datorită modului în care funcționează z-indexul, nu pare să existe o modalitate simplă de a rezolva acest conflict, cu excepția faptului că acesta a fost evitat în primul rând. Cu toate acestea, cu o oarecare imaginație, precum și o cunoaștere de bază a jQuery, ați putea crea un mod pentru aceste elemente ieșiți din calea panglicii pe măsură ce se apropie de ei. Făcând acest lucru este mult dincolo de scopul acestui tutorial, deși; speram, voi putea sa-i arat mai devreme sau mai tarziu sub forma unui sfat rapid, fie aici, fie pe Nettuts +. Rămâneți aproape!