Optimisation et factorisation de sprite SVG

Nous connaissons les « sprites » SVG classiques, avec l'utilisation de use. Cette méthode implique souvent de charger le code du SVG et des symbol au coeur même de la page HTML.
L'inconvénient de cette pratique (même si elle a des avantages…) est que ce fichier est présent dans toutes les pages du site, le plus souvent. En cas de mise à jour du sprite, il faut invalider le cache côté serveur (ou du CDN) et côté client.
Un autre petit souci est qu'il faut faire appel à un polyfill pour certains navigateurs et que cet usage devient compliqué lorsque l'on souhaite utiliser ce même fichier en propriété background-image dans un fichier CSS.

Imaginons les icones suivantes :

Séchage en machine à température modérée (60 °C maximum)
Séchage en machine à température modérée (80 °C maximum)
Séchage en machine interdit
Lavage en machine 30 °C, programme coton
Lavage en machine 30 °C, programme synthétique
Lavage en machine 30 °C, programme laine
Lavage en machine prohibé

Pour construire le SVG nécessaire, nous allons découper les icones et factoriser les éléments communs.
Nous avons donc besoin d'une bassine (4 fois) , d'une croix (2 fois) , d'une température de 30 °C (3 fois) , d'un point (3 fois) , d'un cercle (3 fois) , d'un carré (3 fois) , et enfin d'un trait (3 fois) .

Maintenant, nous allons assembler tout ce petit monde pour construire nos icones, avec pour effet de n'avoir qu'un seul symbol à mettre à jour en cas de modification graphique.
Commençons à construire notre SVG.

Maintenant, nous mettons notre belle bassine dans son symbol avec un identifiant.
A noter le fait de ne pas mettre de viewBox sur le symbol, partant du principe que toutes nos icones sortiront en 32x32 (nous le verrons à l'étape suivante).

Normalement, nous devrions nous arrêter là. Mais comme nous voulons utiliser ce SVG en ressource externe ET via des background-image, nous allons compléter notre fichier avec des balises view qui seront appelées via leur identifiant, suivies de balises use pointant sur les symboles à l'intérieur du même fichier.
Plus clairement, ça donne ceci :

Le fichier complet avec quelques options supplémentaires (CSS, script) est accessible ici : sample_xlinks.svg
Il permet de générer 43 icones à partir de 19 balises symbol. Taille des données transférées ~5.7 ko (gzip), mise en cache côté client, centralisation des assets, maintenance facilitée, etc….

Kortic implémente bien entendu ce type de SVG :

Mise en oeuvre

Pour l'exemple, nous affichons l'icone de séchage prohibé en machine dans les consignes d'entretien de linge.

Note : l'utilisation de ce type de sprites SVG permet de s'affranchir de la gestion des positionnements en background-image CSS.

  • Appel par <img src="/svg/sample_xlinks.svg#i-drying-forbidden" alt="" /> affichera 
  • Appel par <img src="/blank.gif" alt="" class="drying-forbidden"/> affichera  avec la CSS ad hoc ci-dessous.

Et gâteau sous la cerise : compatible IE9 et plus récents.
Aller… y'a plus qu'à !!
Si besoin ou remarque(s), ça se passe ici : contact

Utilisation des sources
Les sources de « Optimisation et factorisation de sprite SVG » proposées par sont mises à disposition selon les termes de la licence Creative Commons CC BY-NC-SA 4.0.
(licence Creative Commons CC BY-NC-SA 4.0 : Attribution - Pas d'utilsation commerciale - Partage dans les mêmes conditions)
Si vous souhaitez participer, même modestement, au maintien du site et pour son usage, vous pouvez cliquer sur le joli bouton…
Un petit sou avec
Voir aussi…
  • Lazy Load Intersection Observer Lazy Load avec IntersectionObserver API pour images, picture, iframe, etc. Chargement lazy load de contenu, chargement différé de contenu de page web, script lazy loading
  • Vérifier un numéro de carte bancaire Vérification de carte bancaire, script de validation de carte bancaire. Contrôle de format de numéro de carte bancaire, algorithme de Luhn carte de crédit Visa, Mastercard, Maestro, CB, Carte Bancaire, Discover Card, American Express, JCB Cards
  • Owl Carousel multiple Gérer plusieurs carrousels/sliders sur une seule page avec Owl Carousel 2. Manage multiple carousels/sliders on one page with Owl Carousel 2
  • Conversion SVG/CSS Encodage SVG pour CSS compatible Sass, SVG encoder, base64 SVG pour CSS. SVG to base64, Convert SVG to Data URI for css
  • Optimisation SVG Intégration SVG via xlink/use/symbol, factorisation de symbol SVG, optimisation SVG web performance
  • SVG Responsive Utilisation des media queries internes à SVG
  • Design, flux et accessibilité jQuery Responsive layout logical DOM plugin
  • Lightbox Responsive et Accessible Lightbox images jQuery Responsive accessible a11y. Automatisation d'une Lightbox multipages. Lightbox image unique ou multiple. Lightbox responsive et accessible a11y wcag
  • Tooltip (infobulle) a11y Tooltip (infobulle) compatible a11y et SEO, naviguable au clavier, accessible par lecteur d'écran. Infobulle accessible, accessible tooltip
  • Script de contrôle de code postal Script de contrôle de codes postaux internationaux. Script zipcode, zipcode validator. Valider un code postal à la saisie, javascript contrôle de code postal
  • Widget calendrier PHP Construction d'un widget « calendrier » en PHP et asynchrone
  • Responsive background-image jQuery responsive background-image plugin, plugin jQuery responsive background images
  • Drapeaux ISO 3366 SVG Drapeaux nationaux vectoriels normés ISO alpha 2, alpha 3 et numérotation Organisation des Nations Unies (ONU). Drapeaux SVG pour internationalisation de sites multilingues.
  • Layout rigolo Une autre approche pour définir un layout de page responsive.
  • Serveur d'images placeholders Serveur d'images placeholder pour le développement front-end
  • Générateur de noms API de génération de couples prénom/nom aléatoires.
  • Générateur images TTF API de génération de textes en images.
2020-12-06