SVG : attribut viewBox

Je l'avoue ... je vous ai menti jusqu'à présent. Vous avez pu remarquer que pour les pages précédentes de ce tuto et même sur le petit écran d'un smartphone les zones de dessin SVG s'adaptent parfaitement à l'écran alors qu'officiellement elles font le plus souvent 900 pixels de large. Or sur un écran de smartphone vous n'avez jamais 900 pixels de large (et sur une tablette uniquement en mode "paysage").

En fait le code SVG interne que je vous ai indiqué pour certains exemples précédents n'est pas tout à fait le vrai code ...
Ainsi vous avez souvent lu que le code de la balise SVG était par exemple : <svg width = '900' height = '600' ...
Alors qu'en fait le code réel était : < svg width = '60%' height = 'auto' ...viewBox ="0 0 900 600" ...

L'attribut viewBox de la balise SVG est incontournable lorsqu'on veut que l'image vectorielle dessinée directement dans la page (code SVG interne) soit adaptative c'est à dire s'affiche correctement sur tous types d'écrans (de l'écran de PC de bureau au smartphone).

J'avais déjà évoqué mais sans insister, la notion de viewBox dans la page relative aux rectangles.

Coucher de soleil sur la mer : code erroné

Le rendu

Le code correspondant

... <style> .orange_demi {fill-opacity : 0.5 ; fill : orange ; } ... <svg width ="800" height ="400" style ="background :skyblue;" > <defs> <filter id="flou"> <feGaussianBlur stdDeviation="9" /> </filter> </defs> <circle cx="400" cy="200" r="100" class ='orange_demi' filter ="url(#flou)"/> <rect x ='0' y = '200' width = '800' height = '200' fill = 'navy' fill-opacity ="0.7" /> </svg> ...

Quand vous affichez cette page avec votre smartphone OU votre tablette en mode portrait, le texte apparait en caractères minuscules (et est donc illisible).
En effet le navigateur veut afficher tout le canevas SVG et donc il "dézoome" la page.
Et si vous zoomez pour rendre le texte lisible c'est alors l'image vectorielle qui 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 de son conteneur (et non plus en pixels).

Coucher de soleil sur la mer : bonne solution

Testez l'affichage de cette page sur mon smartphone et sur votre tablette.

Le rendu

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

Le code correspondant

Il est exactement identique à celui de la première image vectorielle sauf que dans la balise SVG il y a désormais l'attribut viewBox et les valeurs des attributs width et height on été modifiés.
Le code de la balise SVG est alors :

... <svg width ="80%" height ="auto" viewBox ="0 0 800 400" ... > ...

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 nouveau 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 les attributs width & height de la balise SVG précisent désormais l'affichage de l'image dans la page.

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 SVG de chaque canevas

<svg width="44%" height="auto" viewBox="0 0 150 100" class ="de_front"> <rect x="0" y="0" width="150" height="100" fill="red"/> <circle cx="75" cy="50" r="45" fill="green"/> <text x="75" y="55" font-size="25" text-anchor="middle" fill="white">SVG</text> </svg>

Les deux canevas ont exactement le même code !

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 !
Retour menu