addClassで、SVGタグにクラスを付与できない
例えば、ユーザー操作のタイミングで、SVGアニメーションをしたいと考えます。
そこで、CSSのtransitionでアニメーションを設定しておいて、イベントのときにClassを付与することにします。
しかし、<svg>タグに、jQueryのaddClassでClassを付けようとしても上手くいきません。
removeClassやhasClassなども同様です。
attrやsetAttributeを使えば、設定はできます。
$('#svg').attr('class','className'); document.getElementById('svg').setAttribute('class','className');
ただ、このまま使用してしまうと、すでに設定されたClassを上書きしてしまうので、工夫が必要になります。
こんな感じでしょうか。
$('svg').attr('class', function(index,className){ var setClassName = 'newClassName'; if (className !== undefined){ var classNameArray = className.split(' '); for (var i = 0; i < classNameArray.length; i+=1){ if (classNameArray[i] === setClassName){ return; } } return className + ' ' + setClassName; } });
ちょっと面倒ですね…。
スプライトSVGに気をつけよう
スプライトSVGを使用すると、同じ図形でも、個別に色を変えたり、使いまわすことができて便利ですが、注意も必要です。
その色や線の太さといったスタイルを変更しようとするとき、元の図形にスタイルの値があると変更できません。
illustratorなどでSVGを作成することが多いと思いますが、塗りのスタイルがあるので、あとで修正しなくてはなりません。
また、図形が複数の部品で構成されている場合、その部品を変更することも、その部品にアクセスすることもできません。
線を引くアニメーション
最後に線を引くアニメーションをやってみましょう。
stroke-dasharrayという属性を線の長さと同じに設定し、stroke-dashoffsetを少しずつ減らすと、描かれているように見えます。
このやり方であれば、簡単にできます。
(CSSだけでもできますが、今回はJavaScriptで行っています)
ツクメモのロゴをアニメーションさせてみます。
奥が深いSVG
レスポンシブやRetinaディスプレイなど、マルチデバイスで多様化しているWebですが、積極的にSVGを使用することで、ある程度フォローできそうです。
SVGの仕様には奥深いものがあり、ブラウザの実装にも差があります。
ライブラリに頼るとしても、基本的なことは知っておきたいですね。
私も、分からないことが多いですが、取り組んでいきたいです。
そんじゃーねー。
コメント