Zeitunterschiede
animateMotion und JavaScript
Ein Vergleichstest zwischem dem SVG eigenen animateMotion, CSS3 animation und einer JavaScript-Steuerung.
Wenn die Frage gestattet ist, was das soll? Dann möchte ich in Abhängigkeit der Browser mit der Frage antworten:
„Was sind denn nun 10 Sekunden?“
Diese Testreihe habe ich mir vorgenommen auf Grund eines anderen Web-Beispiels. 10 Sekunden lang soll sich ein Objekt bewegen, dann eine zufällig lange Pause einnehmen, um anschließend wieder zu beginnen. Das dann später, wenn ich das erste Problem verstanden habe, also die Lösung.
Das Problem besteht in der Interpretation, was 10 Sekunden sein sollen. Firefox flitzt regelrecht davon. Opera und Chrome sind da gemächlicher, aber überholen irgendwann auch die javascript-gesteuerte rote Kugel. Dazu gesellt sich nun auch das Transparenzverhalten. Nach 2sec soll die gelbe Kugel volle Deckkraft erhalten und ab der 8.sec wieder verblassen. Ja und? Nach einer Sekunde hat diese bereits die volle Deckkraft erreicht. Also was soll das!
Das Transparenzverhalten der orangefarbenen und roten Kugel wird über Javascript gesteuert, woraus ersichtlich ist:
Dat passt nich!
1. Auszug: SVG-Element3 Kreis id="yellowbull", id="oranbull" animateMotion Definition
61 62 63 64 65 66 67 68 69 70 |
<circle id="yellowbull" cx="0" cy="0" r="6" fill="yellow">
|
2. Auszug: CSS für das Element id="yellowbull"
19 20 21 22 23 24 25 |
#yellowbull{ animation: myOpac 10s infinite }
|
3. Auszug: JavaScript für die rote Kugel (externe Datei)
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
<script type="application/ecmascript">
|
Animation mit einer Unterbrechung
Ziel ist, einen Bewegungsfluss am Ende seiner Strecke zufällig zu unterbrechen. Die Dauer der Unterbrechung wird per Zufall ausgegeben und kann um einen Faktor/Devisor geändert werden. Eine größere Pause als hier im Beispiel ist besser. Das ist nur Demo. Zwei Möglichkeiten können hierfür Anwendung finden. Der Strecke bis zum Nullpunkt wird ein Vorlauf gegeben (hier angewendet), oder ein Timeout mit der ausgegeben Pause wird gesetzt.
So soll verhindert werden, dass eine Animation nicht mit einer drögen ständigen Wiederholung in Erscheinung tritt.
Sowas nervt ganz schnell.
4. Auszug: Script, dass eine Unterbrechnung ausgibt
179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 |
<script>
|
Für MSIE oder Edge gilt der Hinweis hier, falls einer der beiden in Benutzung!
Solange die Bewegung sich auf eine geradliniegen Achse mit elem.setAttribute('cx',aktx) bezieht, ist mit JavaScript diesem Problem beizukommen. Für die Animation „Stern auf Pfad“ habe ich keine Entsprechung für JavaScript finden können. Vielleicht geht das auch garnicht. Hier muss somit wieder auf animateMotion zurückgegriffen werden.
animateMotion und Ablauffolge in Sets
Nun, eine Rettung hat sich aufgetan. Eine Wiederholungsrate von 4 wird gesetzt und in 4 Sets wird dem Stern je eine Sichtbarkeit visible,hidden,hidden,hidden gesetzt. So wird alle 40 Sekunden der Stern nur aufgehen. Der Start erfolgt nach 10 Sekunden. Wenigstens was!
5. Auszug: SVG-Element „stern“ erhält in Sets eine der beiden Varianten für die Sichtbarkeit.
249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 |
<svg width="150" height="90" class="mP" xmlns:xlink="http://www.w3.org/1999/xlink" >
|
Eine zufällige und damit nicht vorhersehbare Animation schließt sich somit aus, aber eine Lösung ist gefunden, auch wenn das nur durch eine „höchst unsensible Hilfskrücke“ ermöglicht ist.
Für die Demonstration: JavaScript ► Spielereien ► Mausposition war ich auf der Suche.