With the ubiquity of high density displays, SVG has gained much popularity in recent years for its resolution independent rendering of UI elements such as icons and logos. I have been using SVG for some time, always using a vector program like Illustrator or Sketch to manage the shapes and then export the code. The output is often an indecipherable stream of letters and numbers which would be insane to attempt to edit manually. Not all SVG shapes are complex vector paths, however. For some simple use cases, hand coding SVG is surprisingly simple.
Getting your hands dirty with writing SVG manually is a really good way to understand exactly how the shapes are rendered to the screen, which then becomes useful for efficiently implementing design or interaction features such as animating shapes.
In this article, I will cover the basics of writing SVG by hand, with examples of how the shape and attribute syntax can output simple UI shapes.
Let's begin by looking at the six main SVG shapes:
This syntax translates to "draw a line from x1,y1 to x2,y2" with the following attributes:
- starting X pos
- starting Y pos
- ending X pos
- ending Y pos
<line x1="0" y1="25" x2="100" y2="75">
- top left X pos
- top left Y pos
<rect x="30" y="10" width="40" height="80"/>
translates to "draw a 40x80 rectangle with top left corner at pos 30,10".
- centre X pos
- centre Y pos
<circle r="50" cx="50" cy="50"/>
translates to "draw a circle of radius 50 with the centre at pos 50,50".
- move to
- draw a horizontal line
- draw a vertical line
- close the path
<path d="M10 10 H 90 V 90 Z"> translates to "move to position 10,10; draw a horizontal line to pos 90,10; draw a vertical line to pos 90,90; draw a horizontal line to pos 10,90; close the path back to the starting point".
points a list of X,Y positions
<polyline points="0 80, 20 20, 40 80, 50 5, 60 100, 80 50, 100 50"/> translates to "draw connected lines between the points".
Same as polyline, with the path automatically closing to the first position.
viewBox is the 'artboard' of the SVG file. A viewBox value of "0 0 100 100" translates to a 100x100 artboard with a top left position of 0,0.
fill sets the background colour and
stroke sets the border colour of the shape.
preserveAspectRatio="none" disables the default behaviour of an SVG maintaining the viewBox proportions when resized. This is useful for shapes that stretch in one dimension, such as a line.
height are optional attributes for defining size. It is useful to set a width to prevent an SVG from rendering full screen in the absence of CSS. Unlike the inline
style attribute, these styles have very low specificity and can be easily overridden with CSS.
<use> is a child element for referencing an SVG defined elsewhere.
xmlns="http://www.w3.org/2000/svg" defines the XML namespace. This only necessary for SVG files and optional for inline SVG.
<circle r="16" cx="16" cy="16">
Cubic bezier (C)
Quadratic bezier (Q)
Using SVG as a border image can allow for some visual effects that are difficult or impossible with the
box-shadow properties, such as positioning a border on the center of a bounding box, rather than inside (border) or outside (box-shadow).