An introduction to writing SVG code by hand and integrating it with CSS effects like animations & transitions.
Advanced SVG
We can open them directly in our code editor
They’re completely hackable!
SVGs look very similar to HTML—but they are XML
<svg>
<circle>
<rect>
<ellipse>
<svg width="256" height="256" viewBox="0 0 256 256" xmlns="http://www.w3.org/2000/svg"> <circle cx="120" cy="120" r="50" /> <rect x="0" y="0" width="75" height="75" /> <ellipse cx="200" cy="200" rx="50" ry="30" /> </svg>
Most of the visual look of SVGs comes from CSS
Just the properties are a little different
rect { fill: yellow; } ellipse { fill: limegreen; stroke: #000; stroke-width: 5px; }
We can also write the styles directly on the tags—and when we export from Illustrator that’s what happens
The SVG style attributes can be overwritten by CSS
<svg width="256" height="256" viewBox="0 0 256 256" xmlns="http://www.w3.org/2000/svg"> <circle fill="limegreen" cx="120" cy="120" r="50" /> </svg>
circle { fill: yellow; }
The SVG code can be embedded directly in your HTML
Just copy and paste all the SVG code
<body> <svg width="256" height="256" viewBox="0 0 256 256"> <circle cx="120" cy="120" r="50" /> </svg> </body>
Embedded SVGs can have effects:
:hover
transition
animation
transform
<svg id="black-hole" width="256" height="256" viewBox="0 0 256 256"> <circle cx="120" cy="120" r="50" /> </svg>
#black-hole { transition: all .5s linear; } #black-hole:hover { fill: lightsteelblue; }
Makes for a great icon sets.
A separate file is usually better for performance & maintenance because it can be shared, edited and reused.
<!-- At the top of the HTML --> <svg hidden> <symbol id="the-circle" viewBox="0 0 48 48"> <circle cx="24" cy="24" r="22" fill="tomato" /> </symbol> <symbol id="the-triangle" viewBox="0 0 48 48"> <polygon points="24,2 46,46 2,46" fill="yellowgreen" /> </symbol> </svg> <!-- Further down the HTML --> <i class="icon i-128"> <svg><use xlink:href="#the-triangle"></use></svg> </i> <i class="icon i-128"> <svg><use xlink:href="#the-circle"></use></svg> </i> <i class="icon i-24"> <svg><use xlink:href="#the-triangle"></use></svg> </i>
<!-- Icons in a separate sprite sheet --> <i class="icon i-96"> <svg><use xlink:href="images/icons.svg#the-circle"></use></svg> </i> <i class="icon i-128"> <svg><use xlink:href="images/icons.svg#the-triangle"></use></svg> </i> <i class="icon i-48"> <svg><use xlink:href="images/icons.svg#the-circle"></use></svg> </i>
<!-- No `fill` attributes in the symbol --> <svg hidden> <symbol id="the-circle" viewBox="0 0 48 48"> <circle cx="24" cy="24" r="22" /> </symbol> </svg> <i class="icon i-128"> <svg><use xlink:href="#the-circle"></use></svg> </i>
.icon { color: tomato; transition: all .25s linear; } .icon:hover { color: orange; }
Use Spritebot to combine different SVG graphics into a sprite sheet