Modification SVG avec VueJS

jeudi 16 novembre 2023
Image par Mathieu LALLEMAND.
Mathieu LALLEMAND Photo de l'auteur

Dans le monde numérique d'aujourd'hui, où l'expérience utilisateur est au cœur des préoccupations, le choix des formats d'images revêt une importance cruciale. Le format SVG, acronyme de Scalable Vector Graphics, émerge comme un outil incontournable pour les entreprises et les développeurs soucieux de fournir des contenus visuels de haute qualité et adaptables à toutes les tailles d'écrans. Comprendre les avantages et les fonctionnalités du SVG peut ouvrir de nouvelles perspectives en matière de conception graphique et d'optimisation des performances web.

Qu'est-ce que le format SVG ?

Le format SVG est un langage de balisage basé sur le XML (eXtensible Markup Language) spécialement conçu pour représenter des graphiques vectoriels bidimensionnels. Contrairement aux formats d'images traditionnels tels que JPEG ou PNG, qui utilisent une grille de pixels, le SVG utilise des coordonnées mathématiques pour décrire des formes, des lignes, des courbes et des couleurs. Cette caractéristique vectorielle confère au SVG une extensibilité et une adaptabilité exceptionnelles, quel que soit l'appareil sur lequel il est affiché.

Adaptabilité et Rétrocompatibilité

L'un des principaux avantages du SVG réside dans sa capacité à s'ajuster dynamiquement à différentes résolutions d'écran sans perte de qualité. Que votre public consulte votre site web sur un smartphone, une tablette ou un écran d'ordinateur, les graphiques SVG demeurent nets et précis. Cette adaptabilité automatique élimine la nécessité de créer des versions multiples d'une même image pour différents appareils, simplifiant ainsi le processus de développement et d'optimisation.

Une conséquence heureuse de cet avantage est la capacité de zoomer sur une image sans perdre de qualité. C'est idéal dans le cas de plans de zones de stokages dans les logiciels que nous créons chez NCI.

De plus, le SVG est rétrocompatible, ce qui signifie que les anciens navigateurs peuvent également afficher des graphiques SVG sans problème majeur. Cela offre une solution pratique pour les entreprises cherchant à maintenir une expérience utilisateur homogène, même pour les utilisateurs disposant de technologies plus anciennes.

Interactivité et Animations

Le SVG va au-delà de la simple représentation statique des graphiques. Il offre des possibilités d'interactivité et d'animations, ouvrant la voie à des expériences utilisateur plus riches. Les développeurs peuvent incorporer des fonctionnalités interactives directement dans les images SVG, offrant ainsi une expérience utilisateur immersive. Cela peut être particulièrement utile pour les présentations, les infographies interactives, ou même les interfaces utilisateur sophistiquées.

Optimisation du Référencement et de la Performance Web

Les moteurs de recherche accordent une importance croissante à la performance des sites web. En utilisant le format SVG, les entreprises peuvent améliorer la vitesse de chargement de leurs pages, ce qui a un impact positif sur le référencement. Les fichiers SVG sont souvent plus légers que leurs homologues bitmap, réduisant ainsi la charge sur les serveurs et accélérant le temps de chargement des pages.

Intégration Facile dans le Code HTML et CSS

Intégrer des images SVG dans une page web est extrêmement simple. Les balises <svg> peuvent être directement incorporées dans le code HTML, et les styles peuvent être appliqués avec des feuilles de style en cascade (CSS). Cette facilité d'intégration permet aux développeurs de travailler de manière plus efficace et de maintenir un code plus propre et plus lisible.

Utilisation avec vueJS :

Pour illustrer la capacité du SVG à intéragir avec un environnement Javascript, je vous ai réalisé un petit projet de démonstration. L'idée est de voir la simplicité avec laquelle il va être possible de modifier la couleur, ou l'affichage de portions d'un fichier SVG, dynamiquement avec VueJS

Voici le code :

<script setup lang="ts">
import { reactive } from "vue";
const shapeNames = ["a", "b", "c", "d"];

const shape = reactive({
visible: {
a: true,
b: true,
c: true,
d: true,
},
class: {
a: "bg-black",
b: "bg-red",
c: "bg-green",
d: "bg-blue",
},
});

function switchId(item: string) {
shape.visible[item] = (shape.visible[item]) ? false : true;
}

function colorId(item: string, color: string) {
shape.class[item] = color;
}
</script>

<template>
<h1>Demo SVG Image</h1>

<div class="bordered">
<svg version="1.2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 300 300" width="300" height="300">
<path v-show="shape.visible.a" id="TestA" :class="shape.class.a" d="m32 157h68v71h-68z"/>
<path v-show="shape.visible.b" id="TestB" :class="shape.class.b" d="m124 64h146v52h-146z"/>
<path v-show="shape.visible.c" id="TestC" :class="shape.class.c" d="m196 155h36v79h-36z"/>
<path v-show="shape.visible.d" id="TestD" :class="shape.class.d" d="m34.3 124.7c-8.5-8.6-13.3-20.1-13.3-32.2 0-12.1 4.8-23.6 13.3-32.2 8.6-8.5 20.1-13.3 32.2-13.3 12.1 0 23.6 4.8 32.2 13.3 8.5 8.6 13.3 20.1 13.3 32.2 0 12.1-4.8 23.6-13.3 32.2-8.6 8.5-20.1 13.3-32.2 13.3-12.1 0-23.6-4.8-32.2-13.3zm69.2-32.2c0-20.4-16.6-37-37-37-20.4 0-37 16.6-37 37 0 10.5 4.4 19.9 11.4 26.7v-21c0-2.4 1.9-4.3 4.3-4.3 2.3 0 4.2 1.9 4.2 4.3v27.1c5.1 2.7 11 4.2 17.1 4.2 6.1 0 12-1.5 17.1-4.2v-27.1c0-2.4 1.9-4.3 4.2-4.3 2.4 0 4.3 1.9 4.3 4.3v21c7-6.8 11.4-16.2 11.4-26.7zm-58.6-4.7c-1.4 1.4-3.7 1.5-5.1 0.2-1.4-1.4-1.5-3.6-0.1-5 2.5-2.8 6.2-4 9.7-4 3.4 0 7.1 1.2 9.7 4 1.3 1.4 1.3 3.6-0.2 5-1.4 1.3-3.7 1.3-5-0.2-1-1-2.6-1.7-4.5-1.7-1.9 0-3.6 0.7-4.5 1.7zm29 0.2c-1.4-1.4-1.5-3.6-0.1-5 2.6-2.8 6.2-4 9.7-4 3.4 0 7.1 1.2 9.7 4 1.3 1.4 1.3 3.6-0.2 5-1.4 1.3-3.6 1.3-5-0.2-1-1-2.6-1.7-4.5-1.7-1.9 0-3.5 0.7-4.5 1.7-1.4 1.4-3.6 1.5-5.1 0.2zm-7.4 7.3c4.7 0 8.5 3.9 8.5 8.6v5.7c0 4.7-3.8 8.5-8.5 8.5-4.7 0-8.5-3.8-8.5-8.5v-5.7c0-4.7 3.8-8.6 8.5-8.6z"/>
</svg>
</div>

<hr />
<table>
<tr>
<th>Bottom left square</th>
<th>Top right rectangle</th>
<th>Bottom right rectangle</th>
<th>Top left crying face</th>
</tr><tr>
<td v-for="shapeName of shapeNames" :key="shapeName">
<button @click="switchId(shapeName)">Toggle Visibility</button>
<button @click="colorId(shapeName, 'bg-black')">BLACK</button>
<button @click="colorId(shapeName, 'bg-red')">RED</button>
<button @click="colorId(shapeName, 'bg-green')">GREEN</button>
<button @click="colorId(shapeName, 'bg-blue')">BLUE</button>
</td>
</tr>
</table>
</template>

<style scoped>
.bg-black { fill: #000000 }
.bg-red { fill: #ff0000 }
.bg-green { fill: #00ff00 }
.bg-blue { fill: #0000ff }
</style>

Vous l'aurez remarqué, la structure même du SVG supporte les ID html et les attribut :class et v-show de VueJS. Un vrai jeu d'enfant.

Je vous invite à tester le code par vous même en vous rendant ICI

Conclusion

En résumé, le format SVG offre aux entreprises et aux développeurs une solution polyvalente pour la gestion des graphiques sur le web. Son adaptabilité, sa rétrocompatibilité, son potentiel d'interactivité et son impact positif sur la performance web en font un choix judicieux pour les projets numériques modernes. En intégrant intelligemment le SVG dans sa stratégie de conception et de développement, NCI peut offrir des expériences utilisateur de qualité supérieure tout en optimisant leurs performances en ligne.

Il est clair que le SVG est bien plus qu'un simple format d'image ; c'est un outil essentiel pour rester compétitif dans le paysage numérique en constante évolution.