April 28, 2021 • 14 min read
Scalable Vector Graphics (SVG) allow you to present pictures that are lightweight and can scale without being pixelated.
However, we can implement them in several ways in our websites, and some methods allow for some features that others don’t.
Here’s a list of features that you can have or not depending on how you serve your SVGs.
alt attribute sets a text description rendered when the image is not available, whereas a title attribute is usually shown in a tooltip when hovering the image. These are used for accessibility and SEO.
Results in faster load times and, hence, better UX and SEO rankings.
SVGs can be manipulated and animated with CSS and JavaScript. They can also include hyperlinks wrapping their shapes.
Important point since Google announced that they’ll start crawling and indexing SVGs.
SVGs can contain classes and IDs, which should not clash with these attributes on other SVGs on the page.
Now that we know which features we may have or not depending on how we embed our SVGs, let’s compare these embedding methods.
They can be divided into two groups by methodology:
<img> src<img src="user.svg" alt="User" />
.user-svg {
background-image: url(user.svg);
}
img .img tag.<object> data<object data="user.svg" width="300" height="300"></object>
<iframe> or an <embed> srcThese last two methods were used in the past but nowadays their usage has decreased. They are generally not recommended for use.
SVGs used as iframe src have raised concerns about hurting SEO. Moreover, using this method we lose the scalability property of the SVG.
<iframe src="user.svg"></iframe>
And SVGs used as embed src were primarily focused on browser plugins like Flash, which most browsers have stopped supporting.
<embed src="user.svg" />
Basically writing the whole SVG code into the HTML document. This is what some popular SVG libraries like d3 do.
<body>
<svg viewBox="-42 0 512 512.002" xmlns="http://www.w3.org/2000/svg">
<path
d="m210.351562 246.632812c33.882813 0 63.222657-12.152343 87.195313-36.128906 23.972656-23.972656 36.125-53.304687 36.125-87.191406 0-33.875-12.152344-63.210938-36.128906-87.191406-23.976563-23.96875-53.3125-36.121094-87.191407-36.121094-33.886718 0-63.21875 12.152344-87.191406 36.125s-36.128906 53.308594-36.128906 87.1875c0 33.886719 12.15625 63.222656 36.132812 87.195312 23.976563 23.96875 53.3125 36.125 87.1875 36.125zm0 0"
/>
<path
d="m426.128906 393.703125c-.691406-9.976563-2.089844-20.859375-4.148437-32.351563-2.078125-11.578124-4.753907-22.523437-7.957031-32.527343-3.308594-10.339844-7.808594-20.550781-13.371094-30.335938-5.773438-10.15625-12.554688-19-20.164063-26.277343-7.957031-7.613282-17.699219-13.734376-28.964843-18.199219-11.226563-4.441407-23.667969-6.691407-36.976563-6.691407-5.226563 0-10.28125 2.144532-20.042969 8.5-6.007812 3.917969-13.035156 8.449219-20.878906 13.460938-6.707031 4.273438-15.792969 8.277344-27.015625 11.902344-10.949219 3.542968-22.066406 5.339844-33.039063 5.339844-10.972656 0-22.085937-1.796876-33.046874-5.339844-11.210938-3.621094-20.296876-7.625-26.996094-11.898438-7.769532-4.964844-14.800782-9.496094-20.898438-13.46875-9.75-6.355468-14.808594-8.5-20.035156-8.5-13.3125 0-25.75 2.253906-36.972656 6.699219-11.257813 4.457031-21.003906 10.578125-28.96875 18.199219-7.605469 7.28125-14.390625 16.121094-20.15625 26.273437-5.558594 9.785157-10.058594 19.992188-13.371094 30.339844-3.199219 10.003906-5.875 20.945313-7.953125 32.523437-2.058594 11.476563-3.457031 22.363282-4.148437 32.363282-.679688 9.796875-1.023438 19.964844-1.023438 30.234375 0 26.726562 8.496094 48.363281 25.25 64.320312 16.546875 15.746094 38.441406 23.734375 65.066406 23.734375h246.53125c26.625 0 48.511719-7.984375 65.0625-23.734375 16.757813-15.945312 25.253906-37.585937 25.253906-64.324219-.003906-10.316406-.351562-20.492187-1.035156-30.242187zm0 0"
/>
</svg>
</body>
When you need to animate properties on any tag inside the SVG such as color/fill, opacity, and movement.
Similar to 1.1 and 1.2 but in this case instead of pointing the src property of the image or the CSS URL to an external asset, you just put the SVG code there as value.
<img
src="data:image/svg+xml,%3Csvg viewBox='-42 0 512 512.002' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='m210.351562 246.632812c33.882813 0 63.222657-12.152343 87.195313-36.128906 23.972656-23.972656 36.125-53.304687 36.125-87.191406 0-33.875-12.152344-63.210938-36.128906-87.191406-23.976563-23.96875-53.3125-36.121094-87.191407-36.121094-33.886718 0-63.21875 12.152344-87.191406 36.125s-36.128906 53.308594-36.128906 87.1875c0 33.886719 12.15625 63.222656 36.132812 87.195312 23.976563 23.96875 53.3125 36.125 87.1875 36.125zm0 0' /%3E%3Cpath d='m426.128906 393.703125c-.691406-9.976563-2.089844-20.859375-4.148437-32.351563-2.078125-11.578124-4.753907-22.523437-7.957031-32.527343-3.308594-10.339844-7.808594-20.550781-13.371094-30.335938-5.773438-10.15625-12.554688-19-20.164063-26.277343-7.957031-7.613282-17.699219-13.734376-28.964843-18.199219-11.226563-4.441407-23.667969-6.691407-36.976563-6.691407-5.226563 0-10.28125 2.144532-20.042969 8.5-6.007812 3.917969-13.035156 8.449219-20.878906 13.460938-6.707031 4.273438-15.792969 8.277344-27.015625 11.902344-10.949219 3.542968-22.066406 5.339844-33.039063 5.339844-10.972656 0-22.085937-1.796876-33.046874-5.339844-11.210938-3.621094-20.296876-7.625-26.996094-11.898438-7.769532-4.964844-14.800782-9.496094-20.898438-13.46875-9.75-6.355468-14.808594-8.5-20.035156-8.5-13.3125 0-25.75 2.253906-36.972656 6.699219-11.257813 4.457031-21.003906 10.578125-28.96875 18.199219-7.605469 7.28125-14.390625 16.121094-20.15625 26.273437-5.558594 9.785157-10.058594 19.992188-13.371094 30.339844-3.199219 10.003906-5.875 20.945313-7.953125 32.523437-2.058594 11.476563-3.457031 22.363282-4.148437 32.363282-.679688 9.796875-1.023438 19.964844-1.023438 30.234375 0 26.726562 8.496094 48.363281 25.25 64.320312 16.546875 15.746094 38.441406 23.734375 65.066406 23.734375h246.53125c26.625 0 48.511719-7.984375 65.0625-23.734375 16.757813-15.945312 25.253906-37.585937 25.253906-64.324219-.003906-10.316406-.351562-20.492187-1.035156-30.242187zm0 0' /%3E%3C/svg%3E"
/>
or
.user {
background-image: url("data:image/svg+xml,%3Csvg viewBox='-42 0 512
512.002' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='m210.351562
246.632812c33.882813 0 63.222657-12.152343 87.195313-36.128906
23.972656-23.972656 36.125-53.304687 36.125-87.191406
0-33.875-12.152344-63.210938-36.128906-87.191406-23.976563-23.96875-53.3125-36.121094-87.191407-36.121094-33.886718
0-63.21875 12.152344-87.191406 36.125s-36.128906 53.308594-36.128906 87.1875c0
33.886719 12.15625 63.222656 36.132812 87.195312 23.976563 23.96875 53.3125
36.125 87.1875 36.125zm0 0' /%3E%3Cpath d='m426.128906
393.703125c-.691406-9.976563-2.089844-20.859375-4.148437-32.351563-2.078125-11.578124-4.753907-22.523437-7.957031-32.527343-3.308594-10.339844-7.808594-20.550781-13.371094-30.335938-5.773438-10.15625-12.554688-19-20.164063-26.277343-7.957031-7.613282-17.699219-13.734376-28.964843-18.199219-11.226563-4.441407-23.667969-6.691407-36.976563-6.691407-5.226563
0-10.28125 2.144532-20.042969 8.5-6.007812 3.917969-13.035156 8.449219-20.878906
13.460938-6.707031 4.273438-15.792969 8.277344-27.015625 11.902344-10.949219
3.542968-22.066406 5.339844-33.039063 5.339844-10.972656
0-22.085937-1.796876-33.046874-5.339844-11.210938-3.621094-20.296876-7.625-26.996094-11.898438-7.769532-4.964844-14.800782-9.496094-20.898438-13.46875-9.75-6.355468-14.808594-8.5-20.035156-8.5-13.3125
0-25.75 2.253906-36.972656 6.699219-11.257813 4.457031-21.003906
10.578125-28.96875 18.199219-7.605469 7.28125-14.390625 16.121094-20.15625
26.273437-5.558594 9.785157-10.058594 19.992188-13.371094 30.339844-3.199219
10.003906-5.875 20.945313-7.953125 32.523437-2.058594 11.476563-3.457031
22.363282-4.148437 32.363282-.679688 9.796875-1.023438 19.964844-1.023438
30.234375 0 26.726562 8.496094 48.363281 25.25 64.320312 16.546875 15.746094
38.441406 23.734375 65.066406 23.734375h246.53125c26.625 0 48.511719-7.984375
65.0625-23.734375 16.757813-15.945312 25.253906-37.585937
25.253906-64.324219-.003906-10.316406-.351562-20.492187-1.035156-30.242187zm0 0'
/%3E%3C/svg%3E");
}
When the SVG doesn’t need interactivity and is light enough that we rather embed it in our HTML file than do an HTTP request for it.
There isn’t a one-size-fits-all approach when it comes to implementing SVGs on the web, it depends on which features you are looking for.
Thanks for reading and never stop learning! 😄
Working with SVG in HTML5–20 | HTML5 & CSS3 Fundamentals: Development for Absolute Beginners — MSDN
How to Use SVG Images in CSS and HTML — A Tutorial for Beginners — FreeCodeCamp
09: SVG with Data URIs — CSS Tricks
Displaying SVG in Web Browsers — Jenkov
A Practical Guide to SVGs on the web — SVG on the Web
Adding vector graphics to the Web — Learn web development — MDN