Students Save 30%! Learn & create with unlimited courses & creative assets Students Save 30%! Save Now
Advertisement
  1. Web Design
  2. UI Design
Webdesign

Vízszintes idővonal készítése CSS-sel és JavaScripttel

by
Difficulty:IntermediateLength:LongLanguages:

Hungarian (Magyar) translation by Szabó Péter (you can also view the original English article)

Az egyik korábbi bejegyzésben megmutattam, hogyan készítsünk egy reszponzív, függőleges idővonalat. Ma a vízszintes idővonal létrehozásának folyamatát fedjük le.

Szokás szerint, hogy legyen elképzelésünk róla, mit fogunk csinálni, vessünk egy pillantást a kapcsolódó CodePen demóra (a jobb élményért nézd meg a nagyobb verzióját):

Sok a tennivalónk, ezért fogjunk is hozzá!

1. HTML jelölés

A jelölés azonos azzal, mint amit a függőleges idővonalnál meghatároztunk, kivéve három apró dolgot:

  • Egy sorszámozott listát használunk felsorolás helyett, mivel az szemantikailag sokkal pontosabb.
  • Van egy extra listaelem (a legutolsó), ami üres. Ennek az okát az egyik későbbi részen beszéljük majd meg.
  • Van itt egy extra elem (.arrows), ami az idővonali navigációért felelős

Itt a szükséges forráskód:

Az idővonal így néz ebben a kezdőállapotban:

2. Kezdő CSS stílusok hozzáadása

Az alapvető betű- és színstílusok, stb. után, amiket az egyszerűség kedvéért tettem ide bele, most meghatározok néhány CSS szerkezeti szabályt:

Ami a legfontosabb itt, hogy két dolgot vehetsz észre:

  • Nagy felső és alsó térközt rendelünk a listához. Ennek az okát majd a következő részben fejtem ki.
  • Ahogy a következő demóban észre fogod venni, ezen a ponton még nem látjuk az összes listaelemet, mivel a listának width: 100vw és a szülőjének overflow-x: hidden van beállítva. Ez hatékonyan "elmaszkolja" a listaelemeket. Ugyanakkor az idővonal navigációnak köszönhetően a későbbiekben képesek leszünk végignavigálni rajtuk.

Most, hogy a szabályok a helyükre kerültek, ilyen az idővonal jelenlegi változata (minden tartalom nélkül, hogy egyértelmű legyen):

3. Idővonal elem stílusok

Ezen a ponton a div elemeket stilizáljuk (ettől kezdve "idővonal elemeknek" fogjuk hívni őket), melyek a listaelemek részei, ahogy a ::before pszeudo-elemeik is.

Továbbá az :nth-child(odd) és :nth-child(even) CSS pszeudo osztályokat is használni fogjuk, hogy megkülönböztessük a páros és páratlan divek stílusát.

Íme néhány gyakori stílus az idővonal elemekhez:

Ezután némi stilizálás a páratlanoknak:

És végül a párosaknak:

Íme az idővonal új állapota, az ismét hozzáadott tartalommal:

Ahogy azt valószínűleg észrevetted, az idővonal elemek pozíciója abszolút. Ez azt jelenti, hogy el lettek távolítva a normális dokumentummenetből. Ennélfogva annak érdekében, hogy a teljes idővonal megjelenését biztosítsuk, nagy felső és alsó térköz értékeket kell beállítanunk a listának. Ha nem rakjuk hozzá a térközöket, az idővonal le lesz vágva:

How the timeline looks like without paddings

4. Idővonal navigáció stílusok

Itt az ideje a navigációs gombok stilizálásának. Jusson eszedbe, hogy alapértelmezésben kikapcsoljuk az előző nyilat és hozzáadjuk a disabled osztályt.

Íme a kapcsolódó CSS stílusok:

A fenti szabályok ezt az idővonalat eredményezik:

5. Interaktivitás hozzáadása

Elkészült az idővonal alapszerkezete. Adjunk hozzá némi interaktivitást!

Változók

Mindenekelőtt beállítunk egy rakat változót, amit a későbbiekben használni fogunk.

Inicializálás

Amikor az oldal minden eszközével megvagyunk, meghívjuk az init függvényt.

Ez a függvény négy alfüggvényt indít be:

Ahogy pillanatokon belül látni fogjuk, ezen függvények mindegyike egy adott feladatot végez el.

Egyenlő magasságú idővonal elemek

Ha visszaugrasz az utolsó demóra, észreveheted, hogy nem mindegyik idővonal elem egyforma magasságú. Ez nincs hatással az idővonalunk fő funkcionalitására, de talán jobb, ha minden elem egyenlő magasságú. Ennek érdekében adhatunk nekik egy fix magasságot CSS-sel (egyszerűbb megoldás), vagy egy dinamikus magasságot, ami a legmagasabb elem magasságához igazítja őket JavaScripttel.

A második lehetőség sokkal rugalmasabb és stabilabb, ezért itt van egy függvény, ami ezt a viselkedést implementálja:

Ez a függvény megkapja a legmagasabb idővonal elem magasságát és az összes elemhez beállítja alapértelmezett magasságként.

Most így néz ki a demó:

6. Az idővonal animálása

Most pedig koncentráljunk az idővonal animációra. Készítünk egy függvényt, ami lépésről-lépésre implementálja ezt a viselkedést.

Először regisztrálunk egy kattintás eseményfigyelőt az idővonal gombokhoz:

Minden alkalommal, amikor egy gombra kattintunk, ellenőrizzük az idővonal gombok kikapcsolt állapotát. Ha nincsenek kikapcsolva, akkor kikapcsoljuk őket. Ez biztosítja, hogy minden gombra csak egyszer lehessen kattintani, amíg az animáció véget nem ér.

Kódra lefordítva, a kattintáskezelő eleinte a következő sorokat tartalmazza:

A következő lépések:

  • Ellenőrizzük, hogy ez-e az első alkalom, amikor egy gombra kattintottunk. Ismétlésképp, figyelj rá, hogy az előző gomb alapértelmezetten ki van kapcsolva, így az elején csak a következő gomb kattintható.
  • Ha tényleg ez az első alkalom, akkor a transform tulajdonsággal az idővonalat 280px-lel jobbra mozgatjuk. Az xScrolling változó értéke határozza meg a mozgás mértékét.
  • Ezzel ellentétesen, ha már rákattintottunk egy gombra, megszerezzük az idővonal jelenlegi transform értékét, és hozzáadunk vagy elveszünk belőle a kívánt mozgás mértékének megfelelően (érts: 280px-t). Így amíg az előző gombra kattintgatunk, a transform tulajdonság értéke csökken és az idővonal balról jobbra mozog. Ugyanakkor ha a következő gombra kattintunk, a transform tulajdonság értéke nőni fog és az idővonal jobbról balra mozog.

A következő kód implementálja ezt a funkcionalitást:

Szép munka! Épp most határoztuk meg az idővonal animálásának egy módját. A következő kihívás, hogy rájöjjünk, mikor kell ellen az animációnak megállnia. Így csináljuk:

  • Amikor az első idővonal elem teljesen láthatóvá válik, az azt jelenti, hogy már elértük az idővonal elejét, így kikapcsoljuk az előző gombot. Arról is gondoskodunk, hogy a következő gomb be legyen kapcsolva.
  • Amikor az utolsó elem teljesen láthatóvá válik, az azt jelenti, hogy már elértünk az idővonal végére, így kikapcsoljuk a következő gombot. Hasonlóképp biztosítjuk, hogy az előző gomb bekapcsolva legyen.

Emlékezz rá, hogy az utolsó elem egy üres, ugyanolyan szélességgel, mint az idővonali elemek (azaz 280px). Azért adjuk neki ezt az értéket (vagy egy nagyobbat), mert biztosak akarunk lenni abban, hogy az utolsó idővonal elem látható lesz, mielőtt kikapcsolnánk a következő gombot.

Annak észlelésére, hogy a cél elemek teljesen láthatóak-e az adott nézőpontban, ugyanazt a kódot fogjuk használni, mint a függőleges idővonalnál. Az ehhez szükséges kód, ami a Stack Overflowról származik, a következő

A fenti függvényen túl meghatározunk egy újabb segítőt:

Ez a függvény hozzáadja vagy eltávolítja a disabled osztályt egy elemről az alapján, hogy mi a flag paraméter értéke. Továbbá meg tudja változtatni ennek az elemek a kikapcsolt állapotát.

A fentebb leírtak alapján itt a kódban meghatározzunk, hogy ellenőrizze, mikor kell az animációnak megállnia:

Vegyük észre, hogy van egy 1.1 másodperces késleltetés a kód lefuttatása előtt. Miért történik ez?

Ha visszatérünk a CSS-ünkhöz, látni fogjuk ezt a szabályt:

Azaz az idővonal animációnak 1 másodpercre van szüksége. Miután befejeződött, várunk 100 milliszekundumot, majd végrehajtjuk az ellenőrzéseinket.

Így néz ki az idővonal az animációkkal:

7. Swipe támogatás hozzáadása

Idáig az idővonal nem reagált az érintésalapú eseményekre. Szépen mutatna, ha ezt a funkcionalitást is hozzáadhatnánk. Ehhez meg kell írnunk a saját JavaScript implementációnkat, vagy használhatunk egyet a már létező, kapcsolódó könyvtárakból (pl.: Hammer.js, Touchswipe.js).

A demónkban egyszerűsítünk és a Hammer.js-t használjuk, ezért hozzávesszük ezt a könyvtárat:

How to include Hammerjs in our pen

Ezután meghatározzuk a kapcsolódó függvényt:

A fenti függvényben a következőket csináljuk:

  • Létrehozzuk a Hammer egy példányát
  • Regisztráljuk a swipeleft és swiperight eseménykezelőket.
  • Amikor az idővonalon balra swipe-olunk, beindítjuk a következő gombra kattintást, így az idővonal jobbról balra lesz animálva.
  • Amikor az idővonalon jobbra swipe-olunk, beindítjuk az előző gombra kattintást, így az idővonal balról jobbra lesz animálva.

Az idővonal swipe támogatással:

Billentyű navigáció hozzáadása

Bővítsük tovább a felhasználói élményt azzal, hogy billentyű navigációt biztosítunk. A célunk:

  • Amikor a balra vagy jobbra nyíl gomb lenyomódik, a dokumentum az idővonal felső helyzetébe szkrollozódik (amennyiben egy másik oldalrész látható jelenleg). Ez biztosítja, hogy a teljes idővonal látható legyen.
  • Pontosabban, amikor a balra nyíl gomb lenyomódik, az idővonalnak balról jobbra kell mozognia.
  • Hasonlóképp amikor a jobbra nyíl gomb nyomódik le, akkor az idővonalnak jobbról balra kell animálódnia.

A hozzárendelt függvény a következő:

Az idővonal billentyűzet támogatással:

8. Reszponzívvá válás

Már majdnem kész vagyunk! Végül, de nem utolsó sorban, tegyük az idővonalunkat reszponzívvá. Ha a viewport 600px-nél kisebb, akkor a következő elrendezést kellene használnunk:

Mivel desktop-first megközelítést alkalmazunk, ezeket a CSS szabályokat felül kell írnunk:

Megjegyzés: A fenti két szabályhoz a !important szabályt kellett használnunk, hogy felülírjuk a kapcsolódó, JavaScripten keresztül beágyazott stílusokat.

Az idővonalunk végső állapota:

Böngésző támogatás

A demó jól működik mindegyik újabb böngészőn és eszközön. Hasonlóképp észrevehetted, hogy Babelt használtunk az ES6 kódunk lefordítására ES5-höz.

Tesztelés közben csak egy kisebb problémával találkoztam, a szöveg renderelésnél, amikor megváltozik az idővonal animálásakor. Bár kipróbáltam többféle javasolt megközelítést is különféle Stack Overflow thread-ekből, nem találtam olyan megoldást, ami minden operációs rendszernek és böngészőnek is megfelel. Ezért tartsd észben, hogy apróbb betűrenderelési problémával találkozhatsz amikor az idővonal animálva van.

Konklúzió

Ezt a viszonylag jelentős bemutatót egy egyszerű sorszámozott listával kezdtük és egy reszponzív vízszintes idővonalat hoztunk létre. Kétségtelen, hogy sok mindent lefedtünk, de remélem, hogy élvezted a munkát a végeredményig, és segített némi új ismerethez jutnod.

Ha bármi kérdésed van, vagy valamit esetleg nem értettél, tudasd velem a lenti hozzászólásokban!

Következő lépések

Ha szeretnél még fejleszteni ezen az idővonalon, itt van pár dolog, amit még megtehetsz:

  • Támogatás hozzáadása a vonszoláshoz. Ahelyett, hogy a navigációért az idővonal gombjaira kellene kattintgatni, csak megragadhatjuk az idővonal területét. Ehhez a viselkedéshez használhatod a natív Drag and Drop Api-t (ami sajnos nem támogatja a mobil eszközöket a cikk írásának idején), vagy egy olyan külső könyvtárat, mint a Draggable.js.
  • Idővonal viselkedésének fejlesztése, amikor átméretezzük a böngésző ablakát. Például amikor átméretezzük az ablakot, a gomboknak megfelelően kell be- és kikapcsolva lenniük.
  • A kód szervezése egy sokkal kezelhetőbb módon. Talán használhatod a szokásos JavaScript Design Patternt.
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.