ugrás a tartalomhoz

JQuery animate() dinamikusan

whiteman0524 · 2011. Dec. 6. (K), 18.56
Sziasztok!

Próbáltam a címmel is kifejezni a problémámat, de máris mondom hogy mit szeretnék pontosan megvalósítani. Szóval Az animate(...); függvény mint tudjuk "alapértelmezetten" idő és végállapot által van vezérelve, tehát megadsz egy időtartamot meg a végállapoto(ka)t és ezek alapján animálódik az attribútum(halmaz). Viszont! Én azt szeretném valahogy megvalósítani, hogy az animáció hosssza/időtartama (majd később a sebessége is, de ezt egyelőre hagyjuk) dinamikus legyen, mégpedig attól függően hogy az animálandó tulajdonság mikor ér el egy olyan értéket ami közben dinamikusan változhat. Megpróbálom érhetőbben is. Tehát animáljuk például egy div konténer scrollTop attribútumát, magyarul görgessük a tartalmát. A görgetést szabályozza egy (a görgetés animációja alatt) dinamikusan változó x érték ami a görgetés végállapotát adja meg (tehát ha az animálandó scrollTop érték eléri ezt az x értéket akkor fejeződjön be az animáció). A példa kedvéért ez az x érték kezdetben legyen mondjuk 700. Az animációt elindítjuk, de miközben az animáció folyik, ez az x érték 700-ról, 800-ra változik.

Ezt a problémát egyszerűen meg lehet oldani például úgy, hogy kezdetben $(div).animate({scrollTop: 700}); majd minden esetben amikor az x változik $(div).stop().animate({scrollTop: x}); ahol x az új koordináta. Ezzel a megoldással az a probléma, hogy ahányszor változik az x annyiszor lesz leállítva az animáció majd újraindítva, és ha az x érték viszonylag kis idő ( pl.1 másodperc) alatt elég sokszor megváltozik, akkor ez az egész animáció eléggé "darabos" lesz, a sok .stop(), meg újraindítás miatt, nekem pedig az kéne hogy ez nem legyen észrevehető.

Remélem hogy sikerült világosan megfogalmaznom a problémát. A segítséget előre is köszönöm.
 
1

Nincs értelme

Poetro · 2011. Dec. 6. (K), 19.46
Ennek, amit leírtál nincs értelme...
A görgetést szabályozza egy (a görgetés animációja alatt) dinamikusan változó x érték ami a görgetés végállapotát adja meg (tehát ha az animálandó scrollTop érték eléri ezt az x értéket akkor fejeződjön be az animáció)

Namost, ha megadod a scrollTop értékének, hogy 700, akkor ott fog befejeződni az animáció. Mit jelent az, hogy x változik? Mi azaz x, és miért változik? Ha nem tetszik az animate működése, akkor írhatsz saját animáló függvényt, amiben setInterval, setTimeout vagy requestAnimationFrame segítségével animálod a DOM elem egy tulajdonságát.

Egyébként elolvastad a stop függvény dokumentációját?
2

Igen, tisztában vagyok az

whiteman0524 · 2011. Dec. 7. (Sze), 00.24
Igen, tisztában vagyok az animate függvény működésével, én csupán arra akartam kilyukadni, hogy hogyan lehetne egy olyan megoldást írni ami el kezd animálni egy adott tulajdonságot és addig animálja amíg el nem éri a kívánt értékét majd megáll de mindezt úgy, hogy mindeközben az az elérni kívánt érték változhat (így módosul a megállási feltétel). Az animate függvényt csak példának akartam használni.

A setTimeout-al az a problémám hogy lassú, és elég csúnya megoldás sztem. De tulajdonképpen jó, csak én egy gyorsabb dologra gondoltam, mint mondjuk az általad említett requestAnimationFrame. Viszont úgy tudom, hogy ezt már nem támogatja a JQuery, plusz nem minden böngészőben működik a dolog csak a viszonylag újabbakban de ha rosszul tudom akkor javíts ki. Nekem fontos lenne hogy a régi böngészőkben (IE7+ és társai) is működjön a dolog.

Tehát a setTimeout megoldás még egyszer hangsúlyozom, hogy jó lenne, de mivel nem ismert a megállási feltétel ezért a sok rekurzió miatt elég lassú animáláshoz. Ezért egy hasonló de gyorsabb megoldás jobb lenne.

Ami miatt fontos a gyorsaság az az, hogy az animálandó tulajdonság aktuális értéke és az éppen aktuális végállapot távolságának a függvényében változzon a közelítés gyorsasága is. Minél messzebb van a végállapot annál gyorsabban közelítsen. Tehát lényegében egy easing effektus is játszana a dologban. A lényeg hogy az animáció a lehető leggyorsabb, legsimább legyen akadások nélkül.
3

Ha szeretnéd, hogy minden

MadBence · 2011. Dec. 7. (Sze), 01.12
Ha szeretnéd, hogy minden böngészőben fusson a scripted, akkor hiába panaszkodsz, hogy nem szép a setTimeout/setInterval, máshogy nem tudod megcsinálni ;).
Neked biztos nem a JQuery fog kelleni :), valamit neked kell alkotni (amúgy meg lehet csinálni rekurzió nélkül is, de szerintem eleve a problémát nem így kellene megoldani)
4

Szívesen fogadok egyéb

whiteman0524 · 2011. Dec. 7. (Sze), 01.46
Szívesen fogadok egyéb ötleteket is, ha van erre egy jobb megoldásod akkor ne tartsd vissza :)
6

nem tudom, hogy jó-e az

szabo.b.gabor · 2011. Dec. 7. (Sze), 16.10
nem tudom, hogy jó-e az elgondolásom, de valahogy így csinálnám.

van egy függvény ami csinálja az animációt. ez egy külső változóból (a lényeg, hogy nem paraméterből, lehet az egy osztály property-je is akár) veszi ki az elérni kívánt pozíciót. ha még nem ért oda, meghívja önmagát.

valamint van valami, ami ha kell átállítja a cél pozíciót, és ha épp nem megy az animáció, akkor elindítja.
8

Így van

whiteman0524 · 2011. Dec. 9. (P), 01.20
Én is így gondoltam, csak a setTimeout-os önhívogató megoldás az nem valami optimális. De persze ez működik.
5

Paul Irish fallback:

Leonuh · 2011. Dec. 7. (Sze), 11.41
Paul Irish fallback: http://jsfiddle.net/ghjKC/3/
7

Ezt a megoldást kipróbálom,

whiteman0524 · 2011. Dec. 9. (P), 01.19
Ezt a megoldást kipróbálom, köszönöm szépen :)