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 & CSS : animer un canevas SVG via le CSS

Si vous avez lu mon tuto (dans ce même site) sur CSS, vous savez que depuis la version 3 il est possible d'animer des éléments HTML.
Sachez que vous pouvez aussi animer les objets SVG.

Un exemple basique pour commencer

Thème : un rond devient de plus en plus gros et de plus en plus opaque puis c'est l'inverse.
Il change aussi de couleur en passant du rouge au vert.

Solution envisagée

Le code SVG :

Le code CSS gère toute l'animation :

À chaque étape du "keyframes", je change l'opacité, la valeur du rayon, la couleur de fond.
Ce code fonctionnera lorsque la version 2 de SVG sera implémentée par les navigateurs.
Il fonctionne déjà avec Chrome qui a implémenté partiellement SVG 2 !

Dans le cadre du SVG 1, les paramètres géométriques (r,cx,cy,rx, ry, width, height,etc.) doivent être passés en attributs (jamais en propriétés) ! Donc on ne peut pas encore manipuler ces paramètres dans un "keyframes" CSS. Il faut donc pour le moment combiner SMIL & CSS !

Solution retenue

Comme seul Chrome comprend le code ci-dessus, je ne peux retenir cette solution pour le moment.
La bonne solution consiste à mixer CSS et SMIL.

Le code SVG

Le SMIL (avec balise animate) doit gérer le rayon (paramètre géométrique).

Notez la balise animate à l'intérieur du conteneur circle pour modifier l'attribut "r".

Le CSS

Le CSS gère l'opacité et la couleur de remplissage (paramètres de style).

La propriété "r" a disparu dans le modèle d'animation.

Solution alernative

J'aurai pu animere uniquement via CSS en utilisant la propriété transform avec la commande scale. C'est cette solution que je vais évoquer dans le paragraphe suivant mais avec d'autres thèmes.

Vérifiez si vous avez compris

Observez l'animation SVG suivante :

Le carré bien noir devient un rond quasi transparent puis c'est l'inverse.
Il faut animer l'attribut rx et la propriété fill-opacity d'un rectangle.

Animation CSS basée sur "transform:scale" ou "transform:rotate"

Attention aux transformations de type "scale" ou "rotate" dans le cadre d'une zone de dessin SVG qui peuvent s'accompagner aussi d'une translation si certaines précautions ne sont pas prises ...

Ci-dessous variation automatique de la taille d'un triangle

Le code SVG correspondant

Le code CSS correspondant

Attention !

Pour un élément SVG le point d'origine d'une transformation est le coin haut gauche du canevas. Dans ce contexte, tout changement d'échelle s'accompagne aussi d'une translation.
Donc si vous ne voulez qu'un simple changement de taille de l'objet il faut utiliser la propriété transform-origin avec comme valeur "center center" OU "50% 50%" afin que l'origine de la transformation soit le centre du canevas.

La problématique est identique avec une rotation

Ci-dessous deux carrés : le premier pivote a partir du coin supérieur gauche de la zone de dessin et le second pivote autour du centre du canevas.
Valeur par défaut de transform-origin dans un contexte SVG : 0 0 c'est à dire le coin haut gauche de la zone de dessin.

Le code SVG :

Le code CSS :

Attention, pour un élément HTML transform-origin fait référence à l'élement lui-même alors qu'en SVG cette propriété fait référence à la zone de dessin.
Pour un élément HTML, la valeur par défaut de cette propriété est "center center" donc le centre de l'élément lui-même
Pour un élément SVG, la valeur par défaut est "0 0" donc le coin haut gauche du canevas.

Un petit schéma vaut mieux qu'un long discours.

Animation de texte

Animer un texte SVG avec CSS !

Le code SVG

Le code CSS

La balise SVG étant un élémént HTML, on peut lui appliquer un dégradé linéaire CSS.

Le texte change de direction à chaque cycle car dans la propriété animation il y a le paramètre alternate.

Déplacer des 'sprites' dans le canevas SVG

Le code du fichier SVG (extrait)

Regardez attentivement le code de la balise SVG début !
Ce code original a été généré par le logiciel Boxy SVG : éditeur en ligne de SVG proposé par Google.

Pour créer cette animation SVG, j'ai donc d'abord utilisé l'application Boxy SVG pour dessiner, ciel, arbres, route,etc.

Insertion des animations SVG dans une page web

Attention comme le fichier SVG contient des liens vers d'autres images, l'insertion dans la page de cette animation ne peut se faire qu'avec la balise object. J'ai donc écrit dans cette page web le code suivant :

Une animation 3D

Ci-dessous un jet qui atterit sur la piste.


L'animation 3D correspond à un fichier SVG. Je vous communique le code de ce fichier ci-dessous.
Ce fichier SVG comprend non seulement du SVG mais aussi du CSS.

Le code du fichier "atterisage.svg"

Commentaire

Rappel : dans le cadre d'un fichier SVG (code SVG externe) les espaces de noms '"namespaces") xmlns="http://www.w3.org/2000/svg" & xmlns:xlink="http://www.w3.org/1999/xlink" sont obligatoires.

Le canevas SVG a pour "background" une image vectorielle qui a été produite avec Inkscape (piste.svg).

Le document SVG comprend une feuille de style avec un "keyframes" ; ce modèle d'animation est appliqué à l'objet SVG identifié "jet".
Cet objet "jet" est le clone d'un modèle défini et identifié "avion".

Insertion de l'image vectorielle animée dans cette page

Pour les mêmes raisons que l'exemple précédent, la balise IMG ne convient pas ; il faut utiliser la balise OBJECT pour insérer le fichier SVG dans la page.

L'affichage "responsive" de l'image vectorialle assurée par le code ci-dessus via la classe "grand".