2010-06-17 93 views
3

我使用这段代码来改变不透明度,当用户打开和关闭一张图片不幸的是,当用户点击图片时,不透明度不会停留在1.任何人都有答案?帮助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

其中重要的是,在问题中包含代码,以便未来的搜索者可以从中受益,即使在pastebin删除了粘贴之后也是如此。我为你解决了这个问题。 – 2010-06-17 12:49:58

回答

2

你需要以某种方式禁用mouseleave动画用户点击时。

一种常用的方法是添加一个类,并且mouseleave检查该类的存在。

测试活生生的例子: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"); 
    }); 
}); 

编辑:

如果你想第二次点击回复行为回到原来的,使用toggleClass()代替addClass()

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

jQuery的文档:

+0

+1此方法在您控制多个DOM元素的情况下效果特别好。它允许代码被泛化,并且特别与受影响的元素绑定。 – 2010-06-17 12:56:58

+0

@Doug - 感谢+。你提出一个好点。如果只有一个元素具有该行为,则可以认为这是过度杀伤。在这种情况下,你的效率会更高。 – user113716 2010-06-17 13:03:30

+0

有效率是...但是如果你添加了一个元素下来,我的将不得不被重写。所以这一切都取决于该项目。 – 2010-06-17 13:06:34

1

你只需要跟踪它是否已被按下。您可以通过几种方法来完成,但由于您只有一个要跟踪的元素,因此变量是最简单的方法。我还优化了您的代码以利用链接。我也改变了你的选择,以提高效率。 #slide是因为一个idimg#slide更好的应该是唯一的:

$(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如果最终只有一个元素需要处理,那么使用局部变量会比我的答案更有效率。 – user113716 2010-06-17 13:04:59

0

所有在这个线程的答案都不错,而且是可行的。但为了它,这是一种不同的方法。

根据你的代码和你的问题,你实际上做的是从元素中删除悬停行为。这应该按以下步骤进行:

$(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'); 
    }); 
}); 

这可重构允许该行为的来回切换以一种新颖的方式:

$(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(); 

}); 

注:我没有测试过这一点(我在工作),但你明白了。