npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

svgpolyfill

v1.0.0

Published

Use external SVG spritemaps in any browser

Downloads

103

Readme

SVG for Everybody

[![NPM Version][npm-img]][npm] [![Build Status][ci-img]][ci]

[SVG for Everybody] adds [SVG External Content] support to [all browsers].

To use it now, include the script in your document.

<script src="/path/to/svgpolyfill.js"></script>
<script>svgpolyfill(); // run it now or whenever you are ready</script>

To support Internet Explorer 6-8, include the legacy script instead.

<script src="/path/to/svgpolyfill.legacy.js"></script>
<script>svgpolyfill(); // run it now or whenever you are ready</script>

As of v2.0.0, you must manually call svgpolyfill(). If you are using an AMD/CommonJS dependency loader then you may call it within the callback closure.

IE 6-8 require you to put the script in the <head> in order to shiv <svg> and <use> elements. For best results in IE, set [X-UA-Compatible] to ie=edge. This can be done with a response header from the server or the following HTML in the <head>.

<meta http-equiv="x-ua-compatible" content="ie=edge">

Usage

Create an SVG image.

map.svg:

<svg xmlns="http://www.w3.org/2000/svg">
	<symbol id="codepen" viewBox="0 0 64 64">
		<title>CodePen</title>
		<path etc.../>
	</symbol>
	<symbol id="youtube" viewBox="0 0 64 64">
		<title>YouTube</title>
		<path etc.../>
	</symbol>
	<symbol id="twitter" viewBox="0 0 64 64">
		<title>Twitter</title>
		<path etc.../>
	</symbol>
</svg>

This spritemap displays fine in Chrome, Safari 7.1+, Firefox, Edge 13+, Opera. [SVG for Everybody] polyfills the experience in Safari 6, IE 6+, and Edge 12.

<svg role="img" title="CodePen">
	<use href="map.svg#codepen"/>
</svg>
<svg role="img" title="YouTube">
	<use href="map.svg#youtube"/>
</svg>
<svg role="img" title="Twitter">
	<use href="map.svg#twitter"/>
</svg>

IE 6-8 requires a trailing slash / when using a self-closing <use/> element.

3 SVG logos

Browsers not supporting SVG fallback to images.

<svg role="img" title="CodePen">
	<img src="map.svg.codepen.png">
</svg>
<svg role="img" title="YouTube">
	<img src="map.svg.youtube.png">
</svg>
<svg role="img" title="Twitter">
	<img src="map.svg.twitter.png">
</svg>

By default, fallback images point to a PNG file in the same location as the SVG, only with the # hash replaced by a . dot and then appended with a .png extension. If you want to change this behavior, you can define your own fallback.

svgpolyfill({
	fallback: function (src, svg, use) {
		// src: current href String 
		// svg: current SVG Element 
		// use: current USE Element 

		return 'fallback.png'; // ok, always return fallback.png
	}
});

All <use> elements that are descendants of an <svg> are checked for external content. If you want to change this behavior, you can define your own validator.

svgpolyfill({
	validate: function (src, svg, use) {
		// src: current href String 
		// svg: current SVG Element 
		// use: current USE Element 

		return true; // ok, everything is valid
	}
});

You can override whether the script polyfills External Content at all (polyfill), or whether SVG should even be used over fallback images (nosvg).

svgpolyfill({
	nosvg: true, // shiv <svg> and <use> elements and use image fallbacks
	polyfill: true // polyfill <use> elements for External Content
});

Use of the nosvg option will requires you to use the legacy version of SVG for Everybody.

Implementation status

Modern browsers support external content in SVGs, except Edge. No frets; we can shim it.

| OS | Browser | SVG | External Content | Shimmed | |:---:|-------------------|:---:|:----------------:|:-------:| | * | Chrome 21+ | ✔ | ✔ | — | | * | Chrome 14-20 | ✔ | ✖ | ✔ | | * | Firefox 4+ | ✔ | ✔ | — | | * | Opera 23+ | ✔ | ✔ | — | | * | Opera Mini 8+ | ✔ | ✔ | — | | And | And. Browser 40+ | ✔ | ✔ | — | | And | And. Browser 4.1+ | ✔ | ✖ | ✔ | | iOS | iOS 8.1+ | ✔ | ✔ | — | | iOS | iOS 6-7 | ✔ | ✖ | ✔ | | OSX | Saf 7.1+ | ✔ | ✔ | — | | OSX | Saf 6 | ✔ | ✖ | ✔ | | Win | Edge 13+ | ✔ | ✔ | — | | Win | Edge 12 | ✔ | ✖ | ✔ | | Win | IE 9 - 11 | ✔ | ✖ | ✔ | | Win | IE 6 - 8 | ✖ | ✖ | ✔ |

As you can see, all major browsers support external content.

We had been waiting on Edge, previously, but [David Storey], Edge’s project manager assured us that native support for external content in SVGs was high on their checklist. We would [track progress] and [vote for attention] to this issue. Then, just as I predicted...

I have complete faith in the Microsoft Edge team and absolutely expect support to arrive within the next few months.

— Jon Neal (August, 2015)

All of our [dreams came true].

Readability and accessibility

SVGs are compelling to use for many reasons, and one of them is their ease of accessibility.

Within your spritemap, have each sprite use a <title> element to identify itself.

<symbol id="codepen">
	<title>CodePen</title>
	<path etc.../>
</symbol>

When this sprite is used, its title will be read aloud in JAWS and NVDA. Then, within your document, each sprite may use a title attribute to identify itself.

<svg title="CodePen">
	<use href="map.svg#codepen"/>
</svg>

That title will be read aloud in VoiceOver and NVDA. At present, the title attribute is the only way to properly read aloud an SVG in VoiceOver. I’ll let you know if this changes.

All together, use the title attribute in your document and the title element in your SVG.

ARIA roles may also be used to provide even more information to assistive technology.

When a sprite is merely decoration, use role="presentation".

<a href="//twitter.com/jon_neal"><svg role="presentation">
	<use href="map.svg#twitter"/>
</svg> Find me on Twitter</a>

Otherwise, use role="img" and remember to add a description.

<a href="//twitter.com/jon_neal"><svg title="Find me on Twitter" role="img">
	<use href="map.svg#twitter"/>
</svg></a>

Further reading

Optimized SVGs

SVG files, especially exported from vector tools, often contain tons of unnecessary data such as editor metadata, comments, hidden elements, and other stuff that can be safely removed without affecting SVG rendering result.

Use a tool like [SVGO] to optimize SVG spritemaps.

$ [sudo] npm install -g svgo
$ svgo spritemap.svg