インラインSVGをつかって地図っぽいものをつくってみる
-
Upload
kohei-kadowaki -
Category
Technology
-
view
5.482 -
download
3
description
Transcript of インラインSVGをつかって地図っぽいものをつくってみる
![Page 1: インラインSVGをつかって地図っぽいものをつくってみる](https://reader034.fdocuments.net/reader034/viewer/2022052619/556a6668d8b42ab0468b4964/html5/thumbnails/1.jpg)
2012/7/21 第5回 HTML5など勉強会HTML5-West.jp Kadoppe
インラインSVGをつかって地図っぽいものをつくってみる
1
![Page 2: インラインSVGをつかって地図っぽいものをつくってみる](https://reader034.fdocuments.net/reader034/viewer/2022052619/556a6668d8b42ab0468b4964/html5/thumbnails/2.jpg)
自己紹介•名前:門脇 恒平 @kadoppe
•職業:エンジニアRails, (Java|Coffee)Script, Objective-C
•肩書き:HTML5-West.jpコアメンバー/ShareWis Inc. CTO
•趣味:ポッドキャスト/ Ust配信
2
最近ももクロが好きすぎて辛いです。
![Page 3: インラインSVGをつかって地図っぽいものをつくってみる](https://reader034.fdocuments.net/reader034/viewer/2022052619/556a6668d8b42ab0468b4964/html5/thumbnails/3.jpg)
本日の資料
•プレゼンスライド
• SlideShare: http://www.slideshare.net/kadoppe
•ソースコード
• GitHub: https://github.com/kadoppe
3
![Page 4: インラインSVGをつかって地図っぽいものをつくってみる](https://reader034.fdocuments.net/reader034/viewer/2022052619/556a6668d8b42ab0468b4964/html5/thumbnails/4.jpg)
Chapter 1:
SVGとはなんぞや。
4
![Page 5: インラインSVGをつかって地図っぽいものをつくってみる](https://reader034.fdocuments.net/reader034/viewer/2022052619/556a6668d8b42ab0468b4964/html5/thumbnails/5.jpg)
いい資料あり〼
•才色兼備なグラフィックス - SVGが見せるWebの未来Mozilla Japan - Brian Birtlesさん
http://people.mozilla.org/~bbirtles/pres/fxdevcon-2012/
5
この資料読むだけでSVGはOK!
![Page 6: インラインSVGをつかって地図っぽいものをつくってみる](https://reader034.fdocuments.net/reader034/viewer/2022052619/556a6668d8b42ab0468b4964/html5/thumbnails/6.jpg)
SVGの3つの特徴
6
ベクターグラフィック
XMLフォーマット
インラインSVG
![Page 7: インラインSVGをつかって地図っぽいものをつくってみる](https://reader034.fdocuments.net/reader034/viewer/2022052619/556a6668d8b42ab0468b4964/html5/thumbnails/7.jpg)
ベクター vs ビットマップ
7出展: http://ja.wikipedia.org/wiki/ファイル:Bitmap_VS_SVG.svg
ベクターグラフィック
点で画像を表現 線で画像を表現
![Page 8: インラインSVGをつかって地図っぽいものをつくってみる](https://reader034.fdocuments.net/reader034/viewer/2022052619/556a6668d8b42ab0468b4964/html5/thumbnails/8.jpg)
画像をXMLで書く!•プログラマーが大好き(?)なXMLが使える
•円:<circle>要素
•四角:<rect>要素
•線:<path>要素
•グループ化:<g>要素
8出展: http://ja.wikipedia.org/wiki/ファイル:SVG.svg
XMLフォーマット
![Page 9: インラインSVGをつかって地図っぽいものをつくってみる](https://reader034.fdocuments.net/reader034/viewer/2022052619/556a6668d8b42ab0468b4964/html5/thumbnails/9.jpg)
HTMLにSVGを埋め込む!
•HTML文書に直接SVGの要素を記述できる
9
インラインSVG
<!DOCTYPE html><html> <head></head> <body> <h1>SVG画像だよ。<h1>
<svg> <circle> </svg> </body></html>
CSSによるルックアンドフィール変更
JavaScriptによる操作/イベントハンドリング
が可能に!
![Page 10: インラインSVGをつかって地図っぽいものをつくってみる](https://reader034.fdocuments.net/reader034/viewer/2022052619/556a6668d8b42ab0468b4964/html5/thumbnails/10.jpg)
対応ブラウザ
10
>= 1.5 >= 9 最初から >= 3.0
ただし、ブラウザ間でサポートしている機能、挙動に違いがある
![Page 12: インラインSVGをつかって地図っぽいものをつくってみる](https://reader034.fdocuments.net/reader034/viewer/2022052619/556a6668d8b42ab0468b4964/html5/thumbnails/12.jpg)
Chapter 2:
インラインSVGでつくる地図っぽいもの
12
![Page 13: インラインSVGをつかって地図っぽいものをつくってみる](https://reader034.fdocuments.net/reader034/viewer/2022052619/556a6668d8b42ab0468b4964/html5/thumbnails/13.jpg)
Webブラウザ + SVG = ??
13
インラインSVGを使って何かつくりたい!
SVGといったら「ズーム」だ!
Webブラウザ + ズーム = 地図!?
![Page 14: インラインSVGをつかって地図っぽいものをつくってみる](https://reader034.fdocuments.net/reader034/viewer/2022052619/556a6668d8b42ab0468b4964/html5/thumbnails/14.jpg)
Webブラウザ + SVG = 地図
14
納得!(仕事でもつくってるしね。)
![Page 15: インラインSVGをつかって地図っぽいものをつくってみる](https://reader034.fdocuments.net/reader034/viewer/2022052619/556a6668d8b42ab0468b4964/html5/thumbnails/15.jpg)
Webブラウザで動く地図といえば?
15
Bing Maps Google Maps
特徴その1:ドラッグで地図を動かせる(Pan)
特徴その2:ホイールでズームレベルを変更できる(Zoom in / Zoom out)
![Page 16: インラインSVGをつかって地図っぽいものをつくってみる](https://reader034.fdocuments.net/reader034/viewer/2022052619/556a6668d8b42ab0468b4964/html5/thumbnails/16.jpg)
ライブコーディング•ゴール:Zoom / Pan機能を備えた地図っぽいもの
• Step 1:地図データの準備
• Step 2:地図データをSVGで描画
• Step 3:CSSでスタイルを整える
• Step 4:Panの実装
• Step 5:Zoomの実装16
※ JavaScriptのライブラリは使わない
![Page 17: インラインSVGをつかって地図っぽいものをつくってみる](https://reader034.fdocuments.net/reader034/viewer/2022052619/556a6668d8b42ab0468b4964/html5/thumbnails/17.jpg)
地図データの準備
•完璧な地図データは作成できない→ 円で陸地を、背景で海を表現
•各円の半径、中心座標データをJSON形式で作成
17
Step 1
地図データは自分で作成したい!
完成イメージ
![Page 18: インラインSVGをつかって地図っぽいものをつくってみる](https://reader034.fdocuments.net/reader034/viewer/2022052619/556a6668d8b42ab0468b4964/html5/thumbnails/18.jpg)
地図データをSVGで描画• 今回使うSVG要素
• <svg>要素:SVG画像を表す
• <circle>要素:円を表す
18
Step 2
<svg><!-- SVG画像 --></svg>
<!-- 座標(10, 20)に半径5pxの円を表示 --><circle cx=”10” cy=”20” r=”5”>
<circle>要素をappendChild()を使って追加していく
![Page 19: インラインSVGをつかって地図っぽいものをつくってみる](https://reader034.fdocuments.net/reader034/viewer/2022052619/556a6668d8b42ab0468b4964/html5/thumbnails/19.jpg)
補足: createElementNS()
• document.createElementNS()
• XML名前空間を指定して要素を生成するメソッド
• SVG要素の生成にはSVGのXML名前空間の指定が必要
19
Step 2
// 要素は生成されないvar circleElm1 = document.createElement(“circle”);
// 要素は生成されるvar circleElm2 = document.createElementNS( “http://www.w3.org/2000/svg”, “circle” );
![Page 20: インラインSVGをつかって地図っぽいものをつくってみる](https://reader034.fdocuments.net/reader034/viewer/2022052619/556a6668d8b42ab0468b4964/html5/thumbnails/20.jpg)
CSSでスタイルを整える
20
Step 3
地図に見えない!
現在の”地図”
CSSで背景色、要素の色を指定する
![Page 21: インラインSVGをつかって地図っぽいものをつくってみる](https://reader034.fdocuments.net/reader034/viewer/2022052619/556a6668d8b42ab0468b4964/html5/thumbnails/21.jpg)
Panの実装
•実装手順を分割
1. <circle>要素をまとめて動かせるようにする
2. ドラッグ操作を検出してPanできるようにする
21
Step 4
マウスドラッグで地図をPanしたい!
![Page 22: インラインSVGをつかって地図っぽいものをつくってみる](https://reader034.fdocuments.net/reader034/viewer/2022052619/556a6668d8b42ab0468b4964/html5/thumbnails/22.jpg)
1. <circle>要素をまとめて動かす• 今回使うSVG要素:<g>要素
• 役割1:複数のSVG要素をグループ化する
• 役割2:子要素の位置/形状をまとめて操作する (transform属性)
22
Step 4
<g><circle><circle><circle><circle></g>
<!-- 子要素をx軸方向に50px, y軸方向に25px動かす -->
<g transform=”translate(50, 25)”><!-- 略 --></g>
とりあえず決め打ちで地図をPanしてみる
![Page 23: インラインSVGをつかって地図っぽいものをつくってみる](https://reader034.fdocuments.net/reader034/viewer/2022052619/556a6668d8b42ab0468b4964/html5/thumbnails/23.jpg)
2. ドラッグ操作を検出してPanする
• <svg>要素に以下のイベントハンドラを登録
•mousedown → mousemove → mouseup
23
Step 4
ドラッグ開始 ドラッグ中 ドラッグ終了
ドラッグ中のマウスポインタの移動量を元に<g>要素のtransform属性の値を変更する
![Page 24: インラインSVGをつかって地図っぽいものをつくってみる](https://reader034.fdocuments.net/reader034/viewer/2022052619/556a6668d8b42ab0468b4964/html5/thumbnails/24.jpg)
Zoomの実装
•実装手順を分割
1. <circle>要素をまとめて拡大/縮小できるように
2. ホイール操作を検出してZoomできるようにする
24
Step 5
マウスホイールで地図をZoomしたい!
![Page 25: インラインSVGをつかって地図っぽいものをつくってみる](https://reader034.fdocuments.net/reader034/viewer/2022052619/556a6668d8b42ab0468b4964/html5/thumbnails/25.jpg)
1. <circle>要素をまとめて拡大縮小
• <g>要素のtransform属性にscale()を指定
25
Step 5
とりあえずは決め打ちでZoomしてみる
<!-- 子要素のサイズを2倍に -->
<g transform=”translate(50, 25) scale(2)”></g>
![Page 26: インラインSVGをつかって地図っぽいものをつくってみる](https://reader034.fdocuments.net/reader034/viewer/2022052619/556a6668d8b42ab0468b4964/html5/thumbnails/26.jpg)
2. ホイール操作を検出してZoomする
• ホイール操作の検出方法はブラウザによって異なる
• Google Chromeの場合
• <svg>要素に mousewheel イベントハンドラを登録
• 他のブラウザの場合
• 参考記事: http://codaholic.org/?p=1139
26
Step 5
マウスホイールが動いた向きをもとに<g>要素のtransform属性の値を変更する
今回はChromeのみ対応
![Page 27: インラインSVGをつかって地図っぽいものをつくってみる](https://reader034.fdocuments.net/reader034/viewer/2022052619/556a6668d8b42ab0468b4964/html5/thumbnails/27.jpg)
完成!
27
描画 Pan Zoom
![Page 28: インラインSVGをつかって地図っぽいものをつくってみる](https://reader034.fdocuments.net/reader034/viewer/2022052619/556a6668d8b42ab0468b4964/html5/thumbnails/28.jpg)
改善ポイント
• Google Maps / Bing Maps に近づくために
• Zoom機能のクロスブラウザ対応
•マウスポインタの位置に向かってZoomしたい
• Panした時の挙動に慣性をつける
28
![Page 29: インラインSVGをつかって地図っぽいものをつくってみる](https://reader034.fdocuments.net/reader034/viewer/2022052619/556a6668d8b42ab0468b4964/html5/thumbnails/29.jpg)
まとめ• SVGの3つの特徴
•ベクターグラフィック
• XMLフォーマット
•インラインSVG
•Webブラウザ + SVG = 地図
• JavaScriptとCSSを使って地図っぽいものをつくった
29
![Page 30: インラインSVGをつかって地図っぽいものをつくってみる](https://reader034.fdocuments.net/reader034/viewer/2022052619/556a6668d8b42ab0468b4964/html5/thumbnails/30.jpg)
おしまい!
30
ご清聴ありがとうございました!