Draw by Numbers with SVG

Designs for UI widgets often incorporate shapes of such geometric simplicity that it seems a shame to spend the effort, disk space, and bandwidth of creating, storing, and delivering bitmaps for them.

Think of the dots used to indicate a reader’s position in a sequence, or the triangle tips protruding from popovers, pointing toward their referent.


In these cases, I’ve taken to simply writing the graphic out as an SVG one-liner. SVG is a format for specifying vector graphics and is technically human-readable—even if the long sequences of coordinates can become fairly mind-numbing in advanced usage.

Hand-writing SVG markup

In fact, on Splice, we use SVG one-liners for precisely the above examples.

Here’s one of the dots:

<svg class="dot" width="8" height="16">
  <circle cx="4" cy="8" r="4" fill="#dddddd" />

circle is among the more readable svg tags. It has a center (cx and cy) a radius (r), and a color (fill).

CSS even makes a rare excursion beyond its usual domain of content markup into the shape world of SVG: you can override the fill color (but not other attributes, that I can tell) with CSS rules.

.dot circle {
    fill: #333333

Drawing SVGs programmatically

Beyond just letting us replace bitmaps with drawing commands, as a domain-specific language for geometry, SVG opens up avenues for programmatically generating more sophisticated shapes, or ones with variations or animations.

For example, here are the sprites for a sprited loading spinner we have been toying with in-house:


The above was generated in pure JS with just a few lines of trig. Take it for a spin.

While you do, stay a while and try your hand at a few shapes. Or forget your hand and imagine yourself a turtle tracing lines in the sand. Children of the ’80s know what I’m talking about.

June 26, 2014