Suivre

Actualités du site CSS3Create

Actualités sur CSS et le web en général

Animation "effet bounce" en CSS

Créer un effet de rebond avec les animations

Création: juin 2011Modifié:

Contenu
HTML + CSS NO JS
Navigateurs
Firefox Safari Chrome
Propriétés CSS3
animation
Partagez
Facebook Twitter

Votez

22 votes3.85

Demo 100% CSS. Pas d’utilisation de javascript. Utilisation des keyframes dans Firefox et Safari/Chrome.

Voici une animation très simple à réaliser !

Préparation

Pour cette démo, nous avons besoin de 3 images :

  • l’icone
  • le reflet
  • l’ombre

(PS : J’ai fais le choix de créer 3 div et d’utiliser les images en background CSS, mais il est tout à fait possible d’utiliser la balise img)

Voici le code HTML :

<div id="ical">
</div>
<div id="icalr">
</div>
<div id="icalo">
</div>

Tout d’abord, on positionne les 3 divs :

div{
position:absolute;
}

#ical{
    width:64px;
    height:65px;
    top:106px;
    left:259px;
    z-index:5;
    background:url('ical.png');
}

#icalr{
    width:60px;
    height:20px;
    top:167px;
    left:263px;
    z-index:5;
    background:url('icalr.png');
}

#icalo{
    width:63px;
    height:28px;
    top:142px;
    left:257px;
    z-index:3;
    background:url('icalo.png');
}

Chaque div est dimensionnée (avec width et height), positionnée (avec top et left) et reçoit une image en background. Le z-index nous permet de gérer l’ordre d’empilement.

Les animations

Enfin, il suffit de créer trois animations différentes pour les effets de rebond. ( sachant que deux animations seront quasiment identique ) Voici le code de la première animation (pour firefox) :

#ical{
    ...
    -moz-animation:bounce 0.7s linear infinite;
}

@-moz-keyframes bounce{
    from{top:106px;}
    10%{top:99px;}
    20%{top:93px;}
    30%{top:89px;}
    40%{top:87px;}
    50%{top:86px;}
    60%{top:87px;}
    70%{top:89px;}
    80%{top:93px;}
    90%{top:99px;}
    to{top:106px;}
}

On remarque ici que l’animation agit sur la valeur top de la div. Cette valeur commencera à 106px ( valeur du placement initial en CSS ) et finira à cette même valeur mais en oscillant de 20px au maximum ( à 50% de l’animation )

Comment calculer les valeurs en px ?

Pour une animation réussie, ne passez pas votre temps à tâtonner pour chercher les valeurs à utiliser, mais calculez-les !

Pour cela choisissez tout d’abord le type d’animation et dessinez la courbe. Dans le cas de cette démo, j’ai choisi une courbe de type y=x² : elle est représentée en vert sur le graphique.

Cette courbe représente la position top de l’image dans le temps, sachant que l’élévation maximale sera de 20px. Il nous faut donc calculer les valeurs pour les 5 points verts de l’image, correspondants aux valeurs 10%,20%,30%,40% et 50%.

Pour cela, aidons nous de la partie gauche du graphique. Nous la découpons en 5 parties également et pour chaque valeur, nous calculons son carré ( 1->1, 2->4, 3->9, 4->16, 5->25). Il nous suffit ensuite de faire un produit en croix pour connaitre les valeurs que l’on cherche.

Par exemple, pour la valeur 10%, je pars du carré de 4, soit 16. Je fais le produit en croix et j’obtiens (20x16)/25 = 12,8px !

La valeur de l’animation pour 10% est donc de 106px - (20-12,8) soit 99px ! Cette valeur est aussi celle de 90%.

Et ainsi de suite...

Besoin de plus de détails sur les animations

PS : Posez vos questions dans le forum de cet article, juste en dessous. Et n’oubliez pas de voter si l’article vous plait !

Envie d'une nouvelle démo?

Un p'tit mot...

#1par Adrien, le 24 août 2011

Super tuto ! Effet à couper le souffle !
Merci ;)

#2par Blitz, le 5 janvier

Est-il possible de le faire avec seulement l’image ? ( Sans le reflet et l’ombre )
Je n’y arrive pas :/

#3par vive firefox10, le 14 janvier

Assez marrant
Je vais essayez d’améliorer ce script en essayant d’alterner celui qui bouge.
L’ombre sous l’image rendl’effet vraiment réaliste.

#4par Ced, le 16 janvier

Sympa !
Je m’étais amusé à faire la même mais en allant plus loin sur l’utilisation des pseudo classe permettant le reflet...
Je mettais l’image dans le content sur la pseudo classe :after et via la prop transform via scale en Y négatif + une opacité moindre permet d’avoir le reflet. Ce qui permet de n’avoir qu’une div par icone.
Le problème, c’est que seul Firefox permet de jouer une animation sur l’element virtuel "after" (ou alors je n’ai pas trouvé comment sur les autres). Du coup, le reflet part dans le mauvais sens sous Chrome et consort...
De plus, je n’ai pas l’ombré non plus (peut être qu’avec les filter cela sera possible...)
le code :

.icon::after {
content: url(monimage.png);
display: block;
position: absolute;
top: XXpx;
height: XXpx;
width: XXpx;
opacity: 0.3;
-moz-transform: scaleY(-0.7);
-webkit-transform: scaleY(-0.7);
-o-transform: scaleY(-0.7);
}

en pratique : http://cedricrey.fr/atelierWeb/CSSd...
Le rendu est évidement bien meilleur sur votre démo !
Je me permets de reprendre vos valeurs pour le timing, car même si mes cours de physiques ne sont pas très loin, j’ai eu la flemme de calculer et l’effet de l’animation est désastreux sur ma page...
En tous cas chapeau pour votre démo !!!

#5par css3create, le 16 janvier

@Ced : Bravo ! Très bonne idée... même si c’est vrai que les transitions et animations sur les pseudo-éléments ne fonctionne qu’avec Firefox. Bientot sur les autres navigateurs ?

Vincent

PS : Je me suis permis d’ajouter les balises <code> pour plus de clarté.

#6par paline, le 11 février

super ! mais je n arrive pas à l installer :/

#7par zakariadza, le 16 mai

En fait, l’équation de la courbe n’est pas y=x^2 mais y=-x^2.
Merci pour le tuto en tout cas :p


Un message, un commentaire ?
    Qui êtes-vous ? (optionnel)
  • (Pour créer des paragraphes, laissez simplement des lignes vides.)