I enjoyed Micah R Ledbetter’s SVG triangle of compromise and generally think it’s a fair analysis of how any-which-way you use SVG on a page, you’re giving up some kind of nice ability it could have. For instance, if you use SVG through an <img>
tag, it’s cached nicely, but you give up on CSS reaching in there to style things. If you drop it in as <svg>
, you can style, but then it’s not cached well for repeated uses.
Then Scott Jehl chimed in with a way to “have it all”. The crux of it is using the SVG <use>
element to reference an SVG file (so you get caching and sizing) and you can set CSS --custom-properties
that “pierce” the shadow DOM that <use>
creates (that’s right, SVG can have a shadow DOM just like web components) and allow for styling.
This does solve all three angles, the caveats being 1) you can’t cache the SVG (“sprite”, it’s usually called when you combine icons into a single file) on a different domain. 2) it’s a manual pain to set up SVGs to be entirely styled in this way. Scott’s tool might help with 2, but browsers need to help with 1.