SVGeezus
What is SVG?
- SVG stands for Scalable Vector Graphics
- It‘s been an open, W3C spec since 1999!
- It’s just XML – so plain (somewhat readable) text
- The graphic is described with mathematically-declared HTML-like elements
Why use SVG?
-
It’s often much smaller than raster formats like PNG
-
Resolution independent, so will look sharp on iPhone 98
-
Which means we only need 1 file for all devices/screens
- They can be manipulated with CSS and JavaScript
Downsides?
- Hand-optimising SVGs is incredibly important
- Our CMS image processor doesn't automatically minify and optimise SVGs like it does with raster images
- Not all images are suited to SVG. Some are too complex
- We have to use “presentational attributes” to style them
- We can't use all SVG features cross-platform
What makes an SVG?
-
<circle>
– Draws a circle
-
<defs>
– Define elements for reference
-
<ellipse>
– Draws an ellipse
-
<g>
– Groups elements
-
<linearGradient>
– Defines a linear gradient
-
<path>
– Draws a generic, free-form shape
-
<rect>
– Draws a rectangle
Common Elements
<svg width="100%" height="100%" viewBox="0 0 380 500">
<g id="shapes">
<rect x="20" y="20" width="140" height="140" fill="#f00"/>
<circle cx="90" cy="253" r="70" fill="#f00"/>
<path d="M90,346l70,140l-140,0l70,-140Z" fill="#f00"/>
</g>
<g id="paths">
<path
d="M 220 20 L 360 20 L 360 160 L 220 160 L 220 20 Z"
fill="#0f0"/>
<path
d="M220,253c0,-38.66 31.34,-70 70,-70c38.66,0 70,31.34
70,70c0,38.66 -31.34,70 -70,70c-38.66,0 -70,-31.34 -70,-70Z"
fill="#0f0"/>
<path d="M290,346l70,140l-140,0l70,-140Z" fill="#0f0"/>
</g>
</svg>
Exported directly
<svg viewBox="0 0 380 500">
<g fill="red">
<path d="M20 20h140v140H20z"/>
<circle cx="90" cy="253" r="70"/>
<path d="M90 346l70 140H20l70-140z"/>
</g>
<g fill="#0f0">
<path d="M220 20h140v140H220V20zM220 253c0-38.66 31.34-70
70-70s70 31.34 70 70-31.34 70-70 70-70-31.34-70-70zM290
346l70 140H220l70-140z"/>
</g>
</svg>
After minifying with svgo
- Delete all unused layers & groups
- Convert strokes to fills
- Simplify the amount of nodes and shapes used
- Remove unnecessary nodes of obscured paths
- Redraw shapes as necessary (<paths> to <circles> etc)
- Combine shapes of identical colours (where applicable)
- Reduce amount of fractional pixels for node positions
Manual optimisation
Tools
Example time!
Supplied at 125kb
Optimised to 37kb
(49kb before optimising with svgo)
But, Matt! How?!
- 69 elements
- Unnecessarily complicated
- Broken Blacktown text
Before
- 9 elements
- Fixed bad node alignment
- Simplified obscured shapes
After
Less is more!
Before
After
Sizing and positioning
- Images should be aligned and visually
(not mathematically) centred for the context
in which they sit
- For generic images that can be swapped out as necessary, use a 100×100 square canvas
- For others, make the smallest, known dimension 100px
- Find the visual centre of your images with http://javier.xyz/visual-center/
So SVG for everything?
- The image has a lot of complex gradients, filters
and effects that can't be reproduced easily
- The image has hundreds or thousands of nodes
- We only have a PNG. Never encode a PNG in an SVG
Nope! Use PNG when…
Use commonsense. Test the filesize
Thank you!
@stowball
SVGeezus
By Matt Stow
SVGeezus
A quick primer on SVG and how best to optimise them
- 3,462