SVG Sprites vs Individual Icons: Performance Data from a Real Website Redesign

June 26, 2026 · 5 min read

A client came to me last month with a complaint: their e-commerce site felt sluggish on product listing pages. 47 product categories, each with its own SVG icon loaded as a separate file. That's 47 HTTP requests just for icons — before any product images, before any CSS, before the page was usable.

I merged them into a single SVG sprite. The result: page load dropped from 6.2 seconds to 4.4 seconds on a simulated 4G connection. Here's the before/after data and exactly how I did it.

The Numbers: Before vs After

Metric47 Individual SVGs1 Sprite SheetChange
HTTP requests (icons only)471-98%
Total icon payload172KB68KB-60%
Time to First Paint6.2s4.4s-1.8s
Lighthouse Performance6487+23 pts
First Contentful Paint3.1s1.9s-1.2s

The payload reduction came from eliminating redundant SVG markup. Each individual icon file had its own <svg> wrapper, <xml> declaration, and metadata header — roughly 2KB of overhead per file that was identical across all 47 icons. The sprite consolidates that overhead into one wrapper.

The biggest win wasn't file size — it was latency. On a 4G connection with 100ms round-trip time, 47 sequential requests add up. Browsers can parallelize some requests, but HTTP/2 concurrency maxes out around 6-8 per connection for most servers. That means sequential blocking for the later requests. One file = zero queueing.

How I Built the Sprite

The sprite pattern is simpler than most people think. You create one SVG file with all your icons, each wrapped in a <symbol> with a unique ID, then reference them with <use>:

<svg xmlns="http://www.w3.org/2000/svg" style="display:none">
  <symbol id="icon-cart" viewBox="0 0 24 24">
    <path d="M7 18c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zM1 2v2h2l3.6 7.6L5.2 14c-.6.9-.1 2 1.1 2h12v-2H7.4c-.1 0-.2-.1-.1-.2L8.1 12h7.5c.8 0 1.4-.4 1.8-1l2.9-5.3c.1-.3 0-.7-.4-.7H5.2L4.3 2H1z"/>
  </symbol>
  <symbol id="icon-search" viewBox="0 0 24 24">
    <path d="M15.5 14h-.8l-.3-.3c1-1.1 1.6-2.6 1.6-4.2C16 5.9 13.1 3 9.5 3S3 5.9 3 9.5 5.9 16 9.5 16c1.6 0 3.1-.6 4.2-1.6l.3.3v.8l5 5 1.5-1.5-5-5zm-6 0C7 14 5 12 5 9.5S7 5 9.5 5 14 7 14 9.5 12 14 9.5 14z"/>
  </symbol>
</svg>

<!-- Usage -->
<svg class="icon"><use href="#icon-cart"></use></svg>

The key detail: style="display:none" on the sprite SVG prevents it from taking up space in the layout. The browser still parses the symbols and makes them available to <use> references elsewhere on the page.

When Individual SVGs Make More Sense

The sprite pattern isn't always the right answer. I don't use it when:

For my client's case — 47 static category icons that change once a quarter — the sprite was the clear winner.

Converting Sprite Icons to PNG for Documentation

One workflow note: the client's marketing team needed PNG versions of individual icons for their partner portal and email templates. Since the icons were now in a sprite, extracting individual PNGs meant pulling them back out.

I used svg2png.org — copy the individual <symbol> content into a standalone SVG, convert to PNG at 2x resolution. The whole batch took about 10 minutes for all 47 icons. For other designers facing the same situation, I recommend keeping a folder of the original individual SVGs alongside the sprite file. Storage is cheap; rebuilding 47 icons from a sprite file is not.

The performance lesson here isn't really about sprites — it's about HTTP requests. Every file on your page costs a round trip. SVG icons are tiny files, so the download time per file is negligible, but the connection overhead stacks up fast. Consolidate aggressively. Your users on slow connections will notice the difference even if your DevTools waterfall looks fine on office Wi-Fi.

Jamie Park Written by Jamie Park — UI/UX Designer. I redesign websites and measure every millisecond. More about me →