svg maniax - css nite after dark7

86
S V G MANIAX 松田直樹 Scalable Vector Graphics

Upload: naoki-matsuda

Post on 19-Jun-2015

19.021 views

Category:

Design


4 download

DESCRIPTION

「文書としてのSVG」の特徴、ブラウザでの挙動の違い、Webページヘの埋め込み方、フォールバックの方法などを紹介します。このスライドを見たあと、Illustrator で書き出した SVG のコードをぜひ眺めてみてください。

TRANSCRIPT

Page 1: SVG MANIAX - CSS Nite After dark7

SVG MANIAX松田直樹

Scalable Vector Graphics

Page 2: SVG MANIAX - CSS Nite After dark7

SVG の最大の 特徴

Page 3: SVG MANIAX - CSS Nite After dark7

画像 であり、 文書 である

Page 4: SVG MANIAX - CSS Nite After dark7

Scalable Vector Graphics

拡張可能な

Page 5: SVG MANIAX - CSS Nite After dark7

それが SVG

XML 文書であるがゆえ

単なる「画像」を超越できる存在。

Page 6: SVG MANIAX - CSS Nite After dark7

SVG を効果的に使ったサイト

Page 8: SVG MANIAX - CSS Nite After dark7
Page 10: SVG MANIAX - CSS Nite After dark7

http://jvectormap.com/

Page 11: SVG MANIAX - CSS Nite After dark7

http://iconmelon.com

Page 13: SVG MANIAX - CSS Nite After dark7

• 拡縮自在なベクター画像• CSS による装飾• DOM API• 文書リソースとしての汎用性

Page 14: SVG MANIAX - CSS Nite After dark7

SVG をXML として理解する

Page 15: SVG MANIAX - CSS Nite After dark7

SVG 1.1 Second Edition の要素は 80 個

<SVG/>

HTML5より少ないので覚えられる

Page 16: SVG MANIAX - CSS Nite After dark7

これだけは覚えておきたいSVGの要素・属性

Page 17: SVG MANIAX - CSS Nite After dark7

宣言と名前空間

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE svg PUBLIC

"-//W3C//DTD SVG 1.1//EN"

"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<svg

xmlns="http://www.w3.org/2000/svg"

xmlns:xlink="http://www.w3.org/1999/xlink"

viewBox="0 0 200 200">

...

</svg>

Page 18: SVG MANIAX - CSS Nite After dark7

描画領域・比率

viewBox 属性

preserveAspectRatio 属性

該当する図形の表示する領域を指定する

Illustrator でのアートボード

拡縮の際の基準点および縦横の比率を指定する

Page 19: SVG MANIAX - CSS Nite After dark7

描画領域・比率

viewBox 属性

100 x 100

<svg viewBox="0 0 100 100" >

0, 0

100, 100

0,0

Page 20: SVG MANIAX - CSS Nite After dark7

描画領域・比率

viewBox 属性

0,0

100 x 100

<svg viewBox="-100 -100 90 90" >

-100, -100

90, 90

Page 21: SVG MANIAX - CSS Nite After dark7

図形

path 要素 line 要素 rect 要素

circle 要素 ellipse 要素 polygon 要素

Page 22: SVG MANIAX - CSS Nite After dark7

グループ化

g 要素複数の図形をグループ化する

Illustrator での グループ と レイヤー はこの要素で再現される

<g><rect ... /><rect ... /><rect ... /><rect ... />

</g>

Page 23: SVG MANIAX - CSS Nite After dark7

モジュール化

defs, symbol, use 要素defs 要素、および symbol 要素 で実体のない図形を定義し、

それを use 要素で再利用できる

要素の再利用

<defs>

<path d="..."/>

</defs>

<use xlink:href="#c" x="20"

y="10" fill="purple"/>

Page 24: SVG MANIAX - CSS Nite After dark7

変形

transform 属性matrix, translate, scale, rotate, skewX, skewY にて変形Illustrator では ほぼすべて matrix で再現される

要素の変形

<path ... transform="skewX(15)" />

Page 25: SVG MANIAX - CSS Nite After dark7

グラデーション

linearGradient 要素, radialGradient 要素

linearGradient 要素と radialGradient 要素で適用

SVG では 塗りにも線にも適用できる

グラデーションの変形は gradientTransform 属性で指定

<linearGradient id="grd" gradientUnits="userSpaceOnUse"

x1="0" y1="0" x2="30" y2="30">

<stop offset="0" style="stop-color:#FC6256"/>

<stop offset="1" style="stop-color:#44BFB7"/>

</linearGradient>

Page 26: SVG MANIAX - CSS Nite After dark7

マスク

clip, clipPath, mask 要素矩形・円形・パスによるマスクと、グラデーションマスク

<defs>

<clipPath id="myClip">

<circle cx="40" cy="40" r="50"/>

</clipPath>

</defs>

<rect x="0" y="0" width="100" height="100"

clip-path="url(#myClip)"/>

Page 27: SVG MANIAX - CSS Nite After dark7

フィルター効果

filter 要素複雑すぎるので、手書きはあきらめる

<defs>

<filter id="fil" filterUnits="userSpaceOnUse" x="0" y="0" width="100" height="100"> <feGaussianBlur stdDeviation="4"/> </filter></defs>

<polygon points="47,0 95,..." filter="url(#fil)"/>

Inkscape が充実している

Page 28: SVG MANIAX - CSS Nite After dark7

Illustrator における注意点

• 通常のフィルターは png 化される

• でも、SVGフィルターが使いものにならない

• メッシュグラデーションは png 化される

• ブレンドは拡張されて書き出される

• アピアランスは分割される

• ブラシもアピアランス分割状態に

• 乗算などの描画モードは無視される

Page 29: SVG MANIAX - CSS Nite After dark7

SVG で使えるCSS プロパティ

Page 30: SVG MANIAX - CSS Nite After dark7

SVG, HTML 両方で使えるプロパティ

•font•font-family•font-size•font-size-adjust•font-stretch•font-style•font-variant•font-weight•direction•letter-spacing•text-decoration•text-rendering

•unicode-bidi•word-spacing•clip•cursor•display

•opacity

•overflow

•pointer-events

•visibility

Page 31: SVG MANIAX - CSS Nite After dark7

SVG 固有のプロパティ

•clip-path•clip-rule•color•mask•enable-background•filter•flood-color•flood-opacity•lighting-color•stop-color•stop-opacity•color-interpolation•color-interpolation-filters•color-profile

•color-rendering•fill•fill-opacity•fill-rule•image-rendering•marker-end•marker-mid•marker-start•shape-rendering•stroke•stroke-dasharray•stroke-dashoffset•stroke-linecap•stroke-linejoin

•stroke-mitterlimit•stroke-opacity•stroke-width•alignment-baseline•baseline-shift•dominant-baseline•glyph-orientation-horizontal•glyph-orientation-vertical•kerning•text-anchor•writing-mode

Page 32: SVG MANIAX - CSS Nite After dark7

Web サイト(HTML)内におけるSVG の使い方

Page 33: SVG MANIAX - CSS Nite After dark7

大きく分けて

2 種類の使い方

Page 34: SVG MANIAX - CSS Nite After dark7

外部ファイル参照

img 要素, object 要素, iframe要素, background-image

HTMLCSS</>

SVG

1

Page 35: SVG MANIAX - CSS Nite After dark7

インラインSVG

HTML5 内に直接 SVG 要素を記述する

<!doctype html>

<html><body>

<svg viewBox="0 0 200 200"> <circle id="c" r="100" x="0" y="0"/>

</svg>

</body></html>

HTML</>

2

Page 36: SVG MANIAX - CSS Nite After dark7

どう違う?

Page 37: SVG MANIAX - CSS Nite After dark7

地味にいろいろ異なるブラウザ間でも違ってくるし、

SVG のコードによっても違ってくる

Page 38: SVG MANIAX - CSS Nite After dark7

こんな SVG で試してみましょう

circle要素をuse要素で量産

サイズと色をアニメーション

svg 内に外部 png を配置

svg 内にpng を

base64 で埋め込み

Page 39: SVG MANIAX - CSS Nite After dark7

<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0" y="0" viewBox="0 0 200 200"><style type="text/css"> .fillsample { fill: #44bfb7; } @media screen and (max-width: 400px) { .fillsample { stroke: #000; } }</style><defs> <circle id="c" class="fillsample" r="30"> <animate attributeName="r" begin="0s" dur="7s" from="10" to="30" repeatCount="indefinite"/> <animate attributeName="fill" begin="0s" dur="7s" to="#FF8888" repeatCount="indefinite"/> </circle></defs><use xlink:href="#c" x="30" y="30"/>...

こんなコードです

Page 40: SVG MANIAX - CSS Nite After dark7

<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0" y="0" viewBox="0 0 200 200"><style type="text/css"> .fillsample { fill: #44bfb7; } @media screen and (max-width: 400px) { .fillsample { stroke: #000; } }</style><defs> <circle id="c" class="fillsample" r="30"> <animate attributeName="r" begin="0s" dur="7s" from="10" to="30" repeatCount="indefinite"/> <animate attributeName="fill" begin="0s" dur="7s" to="#FF8888" repeatCount="indefinite"/> </circle></defs><use xlink:href="#c" x="30" y="30"/>...

こんなコードですwidthheight指定なし

Media Queries もあったり

SMILアニメーションさせてたり

Page 41: SVG MANIAX - CSS Nite After dark7

<img src="sample.svg" alt="xxx">

img 要素

if(!Modernizr.svg) {

$('img[src*="svg"]').attr('src', function() {

return $(this).attr('src').replace('.svg', '.png');

});

}

fallback

Page 42: SVG MANIAX - CSS Nite After dark7

<object type="image/svg+xml" data="sample.svg">

<img src="sample.png" alt="xxx">

</object>

object 要素

Page 43: SVG MANIAX - CSS Nite After dark7

.bgsvg {

background: url(sample.svg) no-repeat 0 0;

background-size: auto;

}

CSS background

background: url('data:image/svg+xml;utf8,

<svg viewBox="0 0 10 10" width="10" height="10">

<circle fill="orange" cx="5" cy="5" r="5"/>

</svg>');

こんなふうにも書けます

Page 44: SVG MANIAX - CSS Nite After dark7

<!doctype html><html><body><h1>inline svg</h1>

<svg viewBox="0 0 200 200"> <circle fill="#44bfb7" cx="15" cx="15" r="30"></svg>

</body></html>

インライン SVG

Page 45: SVG MANIAX - CSS Nite After dark7

DEMO

Page 46: SVG MANIAX - CSS Nite After dark7

ちなみに IE 11 では

Page 47: SVG MANIAX - CSS Nite After dark7

img 要素object 要素iframe 要素 CSS background

animate要素でのアニメーションに対応していない(仕様)

svg内にimage要素で埋め込んだ外部画像も表示される(第2世代まで?)

• svg要素にwidth,heightが指定していない場合、background-position の指定を無視して縦横中央に配置される• svg要素にwidth,heightが指定していない場合、repeat、background-size が効かない

media quer ies の適用が数値通りに適用されない

正常

正常

animete要素でのアニメーションがずれる

インラインSVG

正常

正常

正常

正常

正常

正常

svg に height:auto を指定すると viewBox の高さがブラウザの高さになる

svg に height:auto を指定すると viewBox の高さがブラウザの高さになる

正常

•svg の viewBox に指定した値までしか拡大できない•インラインSVG の要素に transform 等が効かない

Page 48: SVG MANIAX - CSS Nite After dark7

• SVG 文書内のスクリプトは動作しない

• SVG 文書内に埋め込んだ外部ファイルは表示されない(IEを除く)

• SVG 文書内のハイパーリンクは無視される

• SVG 文書内のスクリプトも動作する

• param 要素 や contentdocument を用いて DOM にアクセスも可能

• ただし、親である HTML 側にはイベントはバブリングされない

• SVGのすべての機能を使用できる

• 直接 SVG DOM を操作できる

• 細かい表示がまだまだブラウザ間で違う点がある

できること・できないこと

img 要素

object 要素

インライン SVG

Page 49: SVG MANIAX - CSS Nite After dark7

SVG をアニメーションさせる

Page 50: SVG MANIAX - CSS Nite After dark7

大きく分けて

3 種類の方法

Page 51: SVG MANIAX - CSS Nite After dark7

SMIL アニメーション

<circle fill="#000" r="30">

<animate attributeName="r" begin="0s" dur="7s" from="10" to="30" repeatCount="indefinite"/></circle>

Page 52: SVG MANIAX - CSS Nite After dark7

DEMO

Page 53: SVG MANIAX - CSS Nite After dark7
Page 54: SVG MANIAX - CSS Nite After dark7

CSS アニメーション

• transition

• transform

• animation

• @keyframes

Page 55: SVG MANIAX - CSS Nite After dark7

SVG DOM アニメーション

var logo = document.getElementById("logo");

var rot = 0;

setInterval(function(){

logo.setAttribute("transform",

"rotate(" + rot + " 100 100)");

rot = rot + 1;

}, 10);

Page 56: SVG MANIAX - CSS Nite After dark7

SVG DOM アニメーション

SVG は独自の名前空間を持つため、DOM Level 1 は使えないDOM Level 2 のメソッドを使用すること

createElement() createElementNS()

Page 58: SVG MANIAX - CSS Nite After dark7

SVG を扱う JS ライブラリ

Page 59: SVG MANIAX - CSS Nite After dark7

http://d3js.org/

Page 61: SVG MANIAX - CSS Nite After dark7

http://snapsvg.io/

Page 62: SVG MANIAX - CSS Nite After dark7

DEMO

Page 63: SVG MANIAX - CSS Nite After dark7

SVG の使いどころ

Page 64: SVG MANIAX - CSS Nite After dark7

img 要素

•静止画としては実用レベル

• png や gif の代わりに十分使える

•動きは animate 要素による SMILアニメーションのみ

•フォールバックは JS で判別すべし

Page 65: SVG MANIAX - CSS Nite After dark7

object 要素

•フォールバックも考えると、最もオススメ

• animate 要素だけでなく、SVG 内の JS や CSS も動く

•親 HTML 側との JS 連携は面倒くさい(param や contentdocument でアクセス可能だけど)

• SVG 内のイベントは、親 HTML 側にバブリングしない

Page 66: SVG MANIAX - CSS Nite After dark7

CSS Background

• IE での表示を担保するため、svg 要素に viewBox, width, height の指定は必須

•幅・高さを固定した場合、CSS Sprite でも問題なく使える

Page 67: SVG MANIAX - CSS Nite After dark7

インライン SVG

• SVG のすべての機能が使える

• SVG DOM を扱うことができる

• IE では、SVG 内の要素に CSS transition, animation,transform 等は効かない

• IE では、viewBox の指定以上に大きく表示できないので、viewBox の数値は必要な分以上に指定すること

•フォールバックが面倒くさい

Page 68: SVG MANIAX - CSS Nite After dark7

アニメーション

•アニメーションをさせるなら JS 必須

•ただし、IEを除けば SMILアニメーションがお手軽

•本格的なアニメーションは Canvas を使用する(SVG よりもパフォーマンスがいい)

• SVG には DOM を扱える利点

•イラストの一部分だけを動かしたい、などに向いている

Page 69: SVG MANIAX - CSS Nite After dark7

SVG のフォールバック

Page 70: SVG MANIAX - CSS Nite After dark7

代替用の PNG 画像を用意するのが

そもそも面倒

Page 71: SVG MANIAX - CSS Nite After dark7

grunt-svg2png

gruntのタスクとして、

指定したフォルダ内のSVGを

自動で PNG に変換

ただし、

svg要素に width, height の指定がないと

余白が生まれる

https://github.com/dbushell/grunt-

svg2png

Page 72: SVG MANIAX - CSS Nite After dark7

grunt-svgstore

指定したフォルダー内の SVG を

ひとつの SVG にマージできる

SVG の CSS Sprite を自動で

生成できる

https://github.com/FWeinb/grunt-

svgstore

前頁の grunt-svg2png を併用すれば

CSS Sprite のフォールバックも可能

Page 73: SVG MANIAX - CSS Nite After dark7

Quick Look コマンド

Mac の場合、以下のコマンドでSVG を PNG に変換できる

$ qlmanage -t -s 640 -o . logo.svg

png のサイズ指定

参考)https://developer.apple.com/library/mac/documentation/userexperience/conceptual/quicklook_programming_guide/articles/qldebugtest.html

Page 74: SVG MANIAX - CSS Nite After dark7

おまけ - こんな使い方まで

Page 75: SVG MANIAX - CSS Nite After dark7

テキストに

CSS を超えた表現を施す

Page 76: SVG MANIAX - CSS Nite After dark7

<h1>

<svg class="demo1" viewBox="0 0 290 40"

width="290" height="40">

<text class="demo1-heading" x="0" y="30">

CSS Nite After Dark

</text>

</svg>

</h1>

Page 77: SVG MANIAX - CSS Nite After dark7
Page 78: SVG MANIAX - CSS Nite After dark7

SVG の未来

Page 79: SVG MANIAX - CSS Nite After dark7

2014年 勧告目標

SVG 2.0W3C Working Draft 11 February 2014

Page 80: SVG MANIAX - CSS Nite After dark7

SVG 2.0 で実現される見込みの機能

• メッシュグラデーション(meshGradient要素)• SMILアニメーションとCSSアニメーションとの統合• HTML的なテキストの折り返し• フィルター機能の拡張• OpenGL対応

Page 81: SVG MANIAX - CSS Nite After dark7

さいごに

Page 82: SVG MANIAX - CSS Nite After dark7

文書 であるSVG は

Page 83: SVG MANIAX - CSS Nite After dark7

ということは

Git で差分が取れるし、

マージもできる

Page 84: SVG MANIAX - CSS Nite After dark7

SVG が更に普及する未来は見えている

Page 85: SVG MANIAX - CSS Nite After dark7

SVG と仲良くなるなら今のうち

Page 86: SVG MANIAX - CSS Nite After dark7

松田直樹

SVG MANIAXScalable Vector Graphics

ありがとうございました