sara soueidan: styling and animating scalable vector graphics with css [cssconfus2014]

61
Styling & Animating Scalable Vector Graphics with CSS CSSConf - May 27th 2014, Florida @SaraSoueidan / sarasoueidan.com

Upload: guillaume-kossi

Post on 29-Nov-2014

233 views

Category:

Software


1 download

DESCRIPTION

Scalable Vector Graphics, or SVGs, are the new "big thing" in web design today, and for a good reason. With the proliferation of retina screens and high resolution displays, we need to adopt techniques that allow us to serve graphics that look good on all screens in all circumstances, and because SVGs offer resolution-independent, fully scalable and crystal clear graphics, it is safe to say that they are the future graphics format of the web. In this talk we're going to see how SVGs can be styled in CSS, and how they can be animated using CSS animations and transitions. We're also going to cover "responsifying" SVGs using CSS media queries, and how we can control the size and looks of SVGs allowing them to adapt to different screen sizes. We'll cover a short workflow from a vector graphics editor to a responsive animated graphic on screen.

TRANSCRIPT

Page 1: Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSConfUS2014]

Styling & Animating Scalable Vector

Graphics with CSS

CSSConf - May 27th 2014, Florida @SaraSoueidan / sarasoueidan.com

Page 2: Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSConfUS2014]

Hello,I’m Sara.

Page 3: Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSConfUS2014]
Page 4: Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSConfUS2014]

Scalable Vector Graphics (SVG) is an XML-based vector image format for two-dimensional graphics with support for interactivity and animation.

Page 5: Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSConfUS2014]

Why SVGs?

➔ SVGs are accessible

➔ Scalable & Resolution Independent

➔ Very Good Browser Support

➔ Smaller sizes (can be gzipped)

➔ Built-in Graphics Effects (Blend Modes, Filters, etc.)

➔ Interactive and Styleable (CSS and Javascript)

➔ SVGs Have Tools

Page 6: Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSConfUS2014]

Creating SVGs

Adobe Illustrator Inkscape (Free) Sketch (Mac OS X only)

Page 7: Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSConfUS2014]

Optimize Exported Code (Standalone Tools)

http://goo.gl/0XvzHs

SVG Editor by Peter Collingridge (Online)

Page 8: Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSConfUS2014]

Optimize Exported Code (Standalone Tools)

SVG O (NodeJS-Based + GUI)

Page 9: Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSConfUS2014]

Peter’s SVG Editor

Page 10: Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSConfUS2014]

Clean Up & Give Classes

bird.svg

Replace generic class names with semantic ones that describe your illustration.

Page 11: Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSConfUS2014]

Styling SVGs with

CSS

Page 12: Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSConfUS2014]

SVG Presentation Attributes

<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="300px" height="300px" viewBox="0 0 300 300">

<polygon

fill = "#FF931E"

stroke = "#ED1C24"

stroke-width = "5"

points = "279.1,160.8 195.2,193.3 174.4,280.8 117.6,211.1 27.9,218.3 76.7,142.7 42.1,59.6 129.1,82.7 197.4,24.1 202.3,114 "/>

</svg> star.svg

Page 13: Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSConfUS2014]

Shared with CSS SVG-onlyfont

font-family

font-size

font-size-adjust

font-stretch

font-style

font-variant

font-weight

direction

letter-spacing

text-decoration

unincode-bidi

word-spacing

visibility

text-rendering

writing-mode

clip-path

mask opacity

filter

pointer-events

image-rendering

clip

color

cursor

display

overflow

clip-ruleflood-colorflood-opacitystop-opacitykerningtext-anchorcolor-profile color-rendering

fill fill-opacityfill-rulemarkermarker-end marker-mid marker-start

strokestroke-width

stroke-opacitystroke-dasharraystroke-dashoffsetstroke-linecapstroke-linejoinstroke-miterlimitalignment-baselinebaseline-shiftshape-renderingglyph-orientation-horizontalglyph-orientation-verticalcolor-interpolationcolor-interpolation-filtersdominant-baselinelighting-colorstop-colorenable-background

http://goo.gl/LVkevr

Page 14: Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSConfUS2014]

Inline Styles (style=” ”)

<svg xmlns="http://www.w3.org/2000/svg" version="1.1" style=”width: 300px; height: 300px;” viewBox="0 0 300 300">

<polygon

style = ”fill: #FF931E; stroke: #ED1C24; stroke-width: 5;”

points = "279.1,160.8 195.2,193.3 174.4,280.8 117.6,211.1 27.9,218.3 76.7,142.7 42.1,59.6 129.1,82.7 197.4,24.1 202.3,114 "/>

</svg>star.svg

Page 15: Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSConfUS2014]

Embedded Styles (<style>) Inside svg

<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="300px" height="300px" viewBox="0 0 300 300">

<style type=”text/css”><![CDATA[

selector {/* styles */}]]>

</style><g id=”..”> … </g>

</svg> filename.svg

Page 16: Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSConfUS2014]

Embedded Styles (<style>) Outside svg

<!DOCTYPE html><!-- HTML5 document --><html> <head> ... </head> <body><style type=”text/css”>

/* style rules */</style><!-- xmlns is optional in an HTML5 document --><svg version="1.1" viewBox="0 0 300 300">

<!-- SVG content --></svg></body> </html>

filename.html

Page 17: Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSConfUS2014]

External Style Sheets

<?xml version="1.0" standalone="no"?><?xml-stylesheet

type="text/css" href="style.css"?>

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

width=".." height=".." viewBox="..">

<!-- SVG content -->

</svg> filename.svg

Page 18: Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSConfUS2014]

Style Rules (Selectors) Type Selectors:g {/* style a group */}circle, rect { fill: #009966; }

Class and ID Selectors:.arrow-head { /* styles */ }#bird { /* styles */ }

Dynamic Pseudo-Class Selectors:.icon:hover, .icon:active, .icon:focus { /* styles */ }

Pseudo-Class Selectors::first-child, :last-child, :nth-*-child(), :visited, :link and :lang, :last-of-type, :first-of-type, :not(), :nth-*-type(), :only-child, :only-of-type, ...

Children Selectors:g > circle {/* styles */}

Notes: Pseudo-elements/Generated Content don’t work.

Page 19: Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSConfUS2014]

Style Cascades

http://goo.gl/QHFp6w

Presentation attributes count as low level “author stylesheets” and are overridden by any other style definition (external stylesheets, document stylesheets and inline styles).

<circle cx="100" cy="100" r="75" fill="blue" style="fill:deepPink;" />

Page 20: Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSConfUS2014]

Example: Simple Hover Effect (Iconic)

Changing the stroke color and stroke width. Fading background in on hover.

http://goo.gl/Fofspo

Page 21: Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSConfUS2014]

Embedding

SVGs

Page 22: Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSConfUS2014]

http://goo.gl/oiYssv

1 <img src=”image.svg” alt=”Site Logo” />

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

<img src=”fallback.jpg”><!-- fallback -->

</object>

3 <embed type="image/svg+xml" src="image.svg" />

4<iframe src="image.svg">

<!-- fallback here -->

</iframe>

5 <svg> … </svg> <!-- XHTML/HTML5 Document -- >

6 #el { background-image: url(image.svg); }

Page 23: Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSConfUS2014]

SVG Embed Technique Links, External Styles, Interactivity, CSS Animations

<img src=”img.svg” alt=”” /> Nope*

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

<embed type="image/svg+xml" src="image.svg" /> Yep

<iframe src="image.svg"></iframe> Yep

Inline <svg> … </svg> Yep

background-image: url(image.svg); Nope*

* CSS animations won’t be played, but SVG (SMIL) animations will be preserved..

Page 24: Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSConfUS2014]

<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="350px" height="400px” viewBox="0 0 350 400" >

<style type="text/css"><![CDATA[

.fish {transform-origin: 50%;animation: shake .4s linear infinite;

}@keyframes shake {

to {-webkit-transform: rotate(-10deg);}}

]]></style> <g id="bear" …> <!-- ... --></g></svg>

bear-css.svg

Example: CSS Animation

Page 25: Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSConfUS2014]

Example(Embedded)

Page 26: Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSConfUS2014]

<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="350px" height="400px” viewBox="0 0 350 400" > <g id="bear" …>

<!-- … --><g class=”fish”>

<!-- ... --><animateTransform attributeName="transform"

type="rotate" begin="0s" dur=".4s" from="0 380 530" to="-10 380 530" repeatCount="indefinite" fill="freeze" />

</g></g></svg>

bear-smil.svg

Example: SVG (SMIL) Animation

Page 27: Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSConfUS2014]

Example (Embedded)

Page 28: Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSConfUS2014]

Responsifying

SVGs

Page 29: Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSConfUS2014]

<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width=”300px height=”300px” > <style type="text/css">

.eye{fill:#8B6A62;}

.face{fill:#F6E6E5;}

.head{fill:#F7A591;}/* ... */

</style> <path class="body" d=”...”> <!-- ... --></svg>

owl.svg

Example

Page 30: Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSConfUS2014]

1. Remove Width & Height, Add viewBox

<svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 300 300"> <style type="text/css">

/* ... */ </style> <path class="body" d=”...”> <!-- ... --></svg>

owl.svg

Page 31: Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSConfUS2014]

2. Preserve Aspect Ratio

<svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 300 300" preserveAspectRatio="xMinYMin meet"> <style type="text/css">

/* ... */ </style> <path class="body" d=”...”> <!-- ... --></svg>

owl.svg

Note: Without viewBox, preserveAspectRatio has no effect.

http://goo.gl/b50HY8

Page 32: Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSConfUS2014]

3. Embed & Wrap in a container<!DOCTYPE html><!-- HTML5 document --><html> <head> ... </head>

<body><div class=”my-svg-container”>

<object type="image/svg+xml" data="owl.svg" class=”my-svg”>

<!-- fallback here --> </object>

</div></body></html>

responsive-owl.html

SVG can be embedded as <object>, <img> or inline as an <svg>. The technique will work for all three embeds.

Page 33: Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSConfUS2014]

4. Padding Hack on Container

.my-svg-container {height: 0;position: relative; /* create positioning context for svg

*/width: width-value; padding-top: (SVG height / SVG width) * width-value;

}

responsive-owl.css

For owl.svg: padding-top = 300 / 300 * 100 = 1 * 100 = 100%;If width of container = 60%: padding-top = 300 / 300 * 60 = 1 * 60 = 60%;If owl.svg has width 250px, height 400px: padding-top = 400/250 * 100 = 1.6 * 100 = 160%;

Page 34: Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSConfUS2014]

4. Position SVG Inside Container

/* pull the svg to the top of the container */.my-svg {

position: absolute;top: 0;

left: 0;width: 100%; /* only required for <img /> */

}

responsive-owl.css

Page 35: Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSConfUS2014]

6. Resize!

Page 36: Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSConfUS2014]

Animating SVGs with CSS

Page 37: Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSConfUS2014]

Transforming

SVGs

Page 38: Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSConfUS2014]

Initial transform-origin on HTML & SVG

Box Model? transform-origin (default value)

HTML elements (div, etc.) Yes 50% 50%*

SVG elements (circle, rect, etc.) No 0 0**

*50% 50% = center of the HTML element itself** 0 0 is the top left corner of the SVG canvas, not the element itself

Page 39: Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSConfUS2014]

CSS Transforms on HTML & SVG<!DOCTYPE html>...<div style=”width: 100px; height: 100px; background-color: orange”> </div><svg style=”width: 150px; height: 150px; background-color: #eee”>

<rect width="100" height="100" x="25" y="25" fill="orange" /></svg>

Page 40: Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSConfUS2014]

Setting transform-origin on SVG Elements

1. Using Percentage Values: The value is set relative to the

element’s bounding box, which includes the stroke used to

draw its border.

2. Using absolute length values: The origin is set relative to the

SVG canvas.

Page 41: Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSConfUS2014]

CSS Transforms on HTML vs SVG (cont’d)<!DOCTYPE html><style>

div, rect {transform-origin: 50% 50%;

}</style>

Page 42: Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSConfUS2014]

Heads up: Transform-Origin Issue In Firefox With Percentage Values

Setting transform-origin using a percentage value currently doesn’t work in Firefox. That is a bug. (It shouldn’t be a problem if you’re not rotating anything.)

Setting it in absolute length values should be fairly simple using a graphics editor.

Page 43: Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSConfUS2014]

Example: PinWheel

PinWheel by http://pixeldoree.com/vector/free-vector-pinwheels-adobe-illustrator-and-png-files/

.wheel { -webkit-transform-origin: 50% 50%;

transform-origin: 193px 164px; animation:

spin 4s cubic-bezier(.49,.05,.32,1.04)infinite alternate;}

@keyframes spin { 50% { transform: rotate(360deg); }}

Page 44: Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSConfUS2014]

Zooming out (or in) in Webkit/Blink does not maintain the transform origin at the center of the rotating element. This is a bug.

This issue does not happen in Firefox, where the transform origin is set in absolute values (relative to the SVG canvas).

Heads up: Transform-Origin Issue In Chrome With Percentage Values

Page 45: Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSConfUS2014]

→ Just use absolute values (for the time being)!

Page 46: Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSConfUS2014]

Heads up: Hardware Acceleration In Chrome

CSS 3D transforms are hardware accelerated in Chrome when applied to HTML elements. However, they are not accelerated when used on SVG elements - they have the same performance profile as SVG transform attributes. They are accelerated in Firefox.

Page 47: Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSConfUS2014]

Animating SVG Paths

Page 48: Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSConfUS2014]

Animated Line DrawingTo Animate an SVG path you need to know its exact length. Then:

#path {

stroke-dasharray: pathLength;

stroke-dashoffset: pathLength;

/* transition stroke-dashoffset */

transition: stroke-dashoffset 2s linear;

}

svg:hover #path{

stroke-dashoffset: 0;

}

Page 49: Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSConfUS2014]

Example#cable {

stroke: #FFF2B1;stroke-dasharray: 4000 4000;stroke-dashoffset: 4000;stroke-width: 4;transition: stroke-dashoffset 8s

linear;}svg:hover #cable {

stroke-dashoffset: 0;}/* turn lamp on */.inner-lamp{

fill:grey; transition: fill .5s ease-in 6s;

}svg:hover .inner-lamp {

fill: #FBFFF8;}/* ... */

The animated path is positioned on top of the black path. When SVG is hovered path is animated, and the lamp is “turned on” after path finishes animation, using a delay that is equal to the animation (transition) time of the path.

Page 50: Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSConfUS2014]

Example 2

http://goo.gl/zII9p0

Page 51: Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSConfUS2014]

var path = document.querySelector('.drawing-path');path.getTotalLength();//set CSS properties uppath.style.strokeDasharray = length + ' ' + length;path.style.strokeDashoffset = length;//set transition uppath.style.transition = 'stroke-dashoffset 2s ease-in-out';// animatepath.style.strokeDashoffset = '0';//more: http://jakearchibald.com/2013/animated-line-drawing-svg/

Animated Line Drawing: Retrieving Path Length Using Javascript

Page 52: Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSConfUS2014]

#RecommendedReading

http://jakearchibald.com/2013/animated-line-drawing-svg/

Page 53: Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSConfUS2014]

Animated Paths (Morphing Paths)

http://goo.gl/ri9nwU

Page 54: Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSConfUS2014]

Animated Paths (Morphing Paths)

The idea is to create a SVG with one path and to morph that path into another one.

You’ll need: the first path, the second path, and possibly intermediate paths (depending on your animation).

There is no way in CSS to animate one SVG path into another.

http://goo.gl/93gFYh

Page 55: Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSConfUS2014]

http://snapsvg.io/

Use Snap.svg

Page 56: Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSConfUS2014]

“ By using animated SVGs instead of GIFs we were able to reduce our page size from 1.6 mb to 389 kb, and reduce our page load time from 8.75 s to 412 ms. That’s a huge difference.”

Animated SVGs As GIFs Replacement

http://oak.is/thinking/animated-svgs/

Page 57: Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSConfUS2014]

Don’t forget to..

Page 58: Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSConfUS2014]

Make SVGs Accessible

http://goo.gl/sG7G0j

#MustRead

Page 59: Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSConfUS2014]

Optimize & Degrade Gracefully

http://goo.gl/nhXtbu

#MustRead

Page 61: Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSConfUS2014]

Thank You!@SaraSoueidan / sarasoueidan.com