Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[JS] Diagonale animatie

Pagina: 1
Acties:

  • Maxman1850
  • Registratie: Augustus 2009
  • Niet online
Hallo allemaal,

Ik ben bezig met javascript animatie en nu loop ik tegen het volgende probleem aan:
Wanneer ik een div horizontaal of verticaal wil verplaatsen gaat dat zonder problemen en ziet het er ook vloeiend uit, wanneer ik echter een div diagonaal wil verplaatsen lijkt het alsof hij heel erg stottert.

Om het nog erger te maken wil ik de div over een isometrisch grid verplaatsen, dat betekent dus dat de kortste afstand om hem te verplaatsen horizontaal 2px is en verticaal 1px.

Het probleem doet zich alleen voor bij lagere tijden tussen de verplaatsingen, vanaf ongeveer 25 milliseconden wordt het duidelijk.

Ik gebruik jquery met de .animation() functie maar dit heeft weinig verschil met een zelfgeschreven script waarbij de elementen verplaatst worden met een timer. De div's hebben een achtergrondafbeelding waar het mij om gaat.

Nu wil ik aan jullie vragen of jullie misschien oplossingen weten om het wat vloeiender te laten verlopen, is dit mogelijk met javascript? Of moet er misschien een animatie met de afbeelding worden gemaakt met kortere afstanden?

Mijn code die zich herhaalt ziet er als volgt uit, hierbij verplaatst de div zich in zuidwestelijke richting:
JavaScript:
1
$("#element").animate({top: "+=1px", left: "-=2px"}, 25);


Met vriendelijke groet,

Max

  • CurlyMo
  • Registratie: Februari 2011
  • Laatst online: 12:15
Heb je online een werkend voorbeeld staan?

Sinds de 2 dagen regel reageer ik hier niet meer


  • Maxman1850
  • Registratie: Augustus 2009
  • Niet online
-

[ Voor 100% gewijzigd door Maxman1850 op 26-09-2018 21:24 ]


  • OkkE
  • Registratie: Oktober 2000
  • Laatst online: 10-11 15:46

OkkE

CSS influencer :+

Bij mij loopt de animatie in je voorbeeld vloeiend (OSX + Chrome).

Ik heb het idee dat je probleem niet zo zeer te maken heeft met de code die je gebruikt* maar meer de browser/computer waar mee je 't bekijkt. Zowel X- als Y-as animeren is zwaarder (berekening) dan alleen de X of alleen de Y.

*) Native Javascript zal vrijwel altijd minder overhead hebben en dus minder snel schokkerig worden; het kan echter wel lastiger zijn dat goed werkend te krijgen in alle browsers.

“The best way to get the right answer on the Internet is not to ask a question, it's to post the wrong answer.”
QA Engineer walks into a bar. Orders a beer. Orders 0 beers. Orders 999999999 beers. Orders a lizard. Orders -1 beers.


  • TheNephilim
  • Registratie: September 2005
  • Laatst online: 11:02

TheNephilim

Wtfuzzle

In Chrome en Internet Explorer 8 heel soepeltjes hier! :D

  • LiquidT_NL
  • Registratie: September 2003
  • Laatst online: 13-05-2021
Ten overvloede, Chrome op XP, draait als een zonnetje!

Explorers in the further regions of experience...demons to some, angels to others.


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
OkkE schreef op vrijdag 12 oktober 2012 @ 09:03:
Zowel X- als Y-as animeren is zwaarder (berekening) dan alleen de X of alleen de Y.
Ik denk dat je Javascript/browsers/processors en alles daartussenin schromelijk onderschat :X

JavaScript:
1
2
x++;
y++;

v.s.
JavaScript:
1
x++;

Is inderdaad een "optimalisatie" van 50% :P Maar dat bovenste blok voer ik op een gare bak in een gare browser (IE8) met een gare testmethode zo'n ~ 15.000.000 tot ~ 20.000.000 p/sec keer uit :X (Overigens, voer ik 't onderste blok uit dan kom ik op dezelfde getallen; wat betekent dat de tijd vooral gespendeerd wordt in andere zaken :P

* Quick-n-dirty op jsfiddle wat gerammeld. Kan er goed +/- een factor 10 of meer langs zitten maar dat boeit voor 't punt verder niet :P

[ Voor 35% gewijzigd door RobIII op 12-10-2012 11:30 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • OkkE
  • Registratie: Oktober 2000
  • Laatst online: 10-11 15:46

OkkE

CSS influencer :+

You're right. I'm wrong. :P

Het is misschien de redraw door de browser wat de beperking is? Ik heb (zoals wel duidelijk zal zijn :)) niet heel veel verstand van interne werking/performance van browsers; mijn uitleg is ook wat onduidelijk daar door. Maar volgens mij ligt de schokkerige animatie in ieder geval niet aan het gebruikte script an sich.

“The best way to get the right answer on the Internet is not to ask a question, it's to post the wrong answer.”
QA Engineer walks into a bar. Orders a beer. Orders 0 beers. Orders 999999999 beers. Orders a lizard. Orders -1 beers.


Verwijderd

Ik denk dat het niet super is om jQuery's animate functie zo vaak per seconde te gebruiken. volgens mij is dat meer bedoelt om over een tijdsspan van begin- naar eindpunt te gaan en niet om iedere tussenstap apart te nemen.
Ik zou de animatie liever zelf schrijven. Neem anders een kijkje naar de requestAnimationFrame API: http://paulirish.com/2011...rame-for-smart-animating/

Voorbeeldje met jouw bus

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
Is het niet handiger om hier een Tween functionaliteit voor te gebruiken waarbij je begin en eindpunt opgeeft en dan de tween start? dat wordt intern waarschijnlijk op dezelfde manier verwerkt natuurlijk... maar just for the idea...

bijv.
http://jstween.blogspot.nl/

[ Voor 22% gewijzigd door P.O. Box op 12-10-2012 11:48 ]


  • Maxman1850
  • Registratie: Augustus 2009
  • Niet online
Het voorbeeld is inderdaad prima te bekijken, maar als ik hem langzamer laat verplaatsen wordt het pas veel erger om te zien. Ik denk inderdaad niet dat het aan de code ligt, maar aan de grootte van de verplaatsing. Als de verplaatsing dus kleiner te maken is, denk ik dat het veel soepeler gaat verlopen, maar hoe moet zoiets?

  • TheNephilim
  • Registratie: September 2005
  • Laatst online: 11:02

TheNephilim

Wtfuzzle

JavaScript:
1
2
3
4
$("#element").animate({
    top: "320px", // Y-as Punt van bestemming 
    left: "320px" // X-as Punt van bestemming
}, 50000);


Zoals Verwijderd in "[JS] Diagonale animatie" ook al aangeeft, is het denk ik beter, om in plaats elke 25 miliseconden een animatie te starten, gewoon het eindpunt op te geven in top en left. Dan is er slechts één animatie bezig om de bus van A naar B te krijgen, in plaats van elke 25 miliseconden.

Uiteindelijk lijkt het me ook makkelijker te verwerken, je kunt dan eventueel meerdere animaties achter elkaar starten. Dus (bijv.) eerst top: 200px en left: 100px en daarna top: 0px en left: 500px. Dan creëer je dus een 'pad'.

Zoals je het nu doet zou je dus, na (bijv.) 10 iteraties, een andere animatie starten die een andere kant op gaat, of een andere X-/Y-as verhouding heeft.
Pagina: 1