Tworzenie animowanego spinnera SVG

, Author

SVG i CSS były stworzone by być ♥. W tym tutorialu nauczymy się jak narysować prosty kształt SVG i animować skok tego kształtu, aby stworzyć ładujący się spinner.

Będziemy pisać w SCSS, aby usprawnić stylizację.

jsfiddle.net/codylg/v8670mj6

Kod HTML/SVG jest prosty; naszym celem jest narysowanie okręgu o szerokości 40px. Jedynymi atrybutami są tu współrzędne x i y (punkt początkowy) oraz promień.

Aby uwzględnić grubość obrysu, gdy dodamy go później, promień r będzie wynosił 18, a nie 20.

<svg class="spinner">
<circle cx="20" cy="20" r="18"></circle>
</svg>

jsfiddle.net/codylg/v8670mj6/1

Stylowanie SVG

Jak zawsze chcemy najpierw zdefiniować model pudełka. Ponieważ pracujemy z SVG, obejmuje to ViewBox i jego współrzędne x i y.

The viewBox definiuje granice, do których nasz okrąg będzie renderowany.

$spinnerSize: 40;svg.spinner {
width: $spinnerSize + px;
height: $spinnerSize + px;
x: 0px; y: 0px;
viewBox: 0 0 $spinnerSize $spinnerSize;
}

Zastosujemy style obrysu i przezroczyste wypełnienie do okręgu. To utworzy kontur wokół ścieżki okręgu. Będziemy animować obrys, aby stworzyć nasz spinner.

svg.spinner {
... circle {
fill: transparent;
stroke: #0ac8a6;
stroke-width: 4;
stroke-linecap: round;
}
}

jsfiddle.net/codylg/v8670mj6/2

Spinner nabiera kształtu, ale przed animacją musimy zastosować jeszcze kilka stylów. Efekt „rosnącej i zwijającej się” jest tworzony za pomocą szerokiej kreski. Kreska jest „przesuwana” po ścieżce okręgu przez zwiększenie przesunięcia między kreskami.

Aby utworzyć szeroką kreskę, użyjemy właściwości stroke-dasharray. Ustawienie jej na π × promień spowoduje utworzenie kreski o długości równej obwodowi okręgu. Na razie będzie to wyglądało jak jednolita kreska.

svg.spinner {
... circle {
...
stroke-dasharray: (3.14 * $spinnerSize);
}
}

Na koniec musimy ustawić właściwości transform-origin i animation. Ustawienie transform-origin na środek okręgu zapewnia, że będzie się on obracał równomiernie. Właściwość animation użyje nazwy animacji spinnera, którą następnie poddamy kluczowaniu.

svg.spinner {
... circle {
...
transform-origin: (0.5px * $spinnerSize) (0.5px * $spinnerSize) 0;
animation: spinner 4s linear infinite;
}
}

Kluczowanie animacji

Wcześniej ustawiliśmy obrys na kreskę o długości równej obwodowi. Teraz możemy animować przesunięcie tej kreski, aby „zepchnąć” ją ze ścieżki okręgu.

Przesunięcie można modyfikować za pomocą właściwości stroke-dashoffset. Zwiększenie przesunięcia spowoduje cofnięcie kreski, a zmniejszenie – jej powrót wzdłuż okręgu.

jsfiddle.net/codylg/v8670mj6/3

Więc animowaliśmy kreskę wzdłuż okręgu – to była najtrudniejsza część. Ale jako spinner ładujący, cofanie się skoku nie jest tym, o co nam chodzi. Chcemy, aby wyglądało to jak ciągły postęp – aby stworzyć iluzję, że pociągnięcie zawsze porusza się „do przodu”.

Jak możemy to osiągnąć? Poprzez obracanie okręgu w miarę animacji skoku.

@keyframes spinner {
0% {
...
transform: rotate(0deg);
} 50% {
...
transform: rotate(540deg);
} 100% {
...
transform: rotate(1080deg);
}
}

jsfiddle.net/codylg/v8670mj6/4

Zbliżamy się do celu, ale spinner wydaje się zwalniać. Dzieje się tak, gdy suw porusza się przeciwnie do kierunku obrotu. Możemy temu przeciwdziałać, obracając się bardziej w pierwszej połowie animacji.

@keyframes spinner {
0% {
...
transform: rotate(0deg);
} 50% {
...
transform: rotate(720deg);
} 100% {
...
transform: rotate(1080deg);
}
}

W poniższym przykładzie są dwa spinnery:

  • Pierwszy ma istniejącą jednolitą prędkość obrotu (nie przeciwdziała „spowolnieniu”).
  • Drugi używa szybszego obrotu w pierwszej połowie animacji.

Dodałem kilka czerwonych znaczników jako referencje dla prędkości, z jaką obraca się spinner.

jsfiddle.net/codylg/v8670mj6/6

Widać, że drugi spinner jest znacznie płynniejszy. Dzieje się tak dlatego, że wydaje się poruszać z bardziej jednolitą prędkością. Aby zakończyć, zwiększmy prędkość poprzez zmniejszenie czasu trwania właściwości animacji.

jsfiddle.net/codylg/v8670mj6

Kolejna lektura

  • MDN animation
  • MDN stroke-dasharray
  • MDN stroke-dashoffset

.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.