ちょっとこの画像をみてくれ。こいつをどう思う?
拡大 縮小SVG画像を調べる機会があったので少し調べてみました。
SVGって何ぞや。
SVGはXMLをベースにしたベクトルグラフィックスの記述言語です。
PNGのような画像フォーマットの1つでもありますが、実際にはXMLを記述したテキストファイルであり
HTMLと同様にJavaScript(DOM API)による制御も行えます。
HTMLがタグによって文書の構造を記述するのと同様に、SVGはタグで図形を記述します。
その前に、SVGファイルのhtml記述方法について
記述言語とか言われて意味が分からないのですが、まずはhtml上にどのように記述すればいいのか?
至って普通な記述方法のようです。(一部のぞく)
imgタグ
他画像と同じように、imgタグを使用する事ができるようです
※JSでの操作が一切できない表示専用
<img src="logomark.svg" width="32" height="32">
cssで背景画像
imgと同じく、cssで背景画像として指定することもできるようですね。
※JSでの操作が一切できない表示専用
#testSvg
{
width:32px;
height:32px;
background-image:url(logomark.svg);
background-size:100%;
}
html内にインラインで記述
さて、突然こいつは何を言いだしているのでしょうか。
【記述言語】と言われるのはつまりこういう感じの事なんざんすね。
詳しい内容は後述しますので、ここでは
SVGはhtmlタグ内に書けるんだ(*^◯^*)
が分かってればいいと思います。
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <polygon id="logomark-polyline" fill-rule="evenodd" clip-rule="evenodd" fill="#0CB9C7" points="128.25,26 147.19,96.69 95.44,148.44 24.75,129.5 5.81,58.81 57.56,7.06 "/> </svg>
objectタグを使う
swfファイルみたいな使い方ですね。
jQueryで操作するならこの指定方法が一番いいような、気がします。めいびー
<object type="image/svg+xml" data="logomark.svg" width="256" height="256"></object>
ライブラリを使う
今回この方法にシフトしました。
PC/SPでの切り替えがあったのと、SVG要素の取得が楽だったからです。
ライブラリについて
今回ライブラリは以下を使用しています。
jquery-ui.min.js jquery.ui.touch-punch.min.js snap.svg.js
jquery-ui.min.js
伝家の宝刀jquery-ui.min.js。ドラッグイベント用で使用しています。
jquery.ui.touch-punch.min.js
スマホサイトでのドラッグイベントの適用はこれです。
snap.svg.js
今回は【拡大縮小】【ドラッグでの移動】【特定パスをクリッカブル処理】の3つを実装しましたので
それらを踏まえて書いていきますね。
【2015/06/19追記】
【拡大縮小】【ドラッグでの移動】に関してはSVG関数を使うのをヤメました。
色々辛いからです。
なので、CSSのwidthとheightとtopとleftを使って制御してます。
ドラッグはjQuery UI を使うと3秒でできました。(ジーザス)
snap.svg.jsの読み込み
外部ファイル自体はもうペペッと読み込んであげてください。
SVG表示用タグの取得
※SVGファイルが外部ファイルとしての前提でお話します。
外部ファイルSVGをロード後、DOM構造の中にブッ込む必要があります。
タグは何でもいいんじゃないかと思います。
// Snapで囲むことによって、SVG操作のタグって感じになります。
s = Snap("#svgArea");
SVG画像のロード
普通にloadでSVG画像を指定します。
読み込み完了後、そのタグ自体を、先ほどのSVG表示用タグの所にappendしてあげます。
で、SVGタグ自体には何かしようとしても動かないっぽいので、その下にあるgタグ(SVG固有タグ、グループ)を指定し
こいつをベースに色々触ってあげることになります。
ここまでで、DOM構造へのブチ込みとSVGの操作準備が整いました。
Snap.load("./img/map.svg", function (f)
{
// loadしたsvgファイルを要素に書き込み
s.append(f);
// svgタグの次、gタグを指定してベースオブジェクトの取得
g = f.select("g");
});
拡大縮小処理について
文字で表すのは至難の業なのでソースでも見ておいてください。
SVG画像サイズについて
SVGサイズが大きいとドラッグ処理が大変な事になるようです。
900kbでもうほとんど動かない状態
目安としては400kb以内になんとか抑えないといけない感じです。
SVGについて