Animez Votre Site Avec Css3
Animez Votre Site Avec Css3
Animez Votre Site Avec Css3
avec CSS3 !
Par Adrien Guret (KorHosik)
www.openclassrooms.com
2/22
Sommaire
Sommaire ........................................................................................................................................... 2
Lire aussi ............................................................................................................................................ 1
Animez votre site avec CSS3 ! ........................................................................................................... 3
Le principe des transitions ................................................................................................................................................ 3
Notre premire transition ................................................................................................................................................... 3
Essayer ! ..................................................................................................................................................................................................................... 5
11
12
14
16
Q.C.M. ............................................................................................................................................................................. 20
Partager ..................................................................................................................................................................................................................... 21
www.openclassrooms.com
Sommaire
3/22
Par
www.openclassrooms.com
4/22
pour Firefox, Google Chrome, Safari et Opera. Ainsi, pour Firefox, il est prfrable d'crire -moz-transitionproperty, pour Google Chrome et Safari -webkit-transition-property et pour Opera -otransition-property.
Pour plus de clart dans ce tutoriel, les proprits seront utilises sans leur prfixe.
La proprit transition-property permet d'indiquer les proprits de notre lment qui doivent tre animes. Par dfaut,
sa valeur est fixe all , ce qui signifie que toutes les proprits seront sujettes la transition.
Si nous souhaitons appliquer des transitions sur plusieurs proprits, il suffit de les sparer par des virgules :
Code : CSS
p
{
Il nous faut maintenant utiliser la proprit transition-duration pour indiquer le temps que durera la transition entre
l'tat initial de la proprit et son tat final. Par dfaut, cette proprit vaut 0s, il n'y a donc pas de transition.
Il est possible d'indiquer un temps en secondes ou en millisecondes. Pour cela, il suffit d'ajouter respectivement s ou ms la
suite de notre valeur.
Code : CSS
p
{
Nos transitions sont dfinies, il ne nous reste plus qu' indiquer quand les utiliser ! Et c'est l que c'est magique : les transitions
auront lieu automatiquement ds que les proprits concernes seront modifies !
Modifions par exemple le style de nos paragraphes au passage de la souris. Je vous rappelle pour cela qu'il faut utiliser le
pseudo-format :hover :
Code : CSS
/* Style par dfaut de nos paragraphes
(= tat initial). */
p
{
/* Seules la couleur du texte et les dimensions
de nos paragraphes auront une transition. */
transition-property: color, width, height;
/* La transition durera trois secondes. */
transition-duration: 3s;
/* On stylise un peu plus nos paragraphes. */
width: 400px;
height: 200px;
color: #fff;
www.openclassrooms.com
5/22
background-color: #a5a5a5;
border: 2px solid #000;
margin: auto;
text-align: center;
Il ne nous reste plus qu' tester tout a avec du code HTML5, extrmement basique.
enregistr dans le fichier style.css.
Code : HTML
<!DOCTYPE html>
<html>
<head>
<title>Ma premire transition</title>
<meta charset="UTF-8" />
<link rel="stylesheet" type="text/css" href="style.css" />
</head>
<body>
<p>
Passez la souris sur moi !
</p>
</body>
</html>
Essayer !
L'avantage des transitions, c'est qu'elles ne sont pas bloquantes : si votre visiteur utilise un navigateur ne pouvant pas les
interprter, le changement d'tat des proprits se fera quand mme, seulement, il ne sera pas progressif.
Code : CSS
/* Style par dfaut de nos paragraphes
(= tat initial). */
p
{
/* Seules la couleur du texte et les dimensions
www.openclassrooms.com
6/22
Essayer !
Bien plus intressante, transition-timing-function permet de spcifier l'acclration de notre transition : celle-ci doitelle tre rapide au dbut puis lente la fin ? Doit-elle s'excuter vitesse constante ?
Cette proprit peut prendre les valeurs suivantes :
linear : la vitesse de transition est la mme du dbut la fin de la transition ;
ease : la transition commence doucement, s'acclre, puis se termine doucement. Il s'agit de la valeur par dfaut ;
ease-in : la transition s'acclre peu peu ;
ease-out : la transition ralentit peu peu ;
ease-in-out : la transition commence doucement, s'acclre, puis se termine doucement. Il s'agit en fait de la mme chose
que la valeur ease, sauf que l'effet est plus prononc ;
cubic-bezier(x,x,x,x) : la plus complique ! Cette valeur emploie la courbe de Bzier pour dfinir l'acclration de la
transition. Remplacez simplement les x par des valeurs comprises entre 0 et 1.
Je vous conseille fortement de consulter ce site. Ce dernier vous permet de dfinir et de choisir plus facilement les valeurs qui
correspondent le mieux vos attentes pour la proprit transition-timing-function. Slectionnez la valeur souhaite
dans la liste droulante et testez-la directement sur ce site ou bien modifiez la courbe d'acclration pour obtenir les valeurs
adquates sur la courbe de Bzier.
Dans le cas o nous souhaitons faire des transitions pour plusieurs proprits, il suffit de les ajouter la suite, chacune spare
par une virgule. Pour notre exemple, voici ce que a donne :
Code : CSS
www.openclassrooms.com
7/22
p
{
Essayer !
Un menu sympa !
Les transitions permettent de donner un ct vraiment trs sympathique nos pages web. En guise d'exercice, je vous propose
de raliser un petit menu dynamique, et ce uniquement en CSS : aucune ligne de JavaScript ne sera ncessaire !
Voici le code HTML de notre menu :
Code : HTML
<!DOCTYPE html>
<html>
<head>
<title>Un menu dynamique en CSS</title>
<meta charset="UTF-8" />
<link rel="stylesheet" type="text/css" href="style.css" />
</head>
<body>
<ul>
<li id="item1">
<a href="#lien1">
<span>
Description
</span>
</a>
</li>
<li id="item2">
<a href="#lien2">
<span>
Description
</span>
</a>
</li>
<li id="item3">
<a href="#lien3">
<span>
Description
</span>
</a>
</li>
<li id="item4">
<a href="#lien4">
<span>
Description
</span>
</a>
</li>
<li id="item5">
<a href="#lien5">
<span>
Description
</span>
</a>
</li>
</ul>
www.openclassrooms.com
8/22
</body>
</html>
Nous avons donc une liste contenant cinq lments. Chacun de ces lments possde un lien, possdant lui-mme une
description.
Je vous propose d'afficher cette liste de liens sous forme d'images cliquables : au passage de la souris sur une image, la
description associe s'affichera dynamiquement sur l'image.
Commenons tout d'abord par dfinir le style de base de notre liste :
Code : CSS
ul
{
/* On supprime les puces, on prcise une largeur
et on centre la liste par rapport la page. */
list-style: none;
width: 60%;
margin: auto;
}
li
{
/* On fixe les dimensions
des lments de notre liste. */
width: 150px;
height: 150px;
/* On met en forme le texte. */
text-align: center;
font-weight: bold;
/* On modifie l'affichage pour que
les lments soient sur la mme ligne. */
display: inline-block;
/* On ajoute une petite bordure
et on dfinit les marges. */
border: 1px solid #000;
margin: 10px;
padding: 0px;
/* Quitte faire du CSS3, autant
avoir des coins arrondis :p. */
border-radius: 10px;
/* On centre l'arrire-plan. */
background-position: center;
/* On modifie la position pour pouvoir ensuite
placer comme on le souhaite la description des liens. */
position: relative;
www.openclassrooms.com
9/22
Essayer !
Notre menu commence avoir de l'allure, mais nous avons encore du boulot ! Il serait par exemple mieux de pouvoir cliquer sur
toute l'image plutt que de devoir cliquer sur le texte de description. Pour cela, il suffit d'indiquer dans la feuille de style que le
lien doit prendre les mmes dimensions que son parent.
Code : CSS
li a
{
/* Pour fixer les dimensions d'un lien,
il est ncessaire de l'afficher en tant
qu'lment de type block. */
display: block;
width: 100%;
height: 100%;
text-decoration: none;
}
www.openclassrooms.com
10/22
top: 150px;
Voici donc la technique pour rendre invisible notre description : on l'affiche sous l'lment qui la contient. Rappelez-vous,
nous avons spcifi aux balises <li> que leur proprit overflow devait avoir pour valeur hidden : nos descriptions ne
s'afficheront pas.
Mais nous avons oubli un point important. Eh oui, nous n'avons pas indiqu la manire dont les transitions doivent ragir !
Code : CSS
li span
{
display: block;
height: 50px;
width: 100%;
color: #fff;
margin: 0px;
/* La taille des lignes est gale
la hauteur de l'lment. Cela permet
de centrer verticalement le texte. */
line-height: 50px;
/* Abusons du CSS3 en affichant
un arrire-plan semi-transparent. */
background-color: rgba(0,0,0,0.3);
/* Position absolue pour afficher
la description avec prcision. */
position: absolute;
/* L'ordonne de l'lment est gale
la hauteur de son parent (150px) :
la description sera donc situe sous
son parent. */
left: 0px;
top: 150px;
/* N'oublions pas les transitions ! */
transition-property: top;
transition-duration: 1s;
}
Pour afficher notre description, il suffit de jouer avec sa proprit top : c'est donc sur elle que nous voulons appliquer nos
transitions. J'ai choisi pour ma part une dure d'une seconde, a me semble bien. Je n'ai pas voulu m'embter avec des dlais et
des acclrations : les valeurs par dfaut me conviennent trs bien.
Il ne nous reste plus qu' indiquer quand modifier cette proprit top. Petite difficult ici : nous voulons modifier la position de
notre description uniquement lorsque la souris survole le parent de cette description.
Code : CSS
/* On modifie l'ordonne des descriptions contenues
dans un lment d'une liste survole par la souris. */
li:hover span
{
top: 100px;
}
www.openclassrooms.com
11/22
Essayer !
Et voil !
Nous avons obtenu un menu fort sympathique assez rapidement et sans vritable difficult puisqu'il n'y a que du code CSS !
Il est cependant possible d'utiliser JavaScript pour jouer avec les transitions CSS, c'est d'ailleurs ce que nous allons voir ds
maintenant.
www.openclassrooms.com
12/22
Et le fond marin (en lien parce que trop grand !).
Venant de Linternaute.com, mais vous l'aviez devin
Voici donc ce que je vous propose de faire. Notre page contiendra deux <div>. La premire aura pour fond notre ocan et
contiendra une image : le hublot.
La seconde <div> en contiendra huit autres : une pour chaque flche de notre tableau de bord.
Ce dernier se comportera de cette faon : quand la souris passera sur une flche, la vue que nous aurons de l'ocan travers le
hublot se dplacera dans la direction indique.
a peut vous paratre flou pour l'instant, mais je vous assure que c'est trs simple.
Tous les lments de notre page sont mis en place, il ne nous reste qu' styliser tout a.
Nous ne nous occuperons du code JavaScript qu' la fin, une fois que tout sera bien fix dans notre code CSS.
Commenons donc par traiter ce qu'il y a de plus facile : je propose dj de colorer le fond de notre page en gris, parce que le
blanc est un peu agressif. Centrons galement l'instruction Passez la souris sur les flches ! pour faire plus propre.
Code : CSS
body
{
background-color: #a5a5a5;
}
www.openclassrooms.com
13/22
h1
{
text-align: center;
}
Essayer !
Nous avanons bien !
Attaquons-nous maintenant au tableau de bord. Il contiendra les flches de contrle, raison de trois par ligne : chaque flche
tant large et haute de 45 pixels, le tableau de bord doit avoir pour dimensions 135 pixels de haut et de large. Je prfre galement
mettre sa position en relative afin de placer au pixel prs les flches qu'il contiendra.
Code : CSS
#controls
{
width: 135px;
height: 135px;
margin: auto;
position: relative;
}
Les flches ont toutes les mmes dimensions et la mme image de fond, ce n'est donc pas trop compliqu
Code : CSS
#controls div
{
width: 45px;
height: 45px;
position: absolute;
background-image: url('fleches.png');
background-repeat: no-repeat;
}
www.openclassrooms.com
14/22
Pour les flches, j'ai fait le choix d'employer la technique des sprites CSS : cela ne permet d'avoir qu'une seule image grer pour
toutes les flches au lieu d'une vingtaine.
En contrepartie, le code CSS est bien plus pnible crire, mais il n'est pas plus complexe pour autant.
Code : CSS
#fleche_hg{left: 0px; top: 0px; background-position: 0px top;}
#fleche_hg:hover{background-position: 0px bottom;}
#fleche_h{left: 45px; top: 0px; background-position: -45px top;}
#fleche_h:hover{background-position: -45px bottom;}
#fleche_hd{left: 90px; top: 0px; background-position: -90px top;}
#fleche_hd:hover{background-position: -90px bottom;}
#fleche_g{left: 0px; top: 45px; background-position: -135px top;}
#fleche_g:hover{background-position: -135px bottom;}
#fleche_d{left: 90px; top: 45px; background-position: -180px top;}
#fleche_d:hover{background-position: -180px bottom;}
#fleche_bg{left: 0px; top: 90px; background-position: -225px top;}
#fleche_bg:hover{background-position: -225px bottom;}
#fleche_b{left: 45px; top: 90px; background-position: -270px top;}
#fleche_b:hover{background-position: -270px bottom;}
#fleche_bd{left: 90px; top: 90px; background-position: -315px top;}
#fleche_bd:hover{background-position: -315px bottom;}
Essayer !
Tout est fin prt ! Notre code CSS est en effet achev, notre navigateur sait, grce aux transitions, qu'il devra animer le
changement de position de l'arrire-plan de l'ocan Il ne nous reste plus qu' utiliser JavaScript pour ce faire.
www.openclassrooms.com
15/22
};
document.getElementById('fleche_h').onmouseover=function()
{
ocean.style.backgroundPosition='center top';
};
document.getElementById('fleche_hd').onmouseover=function()
{
ocean.style.backgroundPosition='right top';
};
document.getElementById('fleche_g').onmouseover=function()
{
ocean.style.backgroundPosition='left center';
};
document.getElementById('fleche_d').onmouseover=function()
{
ocean.style.backgroundPosition='right center';
};
document.getElementById('fleche_bg').onmouseover=function()
{
ocean.style.backgroundPosition='left bottom';
};
document.getElementById('fleche_b').onmouseover=function()
{
ocean.style.backgroundPosition='center bottom';
};
document.getElementById('fleche_bd').onmouseover=function()
{
ocean.style.backgroundPosition='right bottom';
};
Oui, a fait long comme code, mais avouez qu'on a connu plus difficile en JavaScript.
Il serait galement bon de recentrer l'arrire-plan lorsque nous ne sommes plus sur une flche. Pour cela, il faut dfinir la mthode
onmouseout de chaque flche. Cette fois, cette mthode doit faire la mme chose quelle que soit la flche, une boucle pourra
donc nous tirer d'affaire.
Code : JavaScript
//On rcupre tous les lments enfants du tableau de bord.
var fleches=document.getElementById('controls').childNodes;
//Pour chaque enfant de notre tableau de bord...
for(var i in fleches)
{
/* Malheureusement, fleches ne contient pas que nos flches,
il contient aussi des lments Text : il nous faut donc vrifier
que
l'enfant parcouru possde l'attribut style . Si oui, il s'agit
d'une
de nos flches, on peut donc continuer. */
if(fleches[i].style)
{
//On peut donc dfinir notre fonction.
fleches[i].onmouseout=function()
{
//Fonction qui recentre l'arrire-plan de l'ocan.
ocean.style.backgroundPosition='center';
}
}
}
www.openclassrooms.com
16/22
Essayer !
Malheureusement, cet exemple ne fonctionne pas toujours avec le navigateur Opera et pour une raison bien trange :
ce dernier ne prend pas encore correctement en charge les transitions de la proprit background-position...
Gageons que cette erreur soit corrige lors de la prochaine mise jour du navigateur ! En attendant, il est toujours
possible de ruser en changeant la faon de penser le systme : on peut par exemple ajouter une balise <div>
contenant notre fond, la placer en position absolue et la dplacer en jouant avec ses proprits top et left.
Notre JavaScript modifie donc la position de l'arrire-plan selon les flches survoles. Grce notre code CSS, le changement se
fera progressivement, donnant ainsi l'illusion de mouvement ! Notez bien qu'aucune transition ne se fait dans le code JavaScript,
tout se droule dans le code CSS.
N'est-ce pas merveilleux ?
Ce dernier point est un vritable problme. Si le navigateur de votre visiteur n'interprte pas les transitions CSS,
l'vnement transitionend ne se dclenchera jamais ! vitez donc d'y utiliser des fonctions indispensables la bonne
navigation de votre site.
Tout ceci ne simplifie pas nos affaires et je vous propose donc un petit exemple pour comprendre le fonctionnement.
Code : HTML
<!DOCTYPE html>
<html>
<head>
<title>Dcouvrons transitionend</title>
<meta charset="UTF-8" />
<link rel="stylesheet" type="text/css" href="style.css" />
<script>
window.onload=function()
{
// Nombre de fois que l'animation a t acheve
var total=0;
// On stocke les noms des vnements selon les navigateurs
var
navigatorsProperties=['transitionend','OTransitionEnd','webkitTransitionEnd'];
// On parcourt chacun de ces vnements
for(var i in navigatorsProperties)
{
// Et on les lie notre lment HTML
www.openclassrooms.com
17/22
document.getElementById('boite').addEventListener(navigatorsProperties[i],function
{
total++;
document.getElementById('infos').innerHTML='Transition termine '+total+' fois
!';
},false);
}
};
</script>
</head>
<body>
<h1 id="infos">Passez la souris sur le carr !</h1>
<div id="boite"></div>
</body>
</html>
Essayer !
Bon, je ne vous montre pas le code CSS, j'y modifie juste la proprit margin-left de ma <div> au passage de la souris, et
ce avec une transition-duration de 2 secondes. Vous devriez tre capables de le faire tout seul, maintenant.
Si vous avez test le code, vous avez vu que l'vnement transitionend ne se dclenche que lorsque la transition a atteint son
tat initial ou son tat final. Ainsi, si vous sortez la souris du carr pendant son dplacement, celui-ci revient vers son point de
dpart : la transition vers son tat final est certes termine mais aucun vnement ne s'est dclench ! En effet, le carr fait demitour vers son tat initial, il considre donc que sa transition n'est pas acheve !
Essayer !
www.openclassrooms.com
18/22
Il y a toutefois une particularit pour elapsedTime : si la transition se coupe en plein milieu, il est remis zro. Essayez
avec l'exemple ci-dessus en sortant la souris du carr pendant son dplacement, vous verrez que le temps indiqu la
fin de l'animation est toujours infrieur deux secondes contrairement ce qui a t indiqu dans le CSS !
Maintenant que tout est clair sur l'vnement transitionend, je vous propose un petit exemple d'utilisation.
La balade de Carapuce
Pour cet exercice, je vous propose de dplacer une <div> dans une autre. Rien de bien palpitant me direz-vous, mais cela peut
donner des rsultats intressants, vous verrez.
Tout d'abord, voici la structure de notre page HTML :
Code : HTML
<!DOCTYPE html>
<html>
<head>
<title>Une div se promne.</title>
<meta charset="UTF-8" />
<link rel="stylesheet" type="text/css" href="style.css" />
<script type="text/javascript">
window.onload=function()
{
// Plus tard =D
};
</script>
</head>
<body>
<div id="conteneur">
<div id="moveDiv"></div>
</div>
</body>
</html>
Et son CSS correspondant, que vous pouvez bien entendu amliorer (il est franchement trs basique et trs moche
Code : CSS
#conteneur
{
width: 155px;
height: 130px;
position: relative;
margin: auto;
background-color: #000;
}
#moveDiv
{
width: 23px;
height: 19px;
position: absolute;
top: 10px;
left: 10px;
background-color: #fff;
transition: left 4s linear, top 5s linear;
}
www.openclassrooms.com
).
19/22
Comme vous le voyez, j'ai dcid d'animer les proprits left et top : le dplacement de notre <div> sera donc fluide.
Il ne nous reste plus qu' lancer la transition en JavaScript pour qu'elle se fasse ds le chargement de la page, sans aucune action
de la part du visiteur. Ensuite, via transitionend, on demandera un autre dplacement de sorte que notre lment visite chacun
des quatre coins de son parent.
Code : JavaScript
window.onload=function()
{
// Les coordonnes de chaque coin du conteneur
var topLeft=[10,10];
var topRight=[122,10];
var bottomLeft=[10,101];
var bottomRight=[122,101];
// On cre un objet littral pour stocker nos valeurs
var objet=
{
// Notre div dplacer
'div': document.getElementById('moveDiv'),
// La position vers laquelle elle se dirige
'position': topRight,
var
navigatorsProperties=['transitionend','OTransitionEnd','webkitTransitionEnd'];
for(var i in navigatorsProperties)
{
objet.div.addEventListener(navigatorsProperties[i],function(e)
{
/*Lorsque la div a fini son dplacement, on lui
indique un autre point atteindre*/
switch(objet.position)
{
case topRight:
objet.position=bottomRight;
break;
case bottomRight:
objet.position=bottomLeft;
break;
case bottomLeft:
objet.position=topLeft;
break;
case topLeft:
objet.position=topRight;
break;
www.openclassrooms.com
20/22
objet.move();
};
Essayer !
Notre <div> parcourt bien chacun des quatre points de son conteneur.
Bon, ce n'est pas trs joli, mais en appliquant des
images en arrire-plan, il est possible d'avoir des rsultats bien plus sympathiques. Tenez, prenons ces images :
Essayer !
N'est-ce pas mieux ? Si vous n'tes pas encore convaincu par les transitions CSS3, je ne peux plus rien pour vous !
Pour modifier l'orientation du Carapuce, il suffit de changer sa proprit background-position dans notre code
JavaScript, au niveau du switch.
Merci Nesquik69 pour m'avoir suggr la rdaction de cette partie sur transitionend.
Q.C.M.
Le premier QCM de ce cours vous est offert en libre accs.
Pour accder aux suivants
Connectez-vous Inscrivez-vous
Quelle proprit CSS3 permet de lier des proprits aux transitions ?
transition-property.
transition-attribut.
transition-properties.
transition-attributes.
Que se passe-t-il si je passe ma souris sur une balise <div> en ayant ces instructions CSS ?
Code : CSS
div
{
width: 300px;
height: 200px;
background-color: #fff;
www.openclassrooms.com
21/22
transition-property: background-color;
div:hover
{
width: 400px;
height: 100px;
background-color: #000;
}
Toutes les proprits de la balise se modifieront via une transition, except la proprit background-color qui sera modifie
directement.
Toutes les proprits de la balise se modifieront via une transition.
Seule la proprit background-color se modifiera via une transition, toutes les autres se modifieront directement.
Toutes les proprits de la balise se modifieront directement.
Parmi les souhaits suivants, lequel ncessite obligatoirement JavaScript pour tre ralis ?
Je souhaite effacer progressivement une image pour faire apparatre celle en dessous lorsque son lment parent est survol par la
souris.
Je souhaite que la couleur de fond de mon paragraphe devienne bleue petit petit lorsque je clique sur un bouton.
Je souhaite modifier la taille de mon textarea de faon fluide quand l'utilisateur souhaite crire du texte dedans.
J'utilise un navigateur n'interprtant pas les transitions CSS. Parmi les affirmations suivantes, laquelle est fausse ?
Les proprits CSS peuvent quand mme tre modifies dynamiquement, seulement cela ne se fera pas de faon fluide.
Les fonctions lies l'vnement JavaScript transitionend s'excuteront quand mme, comme si les transitions avaient lieu.
Si mon navigateur ninterprte pas les transitions, c'est peut-tre parce que le dveloppeur a oubli de mettre les prfixes -moz, webkit ou -o ses proprits.
Correction !
Statistiques de rponses au Q CM
Les animations avec CSS3 sont donc une sacre avance dans le domaine du dveloppement web. JavaScript n'est dsormais
plus relgu qu' titre de support pour ces transitions, fini le temps des machines gaz crites avec ce langage !
Mais qu'on ne se leurre pas : mme si nous pouvons faire des choses vraiment sympathiques rien qu'en CSS3, JavaScript reste
indispensable pour des choses un peu plus avances.
Il est temps de se demander si charger une bibliothque telle que jQuery est indispensable pour nos petites animations.
Partager
Ce tutoriel a t corrig par les zCorrecteurs.
www.openclassrooms.com