Icon Font to SVG Icons: A worked example
There has been an on going discussion about wether Icon Fonts or SVG Icons are 'better' for usage on the web. This css-tricks article outlines the introductory differences between the two nicely. The author concludes that "If you can go IE 9+ / Android 3+, inline SVG is better at pretty much everything than icon fonts". This view has been debated somewhat, with Tyler Sticka laying down a solid case for moving away from Icon Fonts and Ben Frain making a succinct rebuttal. The general consensus within the web development community appears to have been to move over to SVGs however.
One notable benefit I saw for moving to inline SVG was another opportunity to prevent unnecessary render blocking; the process by which content such as CSS/JS/Fonts slow down the rendering path for a page, preventing meaninful content getting to the screen whilst they load.
With this in mind I decided to use my own blog as a way to explore how to make this transition and critically examine any benefits (or problems) it might hold. This post will lay out my approach for swapping out my blogs icon fonts (on the left hand panel, or a the top if you're on mobile!).
Steps #
Remove the icon font CSS
In this case we were using Font Awesome. Font Awesome is a great resource, and I really admire what they've done. Of course however, this post is about removing icon fonts, so out it must go!
<link
href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css"
rel="stylesheet"
/>Remove the icons themselves
Here we remove the icons where necessary. In my case I was using 5 icons from an icon font within the sidebar. We simply delete the relevant icons from the HTML, for example the Twitter icon:
<li class="nav-item">
<a class="pure-button" href="https://twitter.com/">
<i class="fa fa-twitter"></i>
twitter
</a>
</li>Grab the SVG Icons you need
For the SVG Icons I am choosing to use edent's SuperTinySocialIcons. These are very efficient SVG icons, covering the majority of your favourite companies/logos. This won't cover none-social icons (arrows etc) that you might need, in my case I got the cube icon from the The Noun Project and ran it through Jake Archibald's SVG optimiser. For a more robust approach checkout Sara Soueidan's superb blog post about using fontello-svg to take Fontello (an aggregator for web fonts) fonts and convert them down to SVG.
Inline the SVG Icons
You might choose to link out to an external SVG asset, however for performance reasons I have inlined the SVG right into the sidebar, for example:
<a class="pure-button" href="https://twitter.com/">
twitter
<svg viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg">
<rect fill="#1da1f3" height="512" rx="15%" width="512" />
<path
d="m456 133c-14 7-31 11-47 13 17-10 30-27 37-46-15 10-34 16-52 20-61-62-157-7-141 75-68-3-129-35-169-85-22 37-11 86 26 109-13 0-26-4-37-9 0 39 28 72 65 80-12 3-25 4-37 2 10 33 41 57 77 57-42 30-77 38-122 34 170 111 378-32 359-208 16-11 30-25 41-42z"
fill="#fff"
/>
</svg>
</a>Making necessary edits
We need to do a little bit of extra work to take the coloured icons and convert them to monochrome. Taking the Twitter icon for example, we can get rid of the rectangle entirely to remove the light blue box:
<svg
class="svg-icons"
viewBox="0 0 512 512"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="m456 133c-14 7-31 11-47 13 17-10 30-27 37-46-15 10-34 16-52 20-61-62-157-7-141 75-68-3-129-35-169-85-22 37-11 86 26 109-13 0-26-4-37-9 0 39 28 72 65 80-12 3-25 4-37 2 10 33 41 57 77 57-42 30-77 38-122 34 170 111 378-32 359-208 16-11 30-25 41-42z"
fill="#fff"
/>
</svg>Scale them correctly
Using a CSS class we can use
vertical-align: middle
to align the icons vertically and set thewidth
to be in fitting with the adjacent text (16px). We could also just use direct inline CSS if desired.
Outcomes #
By default Font Awesome CSS was 5.83Kb over the wire (23.18Kb uncompressed), plus the actual font itself 55.45kb (WOFF2 is compressed). That's 61.28kb in total, plus two network requests. Using Fontello, I was able to get the font down to 3.17kb (!) by removing all the unused icons. So in total, at it's most optimised we get down to 9.0kb compressed and two network requests (if uncached).
Inlining the SVGs in the sidebar for the index page takes the HTML page weight up from the original 8.85Kb (compressed) to 9.68Kb (compressed) increasing it by 0.83kb compressed. Using icon fonts in this case eliminated two network requests for render blocking content, and removed 8kb in page weight in the best case and over 60kb in the worst case scenario (using the default Font Awesome CDN CSS link). Lastly, I would say even if you don't want to make the switch, at least investigate condensing your icon font usage usage down to the icons you use explicitly, using a tool like Fontello.
Things to note:
- I didn't do any scientific experiments on actual page load times (boooo I hear you shout), however there has been some evidence to suggest there are some marginal losses in rendering using SVGs.
- IE9+ for support for SVGs (hopefully no longer an issue for 99% of developers)
- Similarly older versions of Android lack support (2.3)
Published