SVGとCSS3でできる筆記体のアニメーションをやってみる
SVGとCSS3を使った線画によるテキストのアニメーションの方法が紹介されていました。
想像していたよりも、ずっと簡単にできることがわかりました。
こちらの方法を少し応用して筆記体のアニメーションをやってみましたので、
ご紹介いたします。
↓参考にさせていただいたサイト
↓作ってみたもの
方法
基本的な方法・手順は参考サイトと一緒です。
1. Illustratorを使い、筆記体のフォントを、ペンツールを使って一筆書きのパスとしてトレースする
Illustratorでモデルとなる筆記体のフォントでテキストを配置し、ペンツールでトレースします。
このとき、パスは途中で切らずに、一筆書きの状態になるよう、1つのパスでトレースします。
ただ、実際の筆記体のように、t, fの横線は別のパスとして作成し、
iの点の部分は星形のパスとして作成しました。
2. SVG形式で保存し、HTMLに配置する
「ファイル」→「別名で保存」でファイル形式としてSVGを選択し、保存します。
書き出したSVGファイルをテキストエディタなどで開き、<svg></svg>の中のテキストをコピーし、
HTMLに配置します。
配置したらSVGの中のパスそれぞれに適当なclass名を設定して、CSSで操作できるようにしておきます。
1 2 3 4 5 6 7 8 9 10 | <div class="svgWrap"> <svg width="960" height="240"> <path class="path" fill="none" stroke="#000000" stroke-width="5" stroke-miterlimit="10" d="M240.333,109.167c-1.833,3.333-3.833,9,0,10.833 ・・・ 略 ・・・ c4,11.75,12.75,23.75,42-16.75s49-70.25,62-91.5c-17.5,30-78.25,112.25-56,119.5c12.5,5.5,41.25-38.75,41.25-38.75"/> <line class="line" fill="none" stroke="#000000" stroke-width="5" stroke-miterlimit="10" x1="351" y1="106.5" x2="392" y2="106.5"/> <line class="line2" fill="none" stroke="#000000" stroke-width="5" stroke-miterlimit="10" x1="514" y1="106.5" x2="559" y2="106.5"/> <polygon class="star" fill="#FBB03B" points="589.44,98.426 578.817,95.458 570.35,102.527 569.889,91.506 560.55,85.638 570.889,81.795 573.585,71.099 580.435,79.744 591.439,79.003 585.334,88.189 "/> </svg> </div> |
今回は、筆記体の本体にpath、t, fの横線にそれぞれline, lin2、iの点の部分にする星形にstarというclass名を割り当てました。
3. CSS3で設置したSVGにアニメーションをつける
SVGのCSSは基本的には通常のCSSとはプロパティが異なってきます。
SVGの場合は、SVGで各要素に設定する属性名がそのままプロパティ名となります。
例:
1 2 3 4 5 6 7 8 9 10 | <svg> <line class="line" fill="none" stroke="#000000" stroke-width="5" stroke-miterlimit="10" x1="351" y1="106.5" x2="392" y2="106.5"/> </svg> ↑の場合のCSS .line{ fill: none; /* 塗りつぶし */ stroke: #000; /* 線の色 */ stroke-width: 5; /* 線の幅 */ } |
それを念頭に置いて、参考サイトの方法をもとにアニメーションをつけます。
こちらでは、stroke-dasharray(破線の間隔)とstroke-dashoffset(破線の開始位置)というSVGのプロパティを利用して、線画のアニメーションを実現しています。
参考サイトではパスの分かれた文字それぞれについてアニメーションしていますが、
パスを一つにつなげることで、筆記体のアニメーションを実現することにしました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | .path{ stroke:#999; fill:none; stroke-width:5; stroke-dasharray: 5000; stroke-dashoffset:5000; animation: DASH 3.4s ease-in-out alternate forwards; -webkit-animation:DASH 3.4s ease-in-out 0s forwards; animation:DASH 3.4s ease-in-out 0s forwards; } @keyframes DASH{ 0%{stroke-dashoffset:5000;} 100%{stroke-dashoffset:0;} } @-moz-keyframes DASH{ 0%{stroke-dashoffset:5000;} 100%{stroke-dashoffset:0;} } @-webkit-keyframes DASH{ 0%{stroke-dashoffset:5000;} 100%{stroke-dashoffset:0;} } |
線が長くなるので、 stroke-dasharrayとstroke-dashoffseの値を大きくしています。
さらに、筆記体の本体を書き終えた後に、t, fの横線とiの点の部分に相当する星形を、animation-delayを使って遅れて描画させます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | .line, .line2{ stroke:#999; fill:none; stroke-width:4; stroke-dasharray: 3000; stroke-dashoffset:3000; animation: DASH2 1s ease-in alternate forwards; -webkit-animation:DASH2 1s ease-in 0s forwards; animation:DASH2 1s ease-in 0s forwards; animation-delay: 3s; -webkit-animation-delay: 3s; -moz-animation-delay: 3s; } .line2{ animation-delay: 3.1s; -webkit-animation-delay: 3.1s; -moz-animation-delay: 3.1s; } .star{ fill-opacity: 0; animation: star 0.2s ease-in alternate forwards; -webkit-animation:star 0.2s ease-in 0s forwards; animation:star 1s ease-in 0.2s forwards; animation-delay: 3.4s; -webkit-animation-delay: 3.4s; -moz-animation-delay: 3.4s; } @keyframes DASH2{ 0%{stroke-dashoffset:3000;} 100%{stroke-dashoffset:0;} } @-moz-keyframes DASH2{ 0%{stroke-dashoffset:3000;} 100%{stroke-dashoffset:0;} } @-webkit-keyframes DASH2{ 0%{stroke-dashoffset:3000;} 100%{stroke-dashoffset:0;} } @keyframes star{ 0%{fill-opacity:0;} 100%{fill-opacity:1;} } @-moz-keyframes star{ 0%{fill-opacity:0;} 100%{fill-opacity:1;} } @-webkit-keyframes star{ 0%{fill-opacity:0;} 100%{fill-opacity:1;} } |
これで完了です。
その他参考サイト
Author Profile
NINOMIYA
Webデザイナー兼コーダー出身のフロントエンド開発者です。 UXデザインやチーム開発の効率化など、勉強中です。
SHARE