アニメーションSVGスピナーの作成

, Author

SVGとCSSは♥になるように作られています。 このチュートリアルでは、単純な SVG の図形を描き、その図形のストロークをアニメーション化して、ローディングスピナーを作成する方法を学びます。

SCSS で記述して、スタイリングを効率化します。

jsfiddle.net/codylg/v8670mj6

HTML/SVG コードはシンプルで、目標は 40px 幅の円を描くことにあります。 ここでの属性は、x および y 座標 (原点) と半径のみです。

後でストロークを追加するときの太さを考慮し、半径 r は 20 ではなく 18 とします。

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

jsfiddle.net/codylg/v8670mj6/1

Styling the SVG

いつものように最初にボックスモデルを定義したいのですが、どうしたらいいですか。 SVG を使用しているので、これにはビュー ボックスとその x および y 座標が含まれます。

ビュー ボックスは、円がレンダリングされる境界を定義します。 これは、円のパスの周囲にアウトラインを作成します。 ストロークをアニメーション化して、スピナーを作成します。

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

jsfiddle.net/codylg/v8670mj6/2

スピナーは形になってきましたが、アニメート前にさらにいくつかのスタイルを適用する必要があります。 大きくなったり引っ込んだりする」効果は、幅の広いダッシュのストロークを使用して作成されます。 ストロークは、ダッシュ間のオフセットを増加させることにより、円パスの周りに「プッシュ」されます。 それを π × 半径に設定すると、円の円周に等しい長さのダッシュが作成されます。

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

最後に、transform-origin および animation プロパティを設定する必要があります。 transform-origin を円の中心に設定することで、円が均等に回転するようになります。

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

Keyframing the animation

先に、円周と同じ長さのダッシュをストロークに設定しました。

オフセットは、stroke-dashoffset プロパティを使用して変更することができます。 オフセットを大きくするとダッシュは後退し、小さくすると円のパスに沿って再び大きくなります。

jsfiddle.net/codylg/v8670mj6/3

で、円のパスに沿ってストロークをアニメーション化しました – これは難しい部分でした。 しかし、ロードスピナーとして、ストロークが引っ込むことは、私たちが求めているものとは全く異なります。 ストロークが常に「前進」しているような錯覚を起こすために、常に進行しているように見せたいのです。

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

jsfiddle.net/codylg/v8670mj6/4

近づいていますが、スピナーが減速しているように見えます。 これは、ストロークが回転方向と逆に動いているときに起こります。

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

下の例では、2つのスピナーがあります:

  • 最初の回転速度は既存の均一な回転速度です(「減速」に対するカウンターはありません)。

スピナーが回転している速度の参照として、いくつかの赤いマーカーを追加しました。

jsfiddle.net/codylg/v8670mj6/6

2 番目のスピナーははるかにスムーズなことがわかると思います。 これは、より均一な速度で動いているように見えるからです。 最後に、アニメーション プロパティの期間を短くして速度を上げてみましょう。

jsfiddle.net/codylg/v8670mj6

Further reading

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

コメントを残す

メールアドレスが公開されることはありません。