この広告は、90日以上更新していないブログに表示しています。
これはVue.js #3 Advent Calendar 2017 – Qiita 4日目の記事です。
こんにちは。SVGで色々なコンポーネントを作っているものです。最近の作品は下記のような感じです。


Webでグリグリ動くUIを作りたい!!という一心でやっています。
これらはほとんどSVGとVueの組み合わせのみで作っています。依存が少ないというのは大事で、ライブラリ間の相性でハマったり、いろんなドキュメント間を往復することがなくなります。
Webでグリグリ動くUIを作るのは基本的にめんどくさいです。jQuery pluginを駆使して作るのも闇が多いですし、divやcanvasをゴリゴリするのも結構手間がかかります。
ですが、最近はSVGで高度なUI実装されることが増えてきた気がします。特に自分が衝撃を受けたのは、CacooがFlashからSVGにスイッチしたことです。
SVGに遅いイメージを持っていた自分にとってこのニュースは衝撃的で、SVGやれば出来るじゃん!と勇気づけられました。というわけで、VueがSVGを標準で扱えることもあって、最近はSVGのポテンシャルを試していたわけです。他にもMSのSarahさんのVueConfでの発表もきっかけの一つでした。
SVGはcanvasに比べて出来ることが多いわけではないのですが、だいぶ実装の手数が削減できます。サクッと実装できるかどうかの差は大きく、僕はこれでグラフィカルなUIを書こうというモチベーションが湧いてくるようになりました。 ※個人の感想です
で、どのくらいサクッとなのかというと、例えば線を引きたければ、下記のように書くだけです。
<svg viewbox="0 0 300 300"width="300"height="300"><line x1=100 y1=100 x2=200 y2=200 stroke="black"></line></svg>

で、canvasとは違って、この線はDOM要素なので、Vue.jsを使うとバインディングが効きます。すなわちこういうことが出来ます。

コードはこれだけです。
<divid="app"><svg viewbox="0 0 300 300"width="300"height="300"><line :x1="x1" y1=100 x2=200 y2=200 stroke="black"></line></svg><div><inputtype="range" v-model="x1"></div></div><script>new Vue({ el:"#app", data:{ x1:100}})</script>
バインディングが出来るフレームワークであれば、VueでなくてもReactでもRiotでもElmでもいいのですが、とにかくSVGはバインディングとの相性が良いです。バインディングだらけになるとスパゲッティになる懸念がありますが、コンポーネントに切り分けることである程度防ぐことが出来ます。
また、SVG要素はイベントリスナをひっつけられます。例えば円をクリックした時にmethodを呼びたければ、これだけで良いです。
<circle @click="myMethod" cx=100 cy=100 r=50></circle>
これを利用して、クリックした時にトグルする何かを作りました。

<svg viewbox="0 0 300 300"width="300"height="300"><circle r=50 cx=150 cy=150 @click="active = !active" :class="{'active': active}"></circle></svg>
new Vue({ el: "#app", data: { active: false }})circle{ fill:#333;transition:all0.4scubic-bezier(.96,.04,.04,.96); stroke:rgb(119, 0, 255); stroke-width:1px;}.active{ fill:white; stroke-width:50px;}
クリックした時に、active変数をトグルし、連動してclassもトグルさせています。で、切り替わる時にCSSアニメーションさせています。楽しいですね。
2017-12-05追記:IE11ではSVG要素のCSS Transitionは動かないそうなので、プロダクションで使う方はご注意下さい。
以前書いた記事の中で、ヒントになりそうなものをピックアップしました。どれもVue +SVGでの実装です。
また、SVG要素に精通するのが大事です。MDNのSVG要素リファレンスを熟読しましょう。
さて、高度なUIといえばドラッグ&ドロップですが、ざっくり言うとmousedown, mousemove, mouseupを各要素に付けてよしなにします。これに関しては紹介すると長くなるので、またいつかやり方を書こうと思います。
ドラッガブルな要素の実装についてはまだ研究中で、シンプルに書く方法を見いだせていません。ただカスタムディレクティブでさっくり行けるんじゃないかという手応えは感じています。一緒に研究してくれる仲間を募集しています。
最後に、この記事を読んでSVGをやってみたくなった人に向けて、雛形HTMLを作ったので置いていきます。
よく使うSVG要素を幾つか表示させているので、属性をいじるなり、Vueとバインドさせるなりさせてみてください。

上記に表示されている基本図形の組み合わせで表現できるUIを考えて、実装してみるのがおすすめです。
この記事を書くにあたって、無駄に作りかけてしまったSVGエディタです。何も使ってないじゃん。人間は愚かだ…

引用をストックしました
引用するにはまずログインしてください
引用をストックできませんでした。再度お試しください
限定公開記事のため引用できません。