2010-06-17 5 views
3

J'utilise ce code pour changer l'opacité quand l'utilisateur est sur et hors de l'image malheureusement quand l'utilisateur clique sur l'image l'opacité ne reste pas à 1. N'importe qui a une réponse?Aide avec jquery animate()

$(document).ready(function(){ 

    $('img#slide').animate({"opacity" : .7}) 
    $('img#slide').hover(function(){ 
     $(this).stop().animate({"opacity" : 1}) 
    }, function(){ 
     $(this).stop().animate({"opacity" : .7}) 

    });     


    $('img#slide').click(function(){ 
    $(this).animate({"opacity" : 1}); 
    }); 

}); 
+1

il est important que vous incluiez le code dans la question afin que les futurs chercheurs puissent en bénéficier, même après que pastebin a supprimé le paste. Je l'ai déplacé dans la question pour vous. –

Répondre

2

Vous devez désactiver l'animation en quelque sorte mouseleave lorsque l'utilisateur clique.

Une approche courante consiste à ajouter une classe et à faire vérifier par mouseleave l'existence de la classe.

Testez l'exemple en direct:http://jsfiddle.net/KnCmR/

$(document).ready(function() { 

    $('img#slide').animate({ "opacity": .7 }) 

    .hover(function() { 
     $(this).stop().animate({ "opacity": 1 }) 
    }, 
    function() { 
     if (!$(this).hasClass("active")) { 
      $(this).stop().animate({ "opacity": .7 }); 
     } 
    }) 

    .click(function() { 
     $(this).addClass("active"); 
    }); 
}); 

EDIT:

Si vous voulez un second clic pour revenir le comportement à l'original, utilisez toggleClass() au lieu de addClass():

 $(this).toggleClass("active"); 

docs jQuery:

+0

+1 Cette méthode fonctionne particulièrement bien dans le cas où vous contrôlez plus d'un seul élément DOM. Il permet de généraliser le code et de le lier spécifiquement à l'élément affecté. –

+0

@Doug - Merci pour le +. Vous soulevez un bon point. Il pourrait être considéré comme exagéré s'il n'y a qu'un seul élément avec le comportement. Le vôtre serait plus efficace dans ce cas. – user113716

+0

efficace oui ... mais si vous ajoutez un élément sur la ligne, le mien devra être réécrit. Donc, tout dépend vraiment du projet. –

1

Vous avez juste besoin de suivre si elle a été cliqué ou non. Vous pouvez le faire de plusieurs façons, mais puisque vous n'avez qu'un seul élément que vous suivez, une variable est le moyen le plus simple de le faire. J'ai également optimisé votre code pour utiliser le chaînage. J'ai également changé votre sélecteur pour être plus efficace. #slide est mieux que img#slide depuis un id est censé être unique:

$(document).ready(function(){ 
    var clicked = false; 

    $('#slide') 
    .animate({"opacity" : 0.7}) 
    .hover(function(){ 
     if(!clicked) { 
     $(this).stop().animate({"opacity" : 1}); 
     } 
    }, function(){ 
     if(!clicked){ 
     $(this).stop().animate({"opacity" : 0.7}); 
     } 
    }) 
    .click(function(){ 
     clicked = true; 
    }); 
}); 
+0

+1 L'utilisation d'une variable locale sera plus efficace que ma réponse s'il n'y a finalement qu'un seul élément à traiter. – user113716

0

Toutes les réponses dans ce fil sont bonnes, et travailleraient. Mais pour le plaisir, voici une approche différente. En fonction de votre code et de votre question, ce que vous êtes en train de faire est de supprimer le comportement du pointeur de l'élément. Ce qui devrait être fait comme ci-dessous:

$(document).ready(function(){ 

    $('img#slide').animate({"opacity" : .7}); 

    $('img#slide').hover(function(){ 
     $(this).stop().animate({"opacity" : 1}); 
    }, function(){ 
     $(this).stop().animate({"opacity" : .7}); 
    }); 

    $('img#slide').click(function(){ 
    $(this).unbind('hover'); 
    }); 
}); 

qui peut être refactorisé pour permettre le basculement du comportement d'une manière nouvelle:

$(document).ready(function(){ 

    var over = function(){ 
    $('img#slide').stop().animate({"opacity" : 1}); 
    }; 

    var out = function(){ 
    $('img#slide').stop().animate({"opacity" : 0.7}); 
    }; 

    var on = function(){ 
    $('img#slide').hover(over, out).one('click', off); 
    } 

    var off = function(){ 
    $('img#slide').unbind('hover').one('click', on); 
    }; 

    $("img#slide").one('click', on); 

    out.call(); 

}); 

Note: Je n'ai pas testé (je suis au travail), mais vous avez l'idée.