Az animált SVG pörgettyű létrehozása

, Author

Az SVG-t és a CSS-t egymásnak szánták ♥. Ebben a bemutatóban megtanuljuk, hogyan rajzoljunk egy egyszerű SVG alakzatot, és animáljuk ennek az alakzatnak a vonását, hogy létrehozzunk egy betöltő spinnert.

SCSS-ben fogunk írni, hogy egyszerűsítsük a formázást.

jsfiddle.net/codylg/v8670mj6

A HTML/SVG kód egyszerű; célunk egy 40px széles kör rajzolása. Az egyetlen attribútum itt az x és y koordináták (origópont) és a sugár.

Azért, hogy figyelembe vegyük a vonás vastagságát, amikor később hozzáadjuk, az r sugár nem 20, hanem 18 lesz.

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

jsfiddle.net/codylg/v8670mj6/1

Styling the SVG

Mint mindig, most is először a dobozmodellt szeretnénk meghatározni. Mivel SVG-vel dolgozunk, ez magában foglalja a viewBox-ot és annak x és y koordinátáit.

A viewBox határozza meg azokat a határokat, amelyekre a körünk renderelve lesz.

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

A körre vonalkázási stílusokat és átlátszó kitöltést fogunk alkalmazni. Ezáltal körvonalat hozunk létre a körpálya körül. A stroke-ot animálni fogjuk, hogy létrehozzuk a pörgettyűnket.

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

jsfiddle.net/codylg/v8670mj6/2

A pörgettyű kezd formát ölteni, de az animálás előtt még néhány stílust kell alkalmaznunk. A “növekvő és visszahúzódó” hatást egy széles kötőjeles vonallal hozzuk létre. A vonás a vonalkák közötti eltolás növelésével “tolódik” a körpályán.

A széles vonalkás vonás létrehozásához a stroke-dasharray tulajdonságot fogjuk használni. A π × sugár értékre állítva a kör kerületének megfelelő hosszúságú kötőjelet hoz létre. Ez egyelőre tömör vonalként fog megjelenni.

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

Végül be kell állítanunk a transform-origin és az animáció tulajdonságokat. A transform-origin beállítása a kör közepére biztosítja a kör egyenletes forgását. Az animáció tulajdonság a pörgettyű animáció-nevet fogja használni, amelyet a következőkben billentyűzünk be.

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

Keyframing the animation

Előtte a vonalkázást a kerületnek megfelelő hosszúságú kötőjelre állítottuk be. Most animálhatjuk ennek a kötőjelnek az eltolását, hogy “kitoljuk” a körpályáról.

Az eltolás a stroke-dashoffset tulajdonsággal módosítható. Az eltolás növelésével a gondolatjel visszahúzódik, míg csökkentésével visszanöveszti a körpálya mentén.

jsfiddle.net/codylg/v8670mj6/3

Szóval, animáltuk a vonalat a körpálya mentén – ez volt a nehéz rész. De, mint betöltő pörgettyű, a vonás visszahúzása nem egészen az, amire vágyunk. Azt akarjuk, hogy úgy tűnjön, mintha állandóan haladna – hogy azt az illúziót keltsük, hogy a vonás mindig “előre” mozog.

Hogyan tudjuk ezt elérni? A kör forgatásával, miközben a vonás animálódik.

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

jsfiddle.net/codylg/v8670mj6/4

Közelebb jutunk, de a pörgő látszólag lelassul. Ez akkor történik, amikor a löket a forgás irányával ellentétesen mozog. Ezt úgy tudjuk ellensúlyozni, hogy az animáció első felében többet forgatunk.

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

A lenti példában két pörgettyű van:

  • Az első a meglévő egyenletes forgási sebességet használja (nem ellensúlyozza a “lassulást”.
  • A második a gyorsabb forgást használja az animáció első felében.

Adtam néhány piros jelölést, mint referenciát a forgási sebességre, amellyel a pörgettyű forog.

jsfiddle.net/codylg/v8670mj6/6

Láthatod, hogy a második pörgettyű sokkal simább. Ez azért van, mert úgy tűnik, hogy egyenletesebb sebességgel mozog. Befejezésül növeljük a sebességet az animációs tulajdonság időtartamának csökkentésével.

jsfiddle.net/codylg/v8670mj6

További olvasmányok

  • MDN animáció
  • MDN stroke-dasharray
  • MDN stroke-dashoffset

.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.