En moderne, attraktiv måte å plassere mye innhold på, er å bruke et tabs system. Denne opplæringen vil vise deg hvordan du lager et sexy, animert tabssystem komplett med CSS sprites, informasjonskapsler og animert faneveksling.
Det er noen forutsetninger og bemerker at vi går inn i dette systemet med:
Opplæringen tar også utgangspunkt i grunnleggende kunnskap om javascript. En liten bit av MooTools eller JavaScript-rammeopplevelse vil hjelpe.
Så hvordan går dette fantastiske systemet på jobb? Her er den grunnleggende oversikten:
Systemet selv er ganske bulletproof. Hvis brukeren ikke tillater informasjonskapsler, vil startfanen for hver liste alltid være 0.
Hvis JavaScript-støtte ikke er til stede, vil ikke fanene vises på skjermen som vi viser: ingen; dem i utgangspunktet.
HTML for å oppnå tabulasjonssystemet og tilhørende innholdsobjekter er utrolig enkelt i struktur.
- Fane 1
- Tab 2
- Tab 3
- Tab 4
- Dette er innholdet for kategorien 1.
- Dette er innholdet for kategori 2.
- Dette er innholdet for kategori 3.
- Dette er innholdet for fan 4.
Vi vil modifisere ovennevnte HTML med PHP senere i denne opplæringen for å skape et mer robust system.
Som med hvilken som helst CSS og HTML-kombinasjon, kan du stile kategoriene og innholdsobjektene dine, men du vil.
Jeg har valgt å bruke Facebook-stil CSS sprites for mine eksempel faner.
Innse at du vil utforme følgende elementer på en bestemt måte slik at systemet fungerer:
/ * tabsstruktur * / .tab-container bredde: 320px; bakgrunn: #eee; polstring: 5px 10px; ul.tabs listestil-type: none; margin: 0; padding: 0; ul.tabs li float: left; margin: 10px 5px 0 0; ul.tabs li a padding: 5px 10px; grense: 1px solid #ddd; font-vekt: bold; bakgrunn: url (tab-sprite.jpg) 0 0 repeat-x; color: # 000; text-decoration: none; ul.tabs li a.active border-color: # 028433; bakgrunnsposisjon: 0 -96px; farge: #fff; / * sprite! bakgrunnsposisjon swap * / ul.tabs li a.active:hover text-decoration: none; markøren: default; ul.tabs li: hover text-decoration: understreke; ul.tabs-innhold margin: 10px 0 0 0; padding: 0; ul.tabs-innhold li høyde: 0; flow: hidden; margin: 0; padding: 0; / * fjerner flyter * / div.clear clear: both; / * dvs. fikser * / * html ul.tabs-innhold li float: left; / * ie6 * / * + html ul.tabs-innhold li bredde: 99%; float: venstre; / * ie7 * /
Vær oppmerksom på at vi må implementere noen få Internet Explorer-spesifikke reparasjoner; stygg, men nødvendig.
En av de store fordelene ved MooTools er det kraftige klassesystemet.
MooTools klasser tillater fleksible, organiserte og utvidbare funksjoner.
Vår MooTools klasse vil bli kalt "TabSet." Siden TabSet-klassen utfører mange handlinger,
Vi kan bryte ned hver del av klassen.
Den første linjen gir alltid klassen et navn:
/ * gi klassen et navn * / var TabSet = ny klasse (
Deretter må vi opprette et objekt som vil holde våre klasses alternativer:
Alternativer: // standard tabalternativer activeClass: 'active', // css class cookieName: ", // ingen navn betyr ingen cookie cookieOptions: // alternativer for informasjonskapsel, hvis cookie er ønsket varighet: 30, // 30 dager sti: '/', startIndex: 0 // start med dette elementet hvis ingen informasjonskapsel eller aktiv,
Våre alternativer tillater oss å definere:
Med bare tre alternativer i klassen, vil TabSet bli vurdert som en relativt enkel klasse.
Deretter implementerer vi to alternativer og hendelser:
Utførelser: [Alternativer, Hendelser],
Implementeringsalternativer og hendelser vil tillate oss å håndtere gitt alternativer og
brann tilpassede last og endre hendelser på våre lister hvor som helst i klassen.
Deretter definerer vi "initialiser" -metoden som kjører ved opprettelsen av hver forekomst av klassen:
initialiser: funksjon (faner, innhold, alternativer) // håndtere argumenter this.setOptions (options); // bland de valgte alternativene med standardvalgene this.tabs = $$ (tabs); // lagre de angitte kategoriene i klassen this.contents = $$ (innhold); // lagre det angitte innholdet i klassen // bestemme den aktive fanen var aktiv = (Cookie.read (this.options.cookieName) || this.options.startIndex); // bestemme indeksen som skal være aktiv i utgangspunktet this.activeTab = this.tabs [aktiv] .addClass (this.options.activeClass); // nå identifiser den "aktive" kategorien this.activeContent = this.contents [aktiv] .setStyle ('høyde', 'auto'); // identifiser det "aktive" innholdet // kjør hver kategori / innholdskombinasjon gjennom "processItem" -metoden som vi vil se under this.tabs.each (funksjon (tab, i) this.processItem (tab, this.contents [i], i);, dette); // faner er klare - brann lastbegivenheten! this.fireEvent ( 'last'); ,
Neste kommer arbeidshorse-metoden til vår TabSet-klasse: processItem:
processItem: funksjon (tab, innhold, i) var contentHeight = content.getScrollSize (). y; // legg til et klikkhendelse til fanebladet.addEvent ('klikk', funksjon () // hvis det ikke er den aktive kategorien hvis (tab! = this.activeTab) // stopp hvis (e) e.stop ( ); // fjerne den aktive klassen fra den aktive kategorien this.activeTab.removeClass (this.options.activeClass); // gjør den klikket kategorien den aktive kategorien (this.activeTab = tab) .addClass (this.options.activeClass) ; // mellom den gamle kategorien innhold opp // mellom det nye innholdet ned this.activeContent.set ('tween', onComplete: function () this.activeContent = content.fade ('in'). set ('tween ', onComplete: $ empty). tween (' høyde ', contentHeight); / / brann tabevarianthendelsen this.fireEvent (' change ', [tab, innhold]); .bind (dette)). setStyles (høyde: contentHeight, overflow: 'hidden'). fade ('out'). tween ('height', 0); // lagre indeksen til informasjonskapsel om (dette.options.cookieName) Cookie.write this.options.cookieName, i); .bind (dette)); );
Her er den grunnleggende oversikten over hva prosessemetoden gjør:
Og nå en prøvebruk av vår klasse:
window.addEvent ('domready', funksjon () var tabset = ny TabSet ($$ ('# tabs1 li a'), $$ ('# innhold1 li'), cookieName: 'demo-list'); );
Vi gir vår eksempel tabellen LI A og innholdet LI. Vi gir også valgfrie argumentet. Det er så enkelt det er å bruke denne klassen! Her er den komplette klassen med bruk:
/ * klasse * / var TabSet = ny klasse (alternativer: activeClass: 'aktiv', // css klasse cookieName: ", cookieOptions: varighet: 30, // 30 dager sti: '/', startIndex: 0 // start med dette elementet hvis ingen informasjonskapsel eller aktiv, Utførelser: [Alternativer, Hendelser], initialiser: funksjon (faner, innhold, alternativer) // håndter argumenter this.setOptions (options); this.tabs = $$ faner); this.contents = $$ (innhold); // bestemme "aktiv" -fanen var aktiv = (Cookie.read (this.options.cookieName) || this.options.startIndex); this.activeTab = dette. tabs [aktiv] .addClass (this.options.activeClass); this.activeContent = this.contents [aktiv] .setStyle ('høyde', 'auto'); // behandle hver kategori og innhold this.tabs.each (funksjon (tab, i) this.processItem (tab, this.contents [i], i);, this); // tabs er klare - last det! this.fireEvent ('load');, processItem: funksjon (tab, innhold, i) var contentHeight = content.getScrollSize (). y; // legg til et klikkhendelse i kategorien tab.addEvent ('klikk', funksjon (e) // stopp! hvis (e) e.stop (); // hvis det ikke er det aktiv tab hvis (tab! = this.activeTab) // fjern den aktive klassen fra den aktive kategorien this.activeTab.removeClass (this.options.activeClass); // gjør det klikket fanebladet den aktive kategorien (this.activeTab = tab) .addClass (this.options.activeClass); // mellom den gamle kategorien innhold opp // mellom det nye innholdet ned this.activeContent.set ('tween', onComplete: function () this.activeContent = content.fade ('in'). set ('tween' , onComplete: $ empty). tween ('høyde', contentHeight); / brann tabevarianthendelsen this.fireEvent ('change', [tab, innhold]); bind (dette)). setStyles (høyde: contentHeight, overflow: 'hidden'). fade ('out'). tween ('høyde', 0); // lagre indeksen til cookie hvis (dette.options.cookieName) Cookie.write (this.options.cookieName, jeg, this.options.cookieOptions); .bind (dette)); ); / * bruk * / window.addEvent ('load', funksjon () var tabset = ny TabSet ($$ ('# tabs1 li a'), $$ ('# innhold1 li'), cookieName: 'demo- liste '););
Husk hvordan jeg sa at vi ville endre vår opprinnelige HTML med PHP? Nå er klokken. Siden vi kan
ha et informasjonskapselsett for TabSet, vi bør forsøke å oppdage det når vi sender ut fanen HTML.
Hvorfor? Fordi vi vil at kategoriene skal lastes inn jevnt. Vi ønsker også å imøtekomme for brukere som ikke har JavaScript eller cookies aktivert.
Uten dette PHP kan du merke et svakt "hopp" i det aktive innholdsområdet.
- " > Fane 1
- " > Tab 2
- " > Fane 3
- " > Tab 4
- > Dette er innholdet for kategorien 1. Dette er innholdet for kategorien 1. Dette er innholdet for kategorien 1. Dette er innholdet for kategorien 1. Dette er innholdet for kategorien 1. Dette er innholdet for kategori 1. Dette er innholdet for kategorien 1. Dette er innholdet for kategori 1.
- > Dette er innholdet for kategorien 2. Dette er innholdet for kategori 2. Dette er innholdet for kategorien 2. Dette er innholdet for kategori 2. Dette er innholdet for kategori 2. Dette er innholdet for kategori 2. Dette er innholdet for tabulator 2. Dette er innholdet for kategori 2.
- > Dette er innholdet til tabulator 3. Dette er innholdet til tabulator 3. Dette er innholdet for tabulator 3. Dette er innholdet til tabulator 3. Dette er innholdet for tabulator 3. Dette er innholdet for tabulator 3. Dette er innholdet for tabulator 3. Dette er innholdet til fanen 3.
- > Dette er innholdet for kategorien 4. Dette er innholdet til kategorien 4. Dette er innholdet for kategorien 4. Dette er innholdet for kategorien 4. Dette er innholdet for kategorien 4. Dette er innholdet for kategorien 4. Dette er innholdet for tabulator 4. Dette er innholdet for kategorien 4.
Noen brukere aktiverer ikke JavaScript eller informasjonskapsler for sikkerhetsformål. Vi vil fortsatt at systemet vårt skal fungere for dem. Hvis du husker fra forrige blokk av kode,
Vi bruker koblinger med en spørringsnøkkel for "demo-liste" for å angi en endring i kategorien. Følgende blokk med PHP øverst på siden (før noen utdata) vil
hjelp oss til å endre informasjonskapselverdien til den forespurte fanen.
Vær oppmerksom på at vi bare oppdaterer siden hvis vi kan bekrefte at informasjonskapsel er angitt. Hvis informasjonskapselen ikke er angitt, har brukeren deaktivert sine informasjonskapsler.
Her er et raskt sammendrag av fordelene med MooTools TabSet-klassen:
Jeg har alltid forsøkt å kode en ønsket MooTools-funksjonalitet "inline" før du slår den inn i en klasse. Her er inline MooTools JavaScript-koden:
$$ ('ul.tabs'). hver (funksjon (tabList) // få innholdslisten var tabContentList = tabList.getNext ('ul.tabs-innhold'), // få navnet på informasjonskapselen, som er "tittel" -attributtet til tabellen liste cookie = 'demo-list', // start fanen index startIndex = Cookie.read (cookie) || 0, // få de aktuelle fanene LI elementer tabs = tabList.set (' tittel ','). getElements ('li'), // få innholdet LI-elementer lis = tabContentList.getElements ('li'), // kategorien (LI) som for tiden er aktiv activeTab = tabs [startIndex] .addClass ('aktiv'), // innholdet LI som for øyeblikket er aktivt activeContent = lis [startIndex] .setStyle ('høyde', 'auto'); // for hver kategori i denne kategorien / innholdsforholdet ... tabs.each (tab, i) // stopp hvis (e) e.stop (); // beregne det respektive innholdselementets høyde var innhold = lis [i], contentHeight = content.getScrollSize (). y; // legg til klikk hendelse til fanen som ... tab.addEvent ('klikk', funksjon () // hvis det ikke er den aktuelt aktiverte kategorien ... hvis (tab! = aktivTab) // legg til og fjern den aktive klassen fra gammel vs ny kategori activeTab.removeClass ('aktiv'); (activeTab = tab) .addClass ('aktiv'); // start tork opp, tørk ned effekt ActiveContent.set ('tween', onComplete: function () activeContent = content.fade ('in'). set ('tween', onComplete: $ empty). tween ('height', contentHeight);). setStyles (høyde: contentHeight, overflow: 'hidden'). fade ('out'). tween ('høyde', '0'); // skriv til cookie Cookie.write (cookie, i); // fin! ); ); // brannklikk hendelsen activeTab.fireEvent ('klikk'); );
Legg merke til at alle "var" -klæringene øverst enten blir argumenter eller alternativer for klassen. Overgangen fra inline MooTools JavaScript til en klasse er ekstremt enkel!
Har du flere ideer til denne klassen? Husk å dele dem i kommentarene nedenfor!
Visste du at du kan tjene opp til $ 600 for å skrive en PLUS-opplæring og / eller screencast for oss? Vi leter etter dybde og velskrevne opplæringsprogrammer om HTML, CSS, PHP og JavaScript. Hvis du er i stand til å kontakte Jeffrey på [email protected].
Vær oppmerksom på at faktisk kompensasjon vil være avhengig av kvaliteten på den endelige opplæringen og screencast.