O modalitate modernă și atractivă de a plasa o mulțime de conținut într-un spațiu mic este prin utilizarea unui sistem tab. Acest tutorial vă va arăta cum să creați un sistem de filme sexy, animat, completat cu spioni CSS, cookie-uri și swap-uri de filme animate.
Există câteva ipoteze și observații că intrăm în acest sistem cu:
Tutorialul presupune, de asemenea, o cunoaștere de bază a javascript-ului. Un pic de MooTools sau experienta cadru JavaScript va ajuta.
Deci, cum funcționează acest sistem minunat? Iată rezumatul de bază:
Sistemul în sine este destul de bulletproof. Dacă utilizatorul nu permite cookie-urile, fila de pornire pentru fiecare listă va fi întotdeauna 0.
Dacă nu există suport pentru JavaScript, filele nu vor fi afișate pe ecran pe măsură ce vom afișa: none; inițial.
HTML-ul pentru a realiza sistemul tab și elementele de conținut corespunzătoare este incredibil de simplu în structură.
- Tab. 1
- Tab 2
- Tab 3
- Tab 4
- Acesta este conținutul pentru fila 1.
- Acesta este conținutul pentru fila 2.
- Acesta este conținutul pentru fila 3.
- Acesta este conținutul pentru fila 4.
Vom modifica HTML-ul de mai sus cu PHP mai târziu în acest tutorial pentru a crea un sistem mai robust.
Ca și în cazul oricărui combo CSS și HTML, puteți personaliza filele și elementele de conținut ale acestora, oricum doriți.
Am ales să utilizez sprite de tip CSS în stilul Facebook pentru filele mele de exemplu.
Realizați că veți dori să modelați următoarele elemente într-un mod specific, astfel încât sistemul să funcționeze:
/ * tab-uri structură * / .tab-container width: 320px; fundal: #eee; padding: 5px 10px; ul.tabs list-style-type: none; margin: 0; padding: 0; ul.tabs li float: stânga; margine: 10px 5px 0 0; ul.tabs li a padding: 5px 10px; frontieră: 1px solid #ddd; font-weight: bold; fundal: url (tab-sprite.jpg) 0 0 repet-x; color: # 000; text-decoration: none; ul.tabs li a.active limita-culoare: # 028433; Poziția fundalului: 0 -96px; Culoare: #fff; / * sprite! swap pozitie de fundal * / ul.tabs li a.active:hover text-decorare: nimic; cursor: implicit; ul.tabs li: hover text-decorare: subliniere; ul.tabs-content margine: 10px 0 0 0; padding: 0; ul.tabs-conținut li înălțimea: 0; overflow: ascuns; margin: 0; padding: 0; / * șterge flotoare * / div.clear clar: ambele; / * adică fixează * / * html ul.tabs-content li float: left; / * ie6 * / * + html ul.tabs-conținut li lățime: 99%; plutește la stânga; / * ie7 * /
Rețineți că trebuie să implementăm câteva corecții specifice pentru Internet Explorer; urât, dar necesar.
Unul dintre marile avantaje ale MooTools este sistemul puternic de clasă.
Clasele MooTools permit funcționalități flexibile, organizate și extensibile.
Clasa MooTools va fi numită "TabSet". Deoarece clasa TabSet efectuează mai multe acțiuni,
vă permite să descompuneți fiecare parte a clasei.
Prima linie dă întotdeauna clasei un nume:
/ * da clasei un nume * / var TabSet = new Class (
În continuare trebuie să creați un obiect care să dețină opțiunile clasei noastre:
opțiuni: // opțiuni pentru fila implicită activeClass: 'active', // css class cookieName: ", // nu nume înseamnă cookie cookieOpțiuni: // opțiuni pentru cookie, dacă durata dorită a cookie-ului: 30, // 30 zile path: '/', startIndex: 0 // începe cu acest element dacă nu există cookie sau activ,
Opțiunile noastre ne permit să definim:
Cu doar trei opțiuni în clasă, TabSet ar fi considerat o clasă relativ simplă.
Apoi implementăm două Opțiuni și Evenimente:
Implemente: [Opțiuni, Evenimente],
Implementarea opțiunilor și a evenimentelor ne va permite să gestionăm corect opțiunile și opțiunile date
incendii personalizate încărcați și modificați evenimentele din listele noastre oriunde în cadrul clasei.
Apoi definim metoda "initialize", care ruleaza la crearea fiecarui exemplu al clasei:
inițializa: funcția (tab-uri, conținut, opțiuni) // argumentează acest lucru.setOptions (opțiuni); // amestecați opțiunile date cu opțiunile implicite this.tabs = $$ (tabs); // salvați filele din clasa this.contents = $$ (conținut); // salvați conținutul dat în cadrul clasei // determina fila "activă" var active = (cookie.read (this.options.cookieName) || this.options.startIndex); // decide indexul care ar trebui să fie activ inițial this.activeTab = this.tabs [active] .addClass (this.options.activeClass); // identificați acum fila "activă" this.activeContent = this.contents [active] .setStyle ('height', 'auto'); // identificați conținutul "activ" // executați combo-ul fiecărei file / conținut prin metoda "processItem" pe care o vom vedea mai jos. [i], i);, aceasta); // tab-urile sunt gata - incarca incarcatura! this.fireEvent ( 'încărcare'); ,
Următoarea metodă a căii de lucru a clasei TabSet: processItem:
processItem: funcție (tab, conținut, i) var contentHeight = content.getScrollSize () y; // adăugați un eveniment de clic în fila tab.addEvent ('click', funcția () // dacă nu este fila activă dacă (tab! = this.activeTab) // stopper if (e) e.stop ( ); // elimina clasa activă din fila activă this.activeTab.removeClass (this.options.activeClass); // face fila clic pe fila activă (this.activeTab = tab) .addClass (this.options.activeClass) ; // între vechiul conținut al fila în susul conținutului nou introdus în acest.activeContent.set ('tween', onComplete: function () this.activeContent = content.fade ('in'). ', onComplete: $ empty) tween (' height ', contentHeight); // incendiu eveniment schimbare file this.fireEvent (' schimbare ', [tab, content]); setStyles (height: contentHeight, overflow: 'ascuns') fade ('out') tween ('height', 0); this.options.cookieName, i); .bind (acest lucru)); );
Iată schema de bază a ceea ce face metoda processItem:
Și acum o utilizare exemplară a clasei noastre:
fereastra.addEvent ('domready', functie () var tabset = nou TabSet ($ 'tabs1 li a'), $$ ('contents1 li'), cookieName: demo-list); );
Oferim exemplul nostru fila LI A și conținutul LI. Oferim, de asemenea, argumentul opțiunilor opționale. Atât de ușor este să folosiți această clasă! Iată clasa completă cu utilizare:
/ * class * / var TabSet = clasa nouă (opțiuni: activeClass: 'activ', // css class cookieName: ', cookieOptions: duration: 30, // calea 30 zile:' / ', startIndex: 0 // începe cu acest element dacă nu există nici un cookie sau activ, Implementează: [Opțiuni, Evenimente], inițializează: funcție (file, conținut, opțiuni) // argumentează acest argument.setOptions (opțiuni); this.tabs = $$ (pentru conținut); // determina fila "activă" var active = (cookie.read (this.options.cookieName) || this.options.startIndex); this.activeTab = aceasta. [active] .addClass (this.options.activeClass); this.activeContent = this.contents [active] .setStyle ('înălțime', 'auto'); // procesați fiecare filă și conținutul acesteia.tabs.each (tab, i) this.processItem (tab, this.contents [i], i);, aceasta); // tabs sunt gata - (e) // stop! if (e) if (e) () e.stop (); // dacă nu este fila activă dacă (tab! = this.activeTab) // eliminați clasa activă din fila activă this.activeTab.removeClass (this.options.activeClass); // faceți fila clic pe fila activă (this.activeTab = tab) .addClass (this.options.activeClass); // între conținutul vechi al filei și conținutul noului conținut de pe acest.activeContent.set ('tween', onComplete: function () this.activeContent = content.fade ('in ') set (' tween ' , onComplete: $ empty) tween ("înălțime", contentHeight); // incendiu eveniment schimbare fila this.fireEvent ('schimbare', [tab, conținut]); (height: contentHeight, overflow: 'ascuns'). // salvați indexul în cookie dacă (this.options.cookieName) Cookie.write (this.options.cookieName, i, this.options.cookieOptions); .bind (acest lucru)); ); / * use * / window.addEvent ('load', function () var tabset = nou TabSet ($ 'tabs1 li a' listă););
Îți amintești cum am spus că vom modifica codul HTML original cu PHP? Acum e timpul. De cand noi Mai
aveți un set cookie setat pentru TabSet, ar trebui să încercăm să detectăm faptul că atunci când ieșim din fila HTML.
De ce? Pentru că vrem ca filele să se încarce fără probleme. De asemenea, dorim să se acomodeze pentru utilizatorii care nu au activat JavaScript sau cookie-urile.
Fără acest PHP, este posibil să observați un salt "ușor" în zona de conținut activ.
- " > Tab 1
- " > Tab 2
- " > Tab 3
- " > Tab 4
- > Acesta este conținutul pentru fila 1. Acesta este conținutul pentru fila 1. Acesta este conținutul pentru fila 1. Acesta este conținutul pentru fila 1. Acesta este conținutul pentru fila 1. Acesta este conținutul pentru fila 1. Această este conținutul pentru fila 1. Acesta este conținutul pentru fila 1.
- > Acesta este conținutul pentru fila 2. Acesta este conținutul pentru fila 2. Acesta este conținutul pentru fila 2. Acesta este conținutul pentru fila 2. Acesta este conținutul pentru fila 2. Acesta este conținutul pentru fila 2. Aceasta este conținutul pentru fila 2. Acesta este conținutul pentru fila 2.
- > Acesta este conținutul pentru fila 3. Acesta este conținutul pentru fila 3. Acesta este conținutul pentru fila 3. Acesta este conținutul pentru fila 3. Acesta este conținutul pentru fila 3. Acesta este conținutul pentru fila 3. Aceasta este conținutul pentru fila 3. Acesta este conținutul pentru fila 3.
- > Acesta este conținutul pentru fila 4. Acesta este conținutul pentru fila 4. Acesta este conținutul pentru fila 4. Acesta este conținutul pentru fila 4. Acesta este conținutul pentru fila 4. Acesta este conținutul pentru fila 4. Această este conținutul pentru fila 4. Acesta este conținutul pentru fila 4.
Unii utilizatori nu permit JavaScript sau cookie-uri în scopuri de securitate. Încă vrem ca sistemul nostru să funcționeze pentru ei. Dacă vă amintiți din blocul precedent de cod,
folosim legături cu o cheie de interogare a "demo-list" pentru a indica o schimbare în fila. Următorul bloc de PHP din partea de sus a paginii (înainte de orice ieșire) va
ajutați-ne să modificăm valoarea cookie-ului în fila solicitată.
Rețineți că actualizăm numai pagina dacă putem verifica dacă modul cookie a fost setat. În cazul în care cookie-ul nu a fost setat, utilizatorul are cookie-urile dezactivate.
Iată un rezumat rapid al beneficiilor clasei MoTools TabSet:
Întotdeauna am pledat pentru codificarea unei funcții MooTools dorite "inline" înainte de ao transforma într-o clasă. Iată codul MooTools inline JavaScript:
$$ ('ul.tabs') fiecare (functie (tabList) // a lua lista de continut var tabContentList = tabList.getNext ('ul.tabs-content'), // obtine numele cookie-ului atributul "title" al listei de fișiere cookie = 'demo-list', // indexul fișierului de pornire startIndex = Cookie.read (cookie) || 0, // obține fila real LI items tabs = tabList.set (' ("li"), // obțineți elementele LI de conținut lis = tabContentList.getElements ('li'), // fila (LI) activă în prezent activeTab = tabs [startIndex] .addClass ("activ"), // conținutul LI care este activ în prezent activeContent = lis [startIndex] .setStyle ('înălțime', 'auto'); // pentru fiecare filă din această filă / relație de conținut ... tabs.each (tab, i) // opriți dacă (e) e.stop (); // calculați înălțimea elementului respectiv de conținut var content = lis [i], contentHeight = content.getScrollSize () eveniment la tab-ul care ... tab.addEvent ('click', functie () // daca nu este tab-ul activat momentan ... daca (tab! = activeTab) // adauga si indeparteaza clasa activă din fila veche versus noua activeTab.removeClass ("activă"); (activTab = tab) .addClass ("activ"); // începe să ștergeți, ștergeți efectul activeContent.set ('tween', onComplete: function () activeContent = content.fade ('in') set ('tween', onComplete: $ empty). adăugați ('height', '0'); adăugați ("height", contentHeight); // scrie în cookie Cookie.write (cookie, i); // fin! ); ); // eveniment click fire activeTab.fireEvent ('click'); );
Observați că toate instrucțiunile "var" din partea de sus devin fie argumente, fie opțiuni pentru clasă. Trecerea de la JavaScript în linie MooTools la o clasă este extrem de simplă!
Aveți mai multe idei pentru această clasă? Asigurați-vă că le distribuiți în comentariile de mai jos!
Știați că puteți câștiga până la 600 USD pentru a scrie un tutorial PLUS și / sau pentru noi? Căutăm tutoriale detaliate și bine scrise despre HTML, CSS, PHP și JavaScript. Dacă sunteți în măsură, contactați Jeffrey la [email protected].
Rețineți că o compensație reală va depinde de calitatea tutorialului final și a scenariului.