Kurs HTML5 – SVG – Animacja  Udostępnij na: Facebook

Autor: Marcin Dembowski

Opublikowano: 2011-11-23

Obiekty SVG, oprócz kolorów, stylów i rozmiarów, możesz także kontrolować za pomocą JavaScript. Dzięki temu istnieje możliwość tworzenia animowanych obiektów, czy elementów.

Przed wykonaniem zadań powinieneś wiedzieć:

Po wykonaniu zadań:

  • będziesz potrafił animować elementy SVG za pomocą JavaScript.

Implementacja

Twoim zadaniem będzie utworzenie strony HTML, która wyświetli aktualny czas na stronie w postaci analogowego zegara tak, jak na Rys. 1.

Rys. 1. Wynik końcowy ćwiczenia.

Tworzenie strony oraz pliku SVG

  1. Utwórz stronę HTML5 wraz z obiektem SVG.
  • W dowolnym edytorze utwórz nowy dokument HTML5 i wpisz poniższy kod:
<!DOCTYPE html/>
<html>
<head>
    <title>Animacja SVG</title>
</head>
<body>
<object data="clock.svg" type="image/svg+xml" width="300" height="300">
BRAK OBSŁUGI SVG
</object>
</body>
</html>
  • Zapisz powyższy plik pod nazwą animacja.html.
  • Utwórz kolejny plik, tym razem SVG i umieść w nim poniższy kod:
<?xml version="1.0"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg viewBox="0 0 300 300" version="1.1"
    xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink">
    <pattern id="rulerPattern" patternUnits="userSpaceOnUse"
        x="0" y="0" width="10" height="10"
        viewBox="0 0 10 10" >
        <line x1="0" y1="0" x2="10" y2="0" stroke="lightgray" fill="none" />
        <line x1="0" y1="0" x2="0" y2="10" stroke="lightgray" fill="none"/>
    </pattern>
    <rect x="0" y="0" width="100%" height="100%" fill="url(#rulerPattern)" stroke="gray" />
<defs>
    <g id="quater">
        <rect x="145" y="15" width="10" height="25" />
        <rect x="145" y="15" width="10" height="15" transform="rotate(30,150,150)" />
        <rect x="145" y="15" width="10" height="15" transform="rotate(60,150,150)" />
    </g>
    <g id="secondGroup">
        <rect x="147" y="30" height="145" width="6" fill="black" />
        <circle cx="150" cy="15" r="3" stroke="black" fill="white" />
    </g>
    <g id="hourGroup">
        <rect x="145" y="65" height="110" width="10" transform="rotate(0,150,150)" fill="black" />
        <circle cx="150" cy="15" r="9" stroke="black" stroke-width="2" fill="white" />
        </g>
    <g id="minuteGroup">
        <rect x="145" y="35" height="140" width="10" transform="rotate(0,150,150)" fill="black" />
        <circle cx="150" cy="15" r="6" stroke-width="1" fill="white" stroke="black" />
    </g>
    </defs>
    <circle cx="150" cy="150" r="135"
        stroke-width="12"
        stroke="black" fill="white"/>
<use xlink:href="#quater" />
    <use xlink:href="#quater" transform="rotate(90,150,150)" />
    <use xlink:href="#quater" transform="rotate(90,150,150)" />
    <use xlink:href="#quater" transform="rotate(180,150,150)" />
    <use xlink:href="#quater" transform="rotate(270,150,150)" />
    <use xlink:href="#hourGroup" transform="rotate(0,150,150)" id="hourHand"/>
    <use xlink:href="#minuteGroup" transform="rotate(0,150,150)" id="minuteHand"/>
    <use xlink:href="#secondGroup" transform="rotate(0,150,150)" id="secondHand"/>
    <circle cx="150" cy="150" r="6"
        stroke-width="2"
        stroke="white" fill="black"/>
<script>
        <!-- ANIMACJA -->
</script>
</svg>
  • Zapisz ten plik pod nazwą clock.svg i otwórz stronę w przeglądarce. Powinieneś otrzymać szablon zegara taki, jak na rysunku Rys. 2.

Rys. 2. Szablon zegara analogowego SVG.

Użycie JavaScript do animacji wskazówek zegara.

  1. Aby zegar wskazywał poprawną godzinę, musisz wykorzystać język JavaScript do aktualizacji położenia wskazówek zegara.
  • W pliku clock.svg zamień linię z komentarzem ANIMACJA za pomocą poniższego kodu:
<!-- ZMIENNE GLOBALNE -->
function doAnimation() {
    <!-- SKRYPT ANIMACJI -->
}
doAnimation();
setInterval('doAnimation()',1000);
Informacja
Zwróć uwagę na funkcję setInterval. Jest ona odpowiedzialna za wywoływanie funkcji (podanej w pierwszym parametrze), co określony interwał czasu podawany w milisekundach (jako drugi parametr). W tym przykładzie wywołuj funkcję doAnimation co jedną sekundę (1000 ms).
  • Będziesz modyfikował trzy wskazówki, zatem musisz utworzyć odwołania do odpowiednich obiektów SVG z poziomu kodu JavaScript. Zamień linię z komentarzem ZMIENNE GLOBALNE za pomocą poniższego kodu:
var secondHand = document.getElementById('secondHand');
var minuteHand = document.getElementById('minuteHand');
var hourHand = document.getElementById('hourHand');
  • Pobierz teraz aktualną godzinę i zapamiętaj sekundy, minuty i godziny w oddzielnych zamiennych. Zamień linię z komentarzem SKRYPT ANIMACJI za pomocą poniższego kodu:
var date = new Date();
var second = date.getSeconds();
var minute = date.getMinutes();
var hour = date.getHours() % 12;
<!-- MODYFIKACJA -->
  • Następnie musisz nakazać zmianę obrotu poszczególnych wskazówek, zależnie od pobranej godziny, minuty i sekundy. Zamień linie z komentarzem MODYFIKACJA za pomocą poniższego kodu:
minuteHand.setAttribute('transform','rotate('+(minute / 60 * 360)+',150,150)');
hourHand.setAttribute('transform','rotate('+(hour / 12 * 360)+',150,150)');
secondHand.transform.baseVal.getItem(0).setRotate((second / 60 * 360),150,150);
Informacja
Zauważ, że modyfikujesz obiekty SVG w dwojaki sposób. Wskazówki minutowe (minuteHand) i godzinowe (hourHand) modyfikowane są za pomocą DOM L2 JavaScript – podaj tutaj nazwę atrybutu obiektu SVG i jego wartość w postaci łańcuchów znaków (string). Drugi sposób wykorzystuje SVG DOM Scripting, wartości modyfikuj jawnie, podając nazwę atrybutu, a następnie pobierz pierwszą wartość, znajdującą się na liście transformacji i zmodyfikuj jej parametry, wykorzystując funkcję setRotate. Ten sposób jest zalecany przy modyfikowaniu i tworzeniu bardziej wymagających grafik, ponieważ dodatkowe operacje związane z serializacją nie są wykonywane, jak ma to miejsce w pierwszym sposobie.
  • Zapisz plik SVG i otwórz stronę w przeglądarce. Wskazówki powinny wskazywać aktualny czas na komputerze. W przypadku problemów, sprawdź, czy źródło strony jest zgodne z przedstawionym na Rys. 3.

Rys. 3. Fragment kodu dla zegara z pełnym uwzględnieniem kodu odpowiedzialnego za animację.

Podsumowanie

W tym samouczku nauczyłeś się manipulować obiektami SVG z poziomu języka JavaScript, dzięki czemu utworzyłeś prostą animację, wyświetlającą aktualną godzinę na komputerze lokalnym.

W kolejnym artykule nauczysz się definiować kolory i gradienty w SVG.

Zadanie

Aby sprawdzić swoje umiejętności, spróbuj utworzyć animację, taką jak ta, która została przedstawiona na Rys. 4. Celem jest obrócenie prostokąta z kołem (na jednym z jego rogów, wokół środka grafiki) o dodatkowy stopień co 16.7 ms.

Rys. 4. Klatka animacji obiektu w SVG.

Aby zobaczyć podpowiedzi i rozwiązanie zadania przełącz na widok klasyczny.  

  • Zgrupuj prostokąt z kołem w kontenerze (więcej na temat grupowania możesz znaleźć w Biblioteka elementów w SVG) i na nim wykonuj operacje obrotu.
  • Utwórz zmienną globalną, która przechowywać będzie aktualny stopień obrotu obiektu.
  • Wywołaj funkcję setInterval z nazwą funkcji modyfikującej obrót obiektu oraz okresem 16.7 ms.
<?xml version="1.0"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg viewBox="0 0 300 300" version="1.1"
    xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink">
    <g id="item" fill="yellow" stroke="black" transform="rotate(45,150,150)">
        <rect x="50" y="50" width="200" height="200" />
        <circle cx="50" cy="50" r="5" />
    </g>
<script>
    var degree = 0;
    var item = document.getElementById('item');
    function doAnimation() {
        degree = (degree + 1) % 360;
        item.setAttribute('transform','rotate('+(degree)+',150,150)');
    }
    setInterval('doAnimation()',16.7);

</script>
</svg>