Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Inline SVG vs SVG File Performance

Tags:

html

svg

web

People also ask

Should you use inline SVG?

Inline SVGs have many advantages over externally embedded SVG files. Above all, the interaction with CSS is significantly easier, as SVG can be treated the same way all other elements of your document are treated via CSS. This is a decisive advantage, especially for interactions like hover effects.

Is inline SVG bad?

According to Sitepoint, inline SVG is better for accessibility than standard SVG, the most obvious point being the clarity at any size.

Does SVG affect performance?

SVGs are Resolution-Independent From the point of view of file size, it doesn't really matter at what size the image is rendered, simply because those instructions remain unchanged.

Do SVG files load faster?

SVG code is loaded faster because there is no need for an HTTP request to load in an image file. The time taken for SVG code is only rendering time. There can be numerous editing and animating opportunities for SVG code like you said.


Pros for inline:

  • Fewer http requests;
  • You can use css fill property and change the color;
  • Svg is part of the content, so it is clickable and you can insert text;

Pros for separate file:

  • Svg files can be cached;
  • You don't see multiple lines of irelevant code in your files;
  • If you need to change it later then you just change one file;

There is no universal approach. It really depends on many things, but here some basic strategies which can be used separately or combined.

If we have:

  • Small number of SVG(s) with < 5k file size each–inline them in HTML. Compressed gzip/brotli each will be around 1k. Any small number multiplied by 1k is better than same number of additional requests, no matter cached or not.

  • Huge number of small SVG(s) < 5k - Make SVG sprite

  • Any number of big SVG(s) > 5k and let's say we do not need to access SVG properties via CSS or JS. Then <img src="name.svg">

  • Any number of SVG(s), but we do need to use CSS to change a SVG property or lets say animate some SVG property. The only viable option is inline svg.

  • If we need SVG(s) for backgrounds but they are < than 5k each:

    .bg { background: url('data:image/svg+xml;utf8,<svg ...> ... </svg>'); }

  • If we need SVG(s) for backgrounds but they are > than 5k each:

    .bg { background: url('images/file.svg'); }

  • I have never had a chance to try SVG sprite as background, but it is an option too


Inline SVGs would reduce the number of HTTP requests, so it should make the page load faster the first time someone's visiting. But the drawback is that your SVGs won't be cached in the browser and therefore it will have to be loaded every time. I'd say if you're only using a few SVGs (like 10 or so), inline them; but if you have many, go with img+background-image.

You may also want to consider using SVG definitions and using the SVG use tag to reference SVG definitions. This method is pretty good; especially if you need to repeat an SVG multiple times in your page. More info on this technique: http://css-tricks.com/svg-sprites-use-better-icon-fonts/

My web app can also help you easily make these SVG definition & use pairs.


Claudiu Creanga, you are correct on most, but not on the last one :)

Concerning file SRC: "If you need to change it later then you just change one file;"

The file can be a separate SVG as Inline also. Just include the XML/text source via PHP for instance:

<?php include_once($_SERVER['DOCUMENT_ROOT'] . '/img/icon-home.svg'); ?>

I'm using this tactic since I do CSS3 animations on my icons. This way you have the original reference file for modifying in a vector program and simple upload will fix all inline code. Object and path ID's inside the SVG won't change if you just rearrange or manipulated them.