FONDUS

illus

script : fade v2.0
langage : javascript
catégorie : module
usage : Faîtes apparaître ou disparaître progressivement les éléments de votre page.
tags : effets spéciaux

Concept

fade permet de réaliser des effets d'apparition et de dispartion en fondu, sur n'importe quel élément d'une page html. (Ah, les effets de fondu ! Ça fait toujours bien !)
Une ligne de javascript suffit.

(Voir aussi Animate, qui permet de réaliser le même effets, et d'autres encore.)

Démo

Je vous en prie, amusez-vous à faire des fondus sur les montres molles de Dalí :
fade-out        fade-in

Persistance de la Mémoire, de Salvador Dalí

Code

Pour ce qui est de charger le script, rien de plus ordinaire : on place le code suivant entre les balises <head> et </head> de la page :

<script src="fade.js" type="text/javascript"></script>

On peut alors lancer un fondu avec un minimum de code. (Ici on fait apparaîte un élément)

fade( document.getElementById('dali'), 1 );

Plus de code

Le script apporte quelques autres subtilités, dont vous trouverez le détail dans les tableaux suivants :

Arguments de la fonction

fade([elem, [to, [from, [options]]]) lance un fondu sur l'élément elem, pour obtenir un pourcentage d'opacité to, en partant d'une opacité from, et en utilisant les options listées dans options.
Aucun des arguments n'est obligatoire.

argument type description par défaut
elem HTMLElement
l'élément à animer document.body
to Float le pourcentage d'opacité désiré à la fin de l'animation 1 (donc 100%)
from Float
le pourcentage d'opacité désiré au départ de l'animation
Si ce paramètre n'est pas renseigné, le script tâchera de le déterminer automatiquement. Attention toutefois : cette méthode n'est pas infaillible !
special
options Object les options de l'animation, listées dans un tableau associatif.
Voir ci-après pour le détail des options
{}

Options

option type description par défaut
duration Integer
durée de l'animation, en millisecondes.
1000
frameRate String nombre d'étapes par secondes, dans l'animation.
30
onFinish Function fonction callback à exécuter à la fin de l'animation.
Exemple : function () { alert('fini !'); }
null

Voici un exemple d'appel de la foncion, avec options :

fade(
	document.getElementById('dali'), // l'élément à animer : celui dont l'attribut id est 'dali'
	0.5, // l'opacité finale : à demi transparent
	1, // l'opacité initiale : complètement opaque
	{
		duration : 5000, // durée de l'animation : 5 secondes
		frameRate : 12, // fréquence de l'animation : 12 images par seconde
		onFinish : function(){alert('fini!');} // fonction appelée à la fin de l'animation : afficher 'fini!'
	}
);

Téléchargement

Vous trouverez dans ce zip deux versions du script : l'une compactée (<1Ko), et l'autre commentée. 
Notez que le script embarque la fonction setOpacity, qui permet de définir le degré de transparence d'un élément HTML.

compatibilité :
Internet Explorer (6+) Firefox Safari Opera Google Chrome
(autres navigateurs non testés)

Commentaires

  • Publier un nouveau commentaire
  • gravatar
    Fonctionne avec Chrome.
  • gravatar
    Je m'en doutais à vrai dire, vu qu'il utilise le même moteur de rendu que Safari.
    Merci donc pour la confirmation. Je rajoute le petit icone !
  • gravatar
    Bonjour, ces scripts sont vraiment parfaits. Cependant, est-il possible de lancer un fondu automatiquement au lancement de la page ?
    Merci
  • gravatar
    Salut "Scscjcnc".
    Oui, tu peux lancer un fondu au lancement de la page. Je te propose (parmi d'autres solutions) de placer ça juste avant ta balise de fermeture du body :
    <script type="text/javascript">fade(tes réglages);</script>
  • gravatar
    Simpa ton script, ca va me permettre d'alleger ma page du flash superflue, par contre j'aurais aimé faire apparaitre et disparaitre en boucle une image, comment on peux faire?
    Par contre j'ai un petit souci avec l'intégration du code pour ce qui est des o
  • gravatar
    Salut Ayor.
    Pour ta première question, c'est un peu long à expliquer dans un commentaire. Et la deuxième, je la comprends pas. Contacte-moi plutôt par email.
  • gravatar
    Merci pour ce script J'ai fait un damier avec plusieurs miniatures et un fondu lorsqu'on passe la souris sur l'image. Si on passe rapidement d'une image à l'autre, le fondu précédent s'interrompt là où il en est Qui a une idée? Merci www.olivier-lievin.fr
  • gravatar
    Salut Olivier.
    Je te propose soit de faire des copies de l'objet Fade (pour chaque vignette), soit d'utiliser le module Animate, qui est plus complet (voir les exemples 4 et 5).
    Au besoin : webmaster@webbricks.org
  • gravatar
    En jetant un oeil à ta page, je me dis que tu pourrais aussi faire
    onmouseout="setOpacity(document.getElementById('Image1'),0)"
    (Et que 130 images/secondes, c'est beaucoup !)
  • gravatar
    petite erreur de majuscule dans ton script sur le "onFinish" sinon ton script est super bien ! merci !
  • gravatar
    Bien vu ! Je te remercie.
    C'est corrigé maintenant.
  • gravatar
    Bonjour Abrab, et merci beaucoup pour ton super script !
    A la base, j'avais cette fonction :
    function stop_action()
    { window.location='<?php echo $url_redirection; ?>'; }
    Elle me permettait de supprimer un bloc en enlevant certains paramètres de l'URL. Pourrais-tu m'indiquer où la placer dans ton script pour changer l'URL une fois le fade out terminé ?
    D'avance merci pour ton aide.

    PS: Je suis novice en javascript et en orthographe ossi, lol. ^^
  • gravatar
    @Piixel :

    var options = { onFinish : stop_action };
    fade(elem, to, from, options);


    Je laisse à ta discrétion les valeurs de elem/from/to.
  • gravatar
    Avant tout merci pour ta réponse Abrab.
    J'ai ajouter l'option onFinish mais la fonction s'exécute après le fade-in et le fad-out. Or j'aimerais que celle-ci ne s'exécute qu'après le fad-out.
  • gravatar
    Ha non, erreur de manip, au temps pour moi. ça marche du tonnerre, désolé. Merci beaucoup Abrab, il est super ton site !
  • gravatar
    Bonjour Abrab,
    J'ai un problème de fondu pour l'apparaition de ma page web.
    Ma page contient une animation flash et de textes. Et j'aimerais faire apparaitre tous les elements en fondu au même temps.
    Est-ce qu'il y a un moyen d'appliquer un script de fondu pour tous les éléments de ma page?
    ou je dois appliquer un par un?
    Merci pour ton aide.
  • gravatar
    Salut.
    Si tu veux vraiment faire un fondu sur tout le contenu de ta page, tu prend le body comme cible :
    fade( document.getElementsByTagName('body')[0], 1);

    Sinon, tu peux te servir de mon script seek pour sélectionner facilement les cibles, et faire une boucle. Exemple avec tous les éléments de classe "fadeIn" :
    seek('.fadeIn').each(function(elem){
    fade(elem, 1);
    });
  • gravatar
    Tres bien ce petit script, merci !
  • gravatar
    Super script ! Merci

    J'aimerais faire un fade out lorsque je change de page (puis un fade in lors de l'apparition de la page suivante). Est-il possible d'exécuter un script jusqu'au bout avant que la page ne soit quittée ?
  • gravatar
    J'ai encore jamais eu l'occasion de me pencher là-dessus.
    Mais tu dois pouvoir obtenir quelque chose à partir de l'événement onunload du <body>. Tu auras sans doute besoin d'un preventdefault pour empêcher le changement de page immédiat. Puis, une fois le fondu effectué, il faudra changer de page par javascript (window.location.href="xxx.html").
    Voici une piste. Je te laisse faire ton chemin. Bonne continuation.
  • gravatar
    Super, j'ai réussi à m'en tirer avec ça ! merci
  • gravatar
    Merci pour ce superbe script simplisime qui permet de faire des choses superbes !
    Juste une question : quelle option appeler pour demander au script de s'exécuter au bout d'un temps x après chargement de la page (en millisecondes j'imagine !)
    D'avance merci !
  • gravatar
    Il n'y a pas d'option prévue pour ça. (S'il y avait des options prévues pour tout le script serait autrement plus lourd ;) ) Il faut coder un peu :
    setTimeout(function(){
    fade(elem);
    },delaiEnMillisecondes);

  • gravatar
  • gravatar
    Bonsoir Abrab,

    Tout d'abord, je trouve cette fonction, comme les autres, absolument formidable ! Débutant dans le monde du développement, c'est avec plaisir que j'ai découvert ce que tu pouvais offrir, et je me suis surpris à tout comprendre du premier coup !

    Ceci dit, je voudrais résoudre un petit casse-tête, et peut-être pourras-tu m'aider :

    J'ai un lien sur une page, qui "onclick" affiche une sorte de popup. Avant de découvrir tes fonctions, je jouais sur le display="none"/"block", et était par défaut sur "none" en ouvrant la page.

    Mon problème, c'est que je voudrais appliquer le fondu à cette popup, qui serait donc, par défaut, invisible. Vois-tu ce que je veux dire ? Et si oui, peux-tu m'aider ?

    D'avance merci !
  • gravatar
    Salut Pierrot.
    Commencer en display:none c'est ce que je ferais aussi. Mais il faudrait le faire en agissant sur l'attribut style de ta popup, pour que fade puisse le lire : style="display:none". (Les puristes diraient qu'il faut le faire en javascript.)
    Ensuite, tu mets juste fade(this) sur le onclick.
    Ça devrait suffire.
  • gravatar
    Bonjour Abrab et merci, j'ai fini par avoir ce que je voulais ! Bon boulot ;p
  • gravatar
    Bonjour Abrab,
    J'utilise ton script sur un div dont le background-image est un png déjà partiellement transparent. Seulement comme tu le sais peut-être, lorsque tu modifies la propriété filter d'un div sur IE8 dont le background est un png, le canal alpha du png n'est plus pris en compte.
    J'obtient donc un fond opaque après le fade :(
    Sais-tu comment pallier ce problème ?
  • gravatar
    bonjour
    merci à toi pour cette fonction
    je l'essaye tout à l'heure
  • gravatar
    Hello Hello !
    J'ai un petit problème que je ne vois pas comment forcément résoudre ! En fait je met qu'en Onmouseover ça fait disparaitre l'élement et Onrollout ça le fait reapparaitre. Donc pas de problème cela fonction cependant j'utilise Fade à chaque coup sur ce type de lien et vu qu'ils sont assez rapprochés si on va vite sur un autre lien, la transparence de l'image précédente n'a pas le temps de se faire. Je pense c'est parcqu'ils appellent tous la fonction fade qui marche que sur un élément mais je n'ai aucune idée de comment résoudre le pb !
    Si tu as une idée je suis preneur :)
  • gravatar
    Oui Niok, ton analyse est juste. Pour remédier à ton problème, je te suggère de faire une copie de fade pour chacun de tes éléments :
    var fade1, fade2, fade3, fadex;
    fade1 = fade2 = fade3 = fadex = fade;
  • gravatar
    Bonjour, c'est sur c'est un très bon script. Mais je tiens à signaler deux erreur, dans la fonction next il faut remplacer 1000 par this.duration et surtout les 3 égal à la fin ( this.frameNb===this.totalFrames) il doit en avoir que 2 (sinon c'est un opérateur d'identité et non pas de valeur) . En tous cas ça m'a bien aidé, merci et bonne continuation.
  • gravatar
    oups je viens d'y repenser et non il n'y a pas d'erreur pour la valeur 1000 à changer ! surtout laisser comme tel :-)
  • gravatar
    ... pensez au débutant que vous avez été. Un exemple concret svp.
    Ou et comment sur la page html , précisément ?
  • gravatar
    Bonjour Abrab,

    Voila en fait je dispose d'un script d'infobulle et j'aimerais qui tu puisse y intégrer ton "Fade" !

    voila le code :
    _______________





    var xOffset=6
    var yOffset=15

    var affiche = false; // La variable i nous dit si le bloc est visible ou non
    var w3c=document.getElementById && !document.all;
    var ie=document.all;

    if (ie||w3c) {
    var laBulle
    }

    function ietruebody(){ // retourne le bon corps...
    return (document.compatMode && document.compatMode!="BackCompat")? document.documentElement : document.body
    }


    function deplacer(e) {
    if(affiche){
    var curX = (w3c) ? e.pageX : event.x + ietruebody().scrollLeft;
    var curY = (w3c) ? e.pageY : event.y + ietruebody().scrollTop;

    var winwidth = ie && !window.opera ? ietruebody().clientWidth : window.innerWidth - 20;
    var winheight = ie && !window.opera ? ietruebody().clientHeight : window.innerHeight - 20;

    var rightedge = ie && !window.opera ? winwidth - event.clientX - xOffset : winwidth - e.clientX - xOffset;
    var bottomedge = ie && !window.opera ? winheight - event.clientY - yOffset : winheight - e.clientY - yOffset;

    var leftedge = (xOffset < 0) ? xOffset*(-1) : -1000

    // modifier la largeur de l'objet s'il est trop grand...
    if(laBulle.offsetWidth > winwidth / 3){
    laBulle.style.width = winwidth / 3
    }

    // si la largeur horizontale n'est pas assez grande pour l'info bulle
    if(rightedge < laBulle.offsetWidth){
    // bouge la position horizontale de sa largeur à gauche
    } else {
    if(curX < leftedge){
    laBulle.style.left = "5px"
    } else{
    // la position horizontale de la souris
    laBulle.style.left = curX + xOffset + "px"
    }
    }

    // même chose avec la verticale
    if(bottomedge < laBulle.offsetHeight){
    laBulle.style.top = curY - laBulle.offsetHeight - yOffset + "px"
    } else {
    laBulle.style.top = curY + yOffset + "px"
    }


    }
    }
    function montre(text) {
    if (w3c||ie){
    laBulle = document.all ? document.all["bulle"] : document.getElementById ? document.getElementById("bulle") : ""
    laBulle.innerHTML = text; // fixe le texte dans l'infobulle
    laBulle.style.visibility = "visible"; // Si il est cachée (la verif n'est qu'une securité) on le rend visible.
    affiche = true;

    }
    }



    function cache() {
    if (w3c||ie){
    affiche = false
    laBulle.style.visibility="hidden" // avoid the IE6 cache optimisation with hidden blocks
    laBulle.style.top = '-1000px'
    laBulle.style.backgroundColor = ''
    laBulle.style.width = ''
    }
    }


    document.onmousemove = deplacer; // des que la souris bouge, on appelle la fonction move pour mettre a jour la position de la bulle.



    __________________


    Si tu pouvais le rendre entièrement refait pour qu'il y ai la fonction "fade"
    Je sais bien que sa doit te demander beaucoup de boulot mais cela m'arrangerais bien !

    Voilà merci d'avance !
  • gravatar
    Bonjour !

    Alors voilà moi mon souci c'est que j'ai déjà un script de permutation,
    entre ma grande div et mes miniatures ( quand on passe la souris sur les miniatures elles s'affichent en grand dans la grande div à côté),

    et j'aimerais qu'elles apparaissent en fondu dans la grande div !

    Alors j'ai bien essayé d'utiliser ton script mais sans succès :(

    voilà mon script :

        <script>
             function permut(url)
             {
             document.getElementById('image_a_changer').src=url;
             }
        </script>

    et dans mon body ça donne ça:

    <div id="galerie">

    <div class="grande">
    <p><img src="img/conceptG/Ambiguity noir sans pierres.jpg" width="375" height="565" id="image_a_changer"/></p>

    </div>

    <div class="vignette">
    <p><img src="img/conceptG/Ambiguity noir sans pierres.jpg" width="114" height="172" OnMouseOver="permut('img/conceptG/Ambiguity noir sans pierres.jpg')"/></p>
    </div>

    Comment je peux faire ?

    Merci.
  • gravatar
    J'adore ton script, super simple à mettre en place, marche en 2 secondes...
    Juste bravo et merci :D
  • gravatar
    magnifique ! merci pour le partage.
  • gravatar
    ça ne fonctionne pas avec deux instances quand on passe de l'un à l'autre d'un coup.
    code :
    <div id="page">
        <div id="index_partie_gauche">
             index_partie_gauche
             <div id="content_partie_gauche">
                  texte
             </div>
        </div>
        <div id="index_partie_droite">
             index_partie_droite
             <div id="content_partie_droite">
                  texte
             </div>
        </div>
    </div>

    <script type="text/javascript">
        var min=0.4;
        var max=1;
        document.getElementById("index_partie_gauche").onmouseover = function(){ fade( this, max, min, {duration : 1000} ); };
        document.getElementById("index_partie_gauche").onmouseout = function(){ fade( this, min, max, {duration : 1000} ); };
        document.getElementById("index_partie_droite").onmouseover = function(){ fade( this, max, min, {duration : 1000} ); };
        document.getElementById("index_partie_droite").onmouseout = function(){ fade( this, min, max, {duration : 1000} ); };
    </script>


    CSS :
    html { height: 100%; }
    body { height: 100%;     line-height: 1; }
    #page { background-color: none; height: 100%; color: WHITE; }
    #index_partie_gauche { position: relative; height: 100%; background-color: BLUE; width:50%; float: left; text-align:center; opacity:0.4; filter:alpha(opacity=40); }
    #index_partie_droite { position: relative; height: 100%; background-color: GREEN; width:50%; float: left; text-align:center; opacity:0.4; filter:alpha(opacity=40); }

  • gravatar
    Bonjour, c'est exactement ce que je cherchais, mais les possibilités excitent ma curiosité. Je cherche maintenant à insérer une image à la place du message de fin :
        onFinish : function(){alert('fini!');} // fonction appelée à la fin de l'animation : afficher 'fini!'

    J'ai beau insérer du code, il n'est pas interpréter. Quelqu'un aurait une solution ? merci
  • gravatar
    Bonjour Jeff, pourrais-tu nous donner ton code afin qui nous puissions juger de ce qui ne va pas ? (http://pastebin.com/)
  • gravatar
    onFinish : function(){alert('<img src="image-actu1.png" width="720" height="280" />');}

    Bonjour Pierrot, voilà.
    Merci de ton aide
  • gravatar
    C'est une image que tu veux donc faire apparaître dans une fenêtre alerte ?

    Je vais me pencher dessus, mais je suis pas optimiste, là à froid :D

    Ajoute moi à msn, si tu veux, ce sera plus pratique : pierre.gouchet@hotmail.fr
  • gravatar
    Bon bah je confirme que je n'y arrive pas. Ce qui ne veut pas dire que ce n'est pas possible , mais ça dépasse mon domaine de connaissance (qui n'est, sans me vanter, pas mince !).

    Ceci dit, fais moi savoir si tu trouves une solution à ce problème, ça m'intéresse !
  • gravatar
    Ok merci, mais je pense que c'est une plutôt une limitation des possibilités offertes par les fenêtres d'alerte du navigateur... mais pas complétement sûr... peut-être que finalement il faudrait lancer l'ouverture d'une fenêtre type lightbox.
  • gravatar
    C'est précisement ce à quoi j'étais en train de penser. Sauf erreur, tu trouveras des scripts de lightbox ici : http://webbricks.org/bricks/msg/
  • gravatar
    Merci Pierrot, j'ai regardé et j'ai laissé un message.

    Je me demande aussi comment indiquer un délais à l'ouverture du message.
        onFinish : function(){alert('fini!');}

    Au lieu de "onFinish", je voudrai que l'action se déroule après 5 secondes.
    Comment puis-je faire ?
  • gravatar
    Crée toi une fonction factice type :
    function fini(){
    alert('Fini !');
    }

    Puis :
    onFinish : function(){
    setTimeout(fini, 2000);
    }

    Sachant que 2000 correspond au délai en millisecondes.
    (J'viens de tester avec un click au lieu d'un onFinish, mais le principe reste le même !)
  • gravatar
    Mouai.

    Actuellement j'ai ça <

    <script type="text/javascript">
        fade(document.getElementById('body'), 1, 0,
        {
             duration : 1000,
             frameRate : 12,
             onFinish : function(){alert('je suis content');}
        }
    );</script>

    Je tente donc d'insérer ce que tu me dis mais ça ne fonctionne pas :

    <script type="text/javascript">
        fade(document.getElementById('body'), 1, 0,
        {
             duration : 1000,
             frameRate : 12,
             onFinish : function fini(){alert('Fini !');
        }
    onFinish : function(){
    setTimeout(fini, 2000);
    }
    );</script>

    Et pour toi ? ça fonctionne ?

    Merci encore.
  • gravatar
    En fait, en relisant les explications d'Agorab sur son script, je réalise que mes conseils sont complètement décalés.

    Voici mon code :
    fade(document.getElementById('image'),0.1,1,
    {
    duration : 2000,
    frameRate : 48,
    onFinish : function(){alert('fini!');}
    }
    );

    Enfin "mon" code, non, c'est celui d'Agorab, présenté en haut ^^
    Mais il fonctionne parfaitement. Du coup, je comprends plus ce qui ne fonctionnait plus chez toi ? Tu veux que ton message apparaisse au moment où le fondu se termine, ou tu souhaites y rajouter un délai supplémentaire ?

    Si tu le veux au moment où le fondu se termine, le code ci-dessus suffit, sinon voici le code :
    fade(
    document.getElementById('image'),
    0.1,
    1,
    {
    duration : 1000,
    frameRate : 50,
    onFinish : function(){setTimeout(fini,2000);}
    }
    );
                  
    function fini(){
    alert('Fini !');
    }
  • gravatar
    Je dis un grand merci. Ca peut me prendre la journée un truc comme ça !
    C'est nikel. T'assures pas le service sur l'autre sujet par hasard !!!

  • gravatar
    Lequel ? ^^
  • gravatar
    Celui que tu m'as indiqué !
    http://webbricks.org/bricks/msg/
  • gravatar
    Le plus simple serait soit que nous continuions nos conversations par mail, soit par msn !
    Par mail => pierre.gouchet@gmail.com
    Par msn => pierre.gouchet@hotmail.fr
  • gravatar
    Merci pour ce super script, mais est t'il possible de faire une sorte de réinitialisation du fade-in genre : setOpacity(document.getElementById(idImage),0);
    mais avec une opacité qui ne serait pas de zéro ? parce que si je change l'opacité de setOpacity alors mon fade-in ne va plus :(
  • gravatar
    ce serait pour savoir si il est possible de l'adapté pour les menu déroulant en CSS ?
    En gros, j'ai un menu, mais... quand je passe la souris dessus, ça s'affiche brutallement, j'aimerai que ça s'affiche en fondu comme cela.
  • gravatar
    Bonjour!!
    Je voudrais savoir, s'il était possible que le fondu se réalise non en cliquant mais en passant juste la souris sur le lien par exemple (sur un fond ou une image déjà pré existante! Et que lorsqu'on retire le pointeur du lien l'ancienne image ou fond réapparaît!
  • Navré, le formulaire de commentaires est temporairement indisponible.