IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Opacité sur événement mouseout


Sujet :

JavaScript

  1. #1
    Membre averti
    Homme Profil pro
    Intégrateur Web
    Inscrit en
    Novembre 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Intégrateur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2012
    Messages : 14
    Par défaut Opacité sur événement mouseout
    Bonjour,

    Je rencontre un problème pour changer l'opacité d'une image au retrait de la souris (mouseout). J'arrive bien à lui donner l'opacité que je souhaite au moment du survol mais impossible de lui définir l'opacité au retrait de la souris.
    J'appelle la même fonction au survol et au retrait et j'ai définit mes événements dans une fonction setup.

    Voici le code utilisé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    function modifyOpacity(id, opacity) {
    	var tt = document.getElementById(id);
    	var currentOpacity = img1.objGetOpacity();
    	if (currentOpacity > 0.5) {
              currentOpacity -= 0.1;
    	  img1.objSetOpacity(currentOpacity);
    	  setTimeout("modifyOpacity()", 20);
        } else if (currentOpacity < 1) {
    	  currentOpacity += 0.1;
    	  img1.objSetOpacity(currentOpacity);
    	  setTimeout("modifyOpacity()", 20);
    	}
    }
    function changeOpacity(evnt) {
    	if (evnt.type == "mouseover") {
    	  modifyOpacity("picto_facebook", 0.5);
    	} else if (evnt.type == "mouseout") {
    	  modifyOpacity("picto_facebook", 0.9);
    	}
    }
    function setup() {
      img = document.getElementById("picto_facebook");
      img1 = new ImgObj(img);
      // Valeur d'opacité initiale
      img1.objSetOpacity(0.9);
      // Evénements
      img.addEventListener("mouseover", changeOpacity, false);
      img.addEventListener("mouseout", changeOpacity, false);
    }
    window.onload=setup;

  2. #2
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    Tu as un gros problème de logique dans modifyOpacity() (en dehors du paramètre opacity non utilisé).
    Lorsque tu survoles l'image, tu diminue l'opacité, mais dans chaque condition, tu relances un setTimeout(), donc l'image va éternellement osciller entre 0.4 (cas où l'appel suivant va ajouter 0.1) et 0.5 (cas où l'appel suivant va retirer 0.1).
    Il y a un moment où il faut stopper le timer...
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  3. #3
    Membre averti
    Homme Profil pro
    Intégrateur Web
    Inscrit en
    Novembre 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Intégrateur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2012
    Messages : 14
    Par défaut
    Ok je comprend ce que tu veux dire pour le timer mais est il possible d'utiliser la même fonction pour les événements mouseover et mouseout, ou bien faut il impérativement créer une fonction pour chaque événement ?

  4. #4
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 211
    Par défaut
    Bonjour,
    tu peux jeter un coup d'oeil à Galerie avec effet de fondu, tiens c'est de Bovino me semble t-il !

  5. #5
    Membre averti
    Homme Profil pro
    Intégrateur Web
    Inscrit en
    Novembre 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Intégrateur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2012
    Messages : 14
    Par défaut
    Bon finalement je suis reparti de zero après avoir suivi quelques tutos et explications sur le fonctionnement des timers.

    J'ai réussis à faire quelque chose qui fonctionne mais un bug se produit quand je rentre et sors trop rapidement sur l'élément.

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    function fadeOut(id, downOpacity, speed) {
     
    	var currentOpacity = id.style.opacity * 100;
    	// Si l'élément n'a pas d'opacité définit
    	if(!currentOpacity) {
    		// On définit une valeur par défaut
    		setOpacity(id, 100);
    		currentOpacity = id.style.opacity * 100;
    	}
    	var timer = window.setInterval(function() {
            currentOpacity -= 1;
            id.style.opacity = currentOpacity / 100;
            if (currentOpacity === downOpacity) {
    	        window.clearInterval(timer);
            }
        }, speed/1000);
    }
    function fadeIn(id, upOpacity, speed) {
     
    	var currentOpacity = id.style.opacity * 100;
    	var timer = window.setInterval(function() {
            currentOpacity += 1;
            id.style.opacity = currentOpacity / 100;
            if (currentOpacity === upOpacity) {
    	        window.clearInterval(timer);
    	        //alert(currentOpacity);
            }
        }, speed/1000);
    }
    function setOpacity(id, opacity) {
    	id.style.opacity = opacity / 100;
    }
     
    addEvent(getById("picto_facebook"), "mouseover", function(){
    	fadeOut(this, 40, 5)
    });
    addEvent(getById("picto_facebook"), "mouseout", function(){
    	fadeIn(this, 86, 5)
    });
    Merci pour le lien.

  6. #6
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 211
    Par défaut
    Ton dysfonctionnement provient du fait que tu ne "clear" pas le timer en cours avant d'en lancer un autre, il te faut donc le "clearer" en début de fonction.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    function fadeOut(id, downOpacity, speed) {
    	// init iTimer si not existe and kill
    	id.iTimer = id.iTimer || null;
    	window.clearInterval( id.iTimer);
     
    	var currentOpacity = id.style.opacity * 100;
    	// Si l'élément n'a pas d'opacité définit
    	if(!currentOpacity) {
    		// On définit une valeur par défaut
    		setOpacity(id, 100);
    		currentOpacity = id.style.opacity * 100;
    	}
            // on utilise id.iTimer par la suite
    	id.iTimer = window.setInterval(function() {
            currentOpacity -= 1;
            id.style.opacity = currentOpacity / 100;
            if (currentOpacity === downOpacity) {
                    window.clearInterval( id.iTimer);
            }
        }, speed/1000);
    }

  7. #7
    Membre averti
    Homme Profil pro
    Intégrateur Web
    Inscrit en
    Novembre 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Intégrateur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2012
    Messages : 14
    Par défaut
    Ok, donc le fait de passer à l'état fadeOut avant même que le fadeIn ne soit terminé va me stopper le timer de fadeIn et déclenché celui de fadeOut c'est bien ça ?

    Tu peux m'expliquer cette ligne de code stp, j'ai encore un peu de mal à assimiler la syntaxe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    id.iTimer = id.iTimer || null;
    window.clearInterval(id.iTimer);

  8. #8
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 211
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    id.iTimer = id.iTimer || null;
    initialise la propriété iTimer de l'objet id si celui n'existe pas encore, il vaudra null et non undefined.

    Pas sûr d'ailleurs que dans ce cas cela soit vraiment nécessaire attendu que la méthode clearInterval le gère en interne et que l'on l'initialise juste après, donc à virer mais c'est, me semble t-il, plus propre pour la lisibilité.

  9. #9
    Membre averti
    Homme Profil pro
    Intégrateur Web
    Inscrit en
    Novembre 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Intégrateur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2012
    Messages : 14
    Par défaut
    Oui j'ai testé et effectivement ça marche avec ou sans.
    Mais cette partie là est moins évidente à comprendre que le reste

    Merci pour l'aide

  10. #10
    Membre averti
    Homme Profil pro
    Intégrateur Web
    Inscrit en
    Novembre 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Intégrateur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2012
    Messages : 14
    Par défaut
    Encore un truc,
    Pour tester la fonction, j'ai ajouter mes 2 événements dans la section head du document. Malheureusement rien ne se déclenche au survol de l'élément.

    Par contre si je les positionnent juste après l'élément en question, oh miracle ça marche.

    Comment je dois faire pour régler ce problème et laisser mes événements dans le head ?

  11. #11
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Par défaut
    Pourquoi faire ça en Javascript et pas en CSS ?

    Code css : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    img {
         opacity: 0.25;
         transition: opacity 5s linear;
         -webkit-transition: opacity 2s linear;
         -moz-transition: opacity 2s linear;
    }
     
    img:hover {
         opacity: 1;
    }

  12. #12
    Membre averti
    Homme Profil pro
    Intégrateur Web
    Inscrit en
    Novembre 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Intégrateur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2012
    Messages : 14
    Par défaut
    Pour la simple raison que j'ai envie de découvrir d'autres horizons
    Je me suis pris au jeu de la programmation, même si là ça reste très simple.

    Et puis faut dire aussi qu'on est vite limité en css quand il s'agit de réaliser des effets un peu plus poussés.

  13. #13
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    Citation Envoyé par guilten
    on est vite limité en css quand il s'agit de réaliser des effets un peu plus poussés.
    J'imagine que tu n'as pas regardé Les meilleures réalisations CSS3
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  14. #14
    Membre averti
    Homme Profil pro
    Intégrateur Web
    Inscrit en
    Novembre 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Intégrateur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2012
    Messages : 14
    Par défaut
    @ Bovino : Effectivement j'avais pas vu ce topic
    La Joconde en css, ya pas à dire c'est fort !

  15. #15
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 211
    Par défaut
    Citation Envoyé par guilten
    Encore un truc,
    Pour tester la fonction, j'ai ajouter mes 2 événements dans la section head du document. Malheureusement rien ne se déclenche au survol de l'élément.

    Par contre si je les positionnent juste après l'élément en question, oh miracle ça marche.
    il faut TOUJOURS qu'un élément existe avant de l'utiliser, mettre le SCRIPT dans le HEAD est très souvent suffisant lorsque l'on utilise un élément dans une fonction appelée par une action javascript.

    Dis nous en plus sur la façon dont tu appelles les fonctions.

    nota: que l'on ne s'y trompe pas le CSS3 est un véritable langage qui pourrait bien détrôner le javascript sur un certains nombre d'effets pour peu que tous les "vieux" navigateurs ....

  16. #16
    Invité
    Invité(e)
    Par défaut
    mine de rien 7500 lignes de css pour une seule image ça fait beaucoup je vois plutôt ça comme un truc pour s'amuser
    Dernière modification par NoSmoking ; 03/12/2012 à 21h53.

  17. #17
    Membre averti
    Homme Profil pro
    Intégrateur Web
    Inscrit en
    Novembre 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Intégrateur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2012
    Messages : 14
    Par défaut
    J'ai compris mon erreur.
    En fait j'appelai mes fonctions avant même que le document est fini d'être chargé. Ce qui en toute logique ne pouvait pas marcher.
    J'ai donc placé mon gestionnaire d'événements dans une fonction "init" que j'appelle après chargement de la page, et maintenant ça fonctionne !

    Exemple :
    window.onload = init;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [DOM] Pb gestion de l'évènement mouseout sur une <DIV>
    Par rvux69 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 22/01/2007, 21h27
  2. Problème sur évènement d'une liste déroulante
    Par krfa1 dans le forum Access
    Réponses: 7
    Dernier message: 05/05/2006, 08h03
  3. Opacité sur bloc Div - Incompatibilité et ne fonctionne pas
    Par killprog dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 15/03/2006, 15h31
  4. Problème sur évènement
    Par Azharis dans le forum Access
    Réponses: 2
    Dernier message: 12/01/2006, 16h36
  5. [O9i][Win][OMS]Erreur sur événement
    Par Fabien Celaia dans le forum Oracle
    Réponses: 4
    Dernier message: 05/11/2004, 15h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo