Accueil

Traduction

Dessiner avec SVG - sommaire

Dessiner avec SVG - recherche

L'auteur : Patrick Darcheville

Vous pouvez me contacter via Facebook pour questions & suggestions : Page Facebook relative à mon site

SVG : l'attribut viewBox

Je l'avoue ... je vous ai menti jusqu'à présent. Même sur un petit écran (smartphone),les canevas SVG s'adaptent parfaitement à l'écran. Or officiellement elles font parfois 900 pixels de large ... Sur un écran de smartphone vous n'avez jamais 900 pixels de large ...

En fait le code SVG interne que je vous ai indiqué jusqu'à présent, n'est pas le véritable code ...
Ainsi vous avez pu lire : <svg width = '900' height = '600' ...
Alors qu'en fait le vrai code de la balise SVG début c'est : < svg width = '60%' viewBox ="0 0 900 600" ...
Pour que le canevas soit 'responsive' sa largeur doit être exprimée en % et un nouvel attribut apparait : viewBox.

L'attribut viewBox de la balise SVG est incontournable lorsqu'on veut que l'image vectorielle soit "responsive" c'est à dire s'affiche proprement sur tous types de terminaux web (de l'écran de PC de bureau au smartphone).

Exemple : coucher de soleil

Mauvaise solution

Si vous affichiez cette page avec votre smartphone, le texte apparaitrait en caractères minuscules (et serait donc illisible). En effet le navigateur veut afficher tout le canevas SVG et donc il "dézoome" la page. Et si vous zoomez alors, pour rendre le texte lisible, l'image est rognée.
Donc tout cela n'est guère satisfaisant. Il faut donc exprimer la largeur de la zone de dessin SVG dans la page en pourcentage et non plus en pixels.

La bonne solution

Le code

Comme les coordonnées des formes ne peuvent plus être calculées par rapport aux valeurs des attributs width & height, elles le seront grâce aux valeurs du viewBox qui définit donc le système de coordonnées du canevas SVG.
Donc résumons nous ! Les quatre valeurs de l'attribut viewBox servent à positionner et dimensionner les formes dans le canevas SVG alors que l'attribut width affiche de façon "responsive" la zone de dessin.

Le rendu

L'image vectorielle s'adapte à la taille de l'écran même à celle d'un smartphone.

Le viewBox : autre exemple

Ci-dessous deux canevas SVG de front.
Les deux images ne sont jamais rognées mais s'adaptent à la largeur de l'écran (page adaptative).

SVG SVG

Le code de chaque canevas

Notez le "width" à 44% et les valeurs du viewBox qui créent un ratio de 1.5 entre largeur et hauteur.
Remarquez aussi l'attribut class associé à la balise SVG.

Extrait de la feuille de style de la page :
.de_front {display : inline-block ; margin :1% ; vertical-align : top ;}

Ainsi les éléments affectés de cette classe sont des boites qui se positionnent côte à côte !

Avant de coder

Le concept de viewBox facilite l'encodage.
J'ai imaginé un canevas SVG dont la valeur du viewBox sera "0 0 200 200"
Ce canevas doit contenir : un hexagone et une étoile à 6 branches ; deux formes qui s'inscrivent parfaitement dans un cercle.

Le schéma préalable

J'ai réalisé un schéma sur papier à petits carreaux qui me donne en lecture directe les coordonnées des points des deux chemins : un cm = 20px.
Ci-dessous le croquis :

Le code

A partir du croquis l'encodage devient très rapide et fiable.

Le rendu

Si vous voulez agrandir ce canevas dans la page web, augmentez la valeur de l'attribut width (100% ? ). Mais surtout, ne modifiez pas les valeurs du viewBow puisque toutes les coordonnées sont basée sur un repère 200 par 200.