SVGアニメーション – CSS要素を使う

javascript

SVGアニメーション – CSS要素を使う

CSSアニメーション要素を使ってSVG画像をアニメーションさせます。

まずは、元となるSVG画像を表示するのみのサンプルです。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>テストHTML</title>

</head>
<body>
 
<svg width="500" height="300" viewBox="0 0 500 300">
    <polygon
        class="anim1"
        points="10 15 25 120 50 180 75 95 98 250 105 140 130 175 135 210 150 135"
        stroke="#000000"
        stroke-width="1"
        fill="none"
    />
</svg>

</body>
</html>

サーバ上のHTMLはこちら(test1.html)

画面にアクセスすると多角形が表示されます。

この多角形に、classを指定し、CSSでclass名を指定してアニーメーションの命令を書きます。
サンプル全体です。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>テストHTML</title>

<style>
.anim1 {
    stroke: #000000;
    stroke-dasharray: 2000;
    stroke-dashoffset: 0;
    stroke-width: 1;
    -webkit-animation: test_anim1 10s ease-in 0s;
    animation: test_anim1 10s ease-in 0s;
}
@-webkit-keyframes test_anim1 {
    0% {
        stroke-dashoffset: 2000;
    }
    100% {
        stroke-dashoffset: 0;
    }
}
</style>

</head>
<body>
 
<svg width="500" height="300" viewBox="0 0 500 300">
    <polygon
        class="anim1"
        points="10 15 25 120 50 180 75 95 98 250 105 140 130 175 135 210 150 135"
        stroke="#000000"
        stroke-width="1"
        fill="none"
    />
</svg>

</body>
</html>

サーバ上のHTMLはこちら(test2.html)

画面にアクセスすると、多角形の頂点の座標から順に stroke が描画されることがわかります。

CSSの記述は以下です。

<style>
.anim1 {
    stroke: #000000;
    stroke-dasharray: 2000;
    stroke-dashoffset: 0;
    stroke-width: 1;
    -webkit-animation: test_anim1 10s ease-in 0s;
    animation: test_anim1 10s ease-in 0s;
}
@-webkit-keyframes test_anim1 {
    0% {
        stroke-dashoffset: 2000;
    }
    100% {
        stroke-dashoffset: 0;
    }
}
</style>

アニメーションの命令部分は「-webkit-animation: test_anim1 10s ease-in 0s;」と「animation: test_anim1 10s ease-in 0s;」から
「test_anim1」の指定で、「@-webkit-keyframes test_anim1」以下の内容を描画しています。

アニメーション開始時には「0%」のタグの内容を描画し、「10s」で10秒かけて「100%」のタグの内容までアニメーション描画をしています。

画面アクセスすると、線が徐々に描画されるように見えますが、これは「stroke-dashoffset」の破線の間隔を徐々に小さくなるように変化させている為、
線が描画されているように見えます。

試しに、上記のtest2.htmlのサンプルの内容を、以下のように変更してみます。

stroke-dasharray: 2000;
を、↓に変更
stroke-dasharray: 10;

-webkit-animation: test_anim1 10s ease-in 0s;
animation: test_anim1 10s ease-in 0s;
を、↓に変更
-webkit-animation: test_anim1 50s ease-in 0s;
animation: test_anim1 50s ease-in 0s;

全体的には以下になります。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>テストHTML</title>

<style>
.anim1 {
    stroke: #000000;
    stroke-dasharray: 10;
    stroke-dashoffset: 0;
    stroke-width: 1;
    -webkit-animation: test_anim1 50s ease-in 0s;
    animation: test_anim1 50s ease-in 0s;
}
@-webkit-keyframes test_anim1 {
    0% {
        stroke-dashoffset: 2000;
    }
    100% {
        stroke-dashoffset: 0;
    }
}
</style>

</head>
<body>
 
<svg width="500" height="300" viewBox="0 0 500 300">
    <polygon
        class="anim1"
        points="10 15 25 120 50 180 75 95 98 250 105 140 130 175 135 210 150 135"
        stroke="#000000"
        stroke-width="1"
        fill="none"
    />
</svg>

</body>
</html>

サーバ上のHTMLはこちら(test2_1.html)

画面にアクセスすると、さきほどのサンプルと同様の多角形の線分が10ピクセル単位の破線になり、その破線の「stroke-dashoffset: 2000;」が50秒の間で「stroke-dashoffset: 0;」に変化する。
という出力結果になります。

同じ内容のアニメーション指定方法ですが、パラメータが異なると描画のされ方も大きく異なることがわかります。

同様に、円(circle)のパス情報に対しても、同じCSSのパラメータ変化によるアニメーションを試してみます。

サンプルの多角形のSVGの箇所を、下記の円(circle)のパスに置き換えてみます。

<svg width="500" height="300" viewBox="0 0 500 300">
    <circle
	    class="anim1"
        cx="110"
        cy="110"
        r="100"
        stroke="#000000"
        stroke-width="1"
	    fill="none"
    />
</svg>

全体のサンプルは以下です。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>テストHTML</title>

<style>
.anim1 {
    stroke: #000000;
    stroke-dasharray: 2000;
    stroke-dashoffset: 0;
    stroke-width: 1;
    -webkit-animation: test_anim1 10s ease-in 0s;
    animation: test_anim1 10s ease-in 0s;
}
@-webkit-keyframes test_anim1 {
    0% {
        stroke-dashoffset: 2000;
    }
    100% {
        stroke-dashoffset: 0;
    }
}
</style>

</head>
<body>
 
<svg width="500" height="300" viewBox="0 0 500 300">
    <circle
	    class="anim1"
        cx="110"
        cy="110"
        r="100"
        stroke="#000000"
        stroke-width="1"
	    fill="none"
    />
</svg>

</body>
</html>

サーバ上のHTMLはこちら(test3.html)

画面にアクセスすると、円(circle)のパスが起点から、時計回りに360度の線分が描画されることがわかります。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です