Un modo moderno e attraente di mettere un sacco di contenuti in un piccolo spazio è usando un sistema di tabulazioni. Questo tutorial ti mostrerà come creare un sistema di schede animate sexy completo di sprite CSS, cookie e scambio di tabulazioni animate.
Ci sono alcune ipotesi e note che stiamo entrando in questo sistema con:
Il tutorial presuppone anche una conoscenza di base di javascript. Un piccolo frammento di MooTools o esperienza framework JavaScript ti sarà d'aiuto.
Quindi come funzionerà questo fantastico sistema? Ecco la struttura di base:
Il sistema stesso è piuttosto a prova di proiettile. Se l'utente non consente i cookie, la scheda iniziale per ogni elenco sarà sempre 0.
Se il supporto JavaScript non è presente, le schede non verranno visualizzate sullo schermo come mostreremo: nessuna; inizialmente.
L'HTML per realizzare il sistema di schede e gli elementi di contenuto corrispondenti è incredibilmente semplice nella struttura.
- Scheda 1
- Scheda 2
- Scheda 3
- Scheda 4
- Questo è il contenuto della scheda 1.
- Questo è il contenuto per la scheda 2.
- Questo è il contenuto per la scheda 3.
- Questo è il contenuto per la scheda 4.
Modificheremo il suddetto HTML con PHP più avanti in questo tutorial per creare un sistema più robusto.
Come con qualsiasi combinazione di CSS e HTML, puoi modificare le schede e i relativi elementi di contenuto come preferisci.
Ho scelto di utilizzare gli sprite CSS in stile Facebook per le mie schede di esempio.
Renditi conto che vorrai modellare i seguenti elementi in modo specifico in modo che il sistema funzioni:
/ * tabs structure * / .tab-container width: 320px; sfondo: #eee; imbottitura: 5px 10px; ul.tabs list-style-type: none; margin: 0; padding: 0; ul.tabs li float: left; margine: 10px 5px 0 0; ul.tabs li a padding: 5px 10px; border: 1px solid #ddd; font-weight: bold; background: url (tab-sprite.jpg) 0 0 repeat-x; color: # 000; text-decoration: none; ul.tabs li a.active border-color: # 028433; posizione di sfondo: 0 -96px; color: #fff; / * sprite! posizione di sfondo swap * / ul.tabs li a.active:hover text-decoration: none; cursore: predefinito; ul.tabs li: hover text-decoration: underline; ul.tabs-content margin: 10px 0 0 0; padding: 0; ul.tabs-content li height: 0; overflow: hidden; margin: 0; padding: 0; / * cancella floats * / div.clear clear: both; / * ie correzioni * / * html ul.tabs-content li float: left; / * ie6 * / * + html ul.tabs-content li width: 99%; float: sinistra; / * ie7 * /
Si noti che è necessario implementare alcune correzioni specifiche di Internet Explorer; brutto, ma necessario.
Uno dei grandi vantaggi di MooTools è il potente sistema Class.
Le classi di MooTools consentono funzionalità flessibili, organizzate ed estendibili.
La nostra classe MooTools si chiamerà "TabSet". Poiché la classe TabSet esegue molte azioni,
consente di analizzare ogni parte della classe.
La prima riga dà sempre un nome alla classe:
/ * assegna un nome alla classe * / var TabSet = new Class (
Quindi dobbiamo creare un oggetto che possa contenere le opzioni della nostra classe:
opzioni: // opzioni tab predefinite activeClass: 'active', // css class cookieName: ", // nessun nome significa nessun cookie cookieOptions: // opzioni per il cookie, se la durata desiderata del cookie: 30, // 30 giorni percorso: '/', startIndex: 0 // inizia con questo elemento se nessun cookie o attivo,
Le nostre opzioni ci permettono di definire:
Con solo tre opzioni nella classe, TabSet sarebbe considerato una classe relativamente semplice.
Successivamente implementiamo due opzioni ed eventi:
Strumenti: [Opzioni, Eventi],
L'implementazione di opzioni ed eventi ci consentirà di gestire correttamente determinate opzioni e
licenzia gli eventi Load e Change personalizzati sui nostri elenchi ovunque all'interno della classe.
Successivamente definiamo il metodo "initialize" che viene eseguito alla creazione di ogni istanza della classe:
initialize: function (tabs, contents, options) // gestisce gli argomenti this.setOptions (options); // mescola le opzioni date con le opzioni predefinite this.tabs = $$ (tabs); // salva le schede specificate all'interno della classe this.contents = $$ (contents); // salva il dato "contenuto" all'interno della classe // determina la scheda "attiva" var active = (Cookie.read (this.options.cookieName) || this.options.startIndex); // decide l'indice che dovrebbe essere inizialmente attivo this.activeTab = this.tabs [active] .addClass (this.options.activeClass); // ora identifica la scheda "attiva" this.activeContent = this.contents [active] .setStyle ('height', 'auto'); // identifica il contenuto "attivo" // esegue ogni combinazione di schede / contenuto tramite il metodo "processItem" che vedremo sotto this.tabs.each (function (tab, i) this.processItem (tab, this.contents [i], i);, questo); // le schede sono pronte: attiva l'evento di caricamento! this.fireEvent ( 'load'); ,
Poi arriva il metodo workhorse della nostra classe TabSet: processItem:
processItem: function (tab, content, i) var contentHeight = content.getScrollSize (). y; // aggiungi un evento click alla scheda tab.addEvent ('click', function () // se non è la scheda attiva if (tab! = this.activeTab) // stopper if (e) e.stop ( // rimuovere la classe attiva dalla scheda attiva this.activeTab.removeClass (this.options.activeClass); // rendere la scheda cliccata la scheda attiva (this.activeTab = scheda) .addClass (this.options.activeClass) ; // tween il vecchio contenuto della scheda su // tra il nuovo contenuto verso il basso this.activeContent.set ('tween', onComplete: function () this.activeContent = content.fade ('in'). set ('interpolazione ', onComplete: $ empty). tween (' height ', contentHeight); // attiva l'evento di modifica delle schede this.fireEvent (' change ', [tab, content]); .bind (this)). setStyles (height: contentHeight, overflow: 'hidden'). fade ('out'). tween ('height', 0); // salva l'indice nel cookie if (this.options.cookieName) Cookie.write ( this.options.cookieName, i); .bind (this)); );
Ecco la struttura di base di ciò che fa il metodo processItem:
E ora un esempio di utilizzo della nostra classe:
window.addEvent ('domready', function () var tabset = new TabSet ($$ ('# tabs1 li a'), $$ ('# contents1 li'), cookieName: 'demo-list'); );
Forniamo alla nostra istanza la scheda LI A e il contenuto LI's. Forniamo anche l'argomento delle opzioni opzionali. È così facile usare questa lezione! Ecco la lezione completa con l'utilizzo:
/ * class * / var TabSet = new Class (opzioni: activeClass: 'active', // css class cookieName: ", cookieOptions: durata: 30, // 30 giorni percorso: '/', startIndex: 0 // inizia con questo elemento se nessun cookie o attivo, Implementa: [Opzioni, Eventi], inizializza: funzione (schede, contenuto, opzioni) // gestisce gli argomenti this.setOptions (opzioni); this.tabs = $$ ( schede); this.contents = $$ (contenuto); // determina la scheda "attiva" var active = (Cookie.read (this.options.cookieName) || this.options.startIndex); this.activeTab = this. schede [attivo] .addClass (this.options.activeClass); this.activeContent = this.contents [active] .setStyle ('height', 'auto'); // processa ogni scheda e contenuto this.tabs.each (function (tab, i) this.processItem (tab, this.contents [i], i);, this); // tabs sono pronti - caricalo! this.fireEvent ('load');, processItem: funzione (scheda, contenuto, i) var contentHeight = content.getScrollSize (). y; // aggiunge un evento click alla scheda tab.addEvent ('clic', funzione (e) // stop! if (e) e.stop (); // se non è il scheda attiva se (tab! = this.activeTab) // rimuove la classe attiva dalla scheda attiva this.activeTab.removeClass (this.options.activeClass); // rendere la scheda cliccata la scheda attiva (this.activeTab = tab) .addClass (this.options.activeClass); // tween il vecchio contenuto della scheda su // nell'interpolazione del nuovo contenuto verso il basso this.activeContent.set ('tween', onComplete: function () this.activeContent = content.fade ('in'). set ('tween' , onComplete: $ vuoto). tween ('height', contentHeight); // attiva l'evento di modifica delle schede this.fireEvent ('change', [tab, content]); .bind (this)). setStyles (height: contentHeight, overflow: 'hidden'). fade ('out'). tween ('height', 0); // salva l'indice in cookie if (this.options.cookieName) Cookie.write (this.options.cookieName, i, this.options.cookieOptions); .bind (this)); ); / * usage * / window.addEvent ('load', function () var tabset = new TabSet ($$ ('# tabs1 li a'), $$ ('# contents1 li'), cookieName: 'demo- elenco' ); );
Ricorda come ho detto che avremmo modificato il nostro HTML originale con PHP? Adesso è il momento. Da quando noi potrebbe
avere un set di cookie per il nostro TabSet, dovremmo cercare di rilevarlo quando emettiamo la linguetta HTML.
Perché? Perché vogliamo che le schede vengano caricate senza problemi. Vogliamo anche ospitare utenti che non hanno JavaScript o cookie abilitati.
Senza questo PHP, potresti notare un leggero "salto" nell'area del contenuto attivo.
- " > Scheda 1
- " > Scheda 2
- " > Scheda 3
- " > Scheda 4
- > Questo è il contenuto della scheda 1. Questo è il contenuto della scheda 1. Questo è il contenuto della scheda 1. Questo è il contenuto della scheda 1. Questo è il contenuto della scheda 1. Questo è il contenuto della scheda 1. Questo è il contenuto della scheda 1. Questo è il contenuto della scheda 1.
- > Questo è il contenuto della scheda 2. Questo è il contenuto della scheda 2. Questo è il contenuto della scheda 2. Questo è il contenuto della scheda 2. Questo è il contenuto della scheda 2. Questo è il contenuto della scheda 2. Questo è il contenuto della scheda 2. Questo è il contenuto della scheda 2.
- > Questo è il contenuto della scheda 3. Questo è il contenuto della scheda 3. Questo è il contenuto della scheda 3. Questo è il contenuto della scheda 3. Questo è il contenuto della scheda 3. Questo è il contenuto della scheda 3. Questo è il contenuto della scheda 3. Questo è il contenuto della scheda 3.
- > Questo è il contenuto della scheda 4. Questo è il contenuto della scheda 4. Questo è il contenuto della scheda 4. Questo è il contenuto della scheda 4. Questo è il contenuto della scheda 4. Questo è il contenuto della scheda 4. Questo è il contenuto per la scheda 4. Questo è il contenuto per la scheda 4.
Alcuni utenti non abilitano JavaScript o cookie per motivi di sicurezza. Vogliamo comunque che il nostro sistema funzioni per loro. Se ricordi dal precedente blocco di codice,
utilizziamo i collegamenti con una chiave di querystring di "elenco-demo" per indicare una modifica nella scheda. Il seguente blocco di PHP nella parte superiore della pagina (prima di qualsiasi output) lo farà
aiutaci a cambiare il valore del cookie nella scheda richiesta.
Nota che aggiorniamo la pagina solo se possiamo verificare che il cookie sia stato impostato. Se il cookie non è stato impostato, l'utente ha disabilitato i suoi cookie.
Ecco un breve riepilogo dei vantaggi della classe TabSet di MooTools:
Ho sempre sostenuto la codifica di una funzionalità MooTools desiderata "in linea" prima di trasformarla in una classe. Ecco il codice JavaScript MooTools in linea:
$$ ('ul.tabs'). each (function (tabList) // ottiene la lista dei contenuti var tabContentList = tabList.getNext ('ul.tabs-content'), // ottiene il nome del cookie, che è l'attributo "titolo" dell'elenco delle schede cookie = "elenco-demo", // l'indice della scheda iniziale startIndex = Cookie.read (cookie) || 0, // ottiene la scheda effettiva tab items LI = tabList.set (' title ', "). getElements (' li '), // ottiene il contenuto Elementi LI lis = tabContentList.getElements (' li '), // la scheda (LI) attualmente attiva activeTab = tabs [startIndex] .addClass ('attivo'), // il contenuto LI attualmente attivo activeContent = lis [startIndex] .setStyle ('height', 'auto'); // per ogni scheda all'interno di questa tab / relazione del contenuto ... tabs.each (funzione (tab, i) // stopper if (e) e.stop (); // calcola l'altezza dell'elemento di contenuto rispettivo var content = lis [i], contentHeight = content.getScrollSize (). y; // aggiungi il clic evento alla scheda che ... tab.addEvent ('click', function () // se non è la scheda attualmente attivata ... if (tab! = activeTab) // aggiungi e rimuovi la classe attiva dalla vecchia alla nuova scheda activeTab.removeClass ('active'); (activeTab = tab) .addClass ('active'); // avvia il wipe up, elimina l'effetto activeContent.set ('tween', onComplete: function () activeContent = content.fade ('in'). set ('tween', onComplete: $ vuoto). interpolazione ('altezza', contentHeight);). setStyles (height: contentHeight, overflow: 'hidden'). fade ('out'). tween ('height', '0'); // scrive sul cookie Cookie.write (cookie, i); // fin! ); ); // fire click event activeTab.fireEvent ('click'); );
Si noti che tutte le istruzioni "var" in alto diventano argomenti o opzioni per la classe. La transizione da MooTools JavaScript in linea a una classe è estremamente semplice!
Hai altre idee per questa classe? Assicurati di condividerli nei commenti qui sotto!
Sapevi che puoi guadagnare fino a $ 600 per scrivere un tutorial PLUS e / o screencast per noi? Stiamo cercando tutorial dettagliati e ben scritti su HTML, CSS, PHP e JavaScript. Se sei dell'abilità, contatta Jeffrey a [email protected].
Si prega di notare che il risarcimento effettivo dipenderà dalla qualità del tutorial finale e screencast.