jQuery:淡入/淡出+动画元素

Posted

技术标签:

【中文标题】jQuery:淡入/淡出+动画元素【英文标题】:jQuery: fade in/out + animate elements 【发布时间】:2011-07-14 13:14:53 【问题描述】:

我正在使用 jQuery 淡入/淡出某些元素并更改其他元素的不透明度。

  $(function()

        $('.image').each(function() 
            $(this).hover(
                function() 
                    $(this).stop().animate( opacity: 0.3 , 'slow');
                    $(this).siblings().fadeIn('slow');
                ,

               function() 
                   $(this).stop().animate( opacity: 1 , 'slow');
                   $(this).siblings().fadeOut('slow');
               )
            );
        );

您可以在http://projects.klavina.com/***/01/ 看到完整的代码(我也在使用页面上的 jQuery Masonry 插件)。

我对 JS/jQuery 还很陌生,上面的代码不能很好地工作,除非我非常缓慢地将 .image 元素悬停。当我更快地移动元素时,即使我已经移动了另一个元素,图像上的标题也会显示出来。我怎样才能删除它? IE。仅当我仍在悬停该特定元素时,字幕才应淡入。

示例网站上的第一张图片具有“z-index: 100;”为标题,所以我可以得到完全不透明的文本覆盖。理想情况下,我会有“z-index: 100;”对于所有字幕,但这会使悬停工作变得更糟。

另外,IE 中的淡入/淡出看起来有些失真。我该如何解决?我确实在另一个页面上使用了不透明度更改,并通过向元素添加白色背景来修复 IE 错误,但我不能在这里这样做(因为我在下面有一张照片)。

谢谢!

【问题讨论】:

+1 用于使用 Masonry - 我刚刚找到它,想不出更酷的东西 :-D 至于你对它的使用,它看起来很棒。抱歉,我无法帮助您解决问题 :-( 同位素比较冷。 isotope.metafizzy.co 【参考方案1】:

您的问题的核心原因是您需要调用.siblings().stop()另外$(this).stop()(您已经拥有)。

修复该问题后,您会看到一个新问题,您的字幕最初可以正常工作,但一旦被反复鼠标悬停,它们只会部分淡入(最终,它们会完全消失,直到您重新加载页面)。这是由于.fadeIn().fadeOut() 结合时的工作方式——fadeIn() 并不总是淡入opacity:1——相反,它淡入到当时应用的任何不透明度@987654332 @ 之前被调用过。

要解决这个问题,您可以使用animate(opacity:1,'slow') 而不是fadeIn('slow') -- 或者您可以使用更简洁(更清晰)的.fadeTo('slow',1) (docs)。 (请注意,fadeTo 上的参数顺序与其他动画函数相比有所不同 - 首先是持续时间,然后是您要淡入的值)。

当然,您也可以使用fadeTo() 代替您的其他不透明动画——尽管使用animate() 肯定没有错,正如您所展示的那样——两者是等价的。 (当然,如果您想同时操作多个 css 属性,则需要选择 animate()。)

当这一切结合在一起时,它可能看起来像这样:

$(function() 
    $('.image').each(function() 
        $(this).hover( function() 
            $(this).stop().fadeTo('slow',0.3)
                .siblings().stop().fadeTo('slow',1);
        , function() 
            $(this).stop().fadeTo('slow',1)
                .siblings().stop().fadeTo('slow',0);
        );
    );
);

你可以在 jsFiddle 看到这段代码的运行:http://jsfiddle.net/coltrane/XstpE/ (注意:该示例取决于上面原始帖子附带的托管资源,因此如果这些资源被移动或变得不可用,它将不起作用)。


另请注意:在上面的示例中,我已经包含了 .each() 的使用,就像您在原始示例中所做的那样,但我想指出它确实没有必要。

以下是等效的(通常被认为是“更好”的 jQuery 技术):

$(function() 
    $('.image').hover(function() 
        $(this).stop().fadeTo('slow', 0.3)
            .siblings().stop().fadeTo('slow', 1);
    , function() 
        $(this).stop().fadeTo('slow', 1)
            .siblings().stop().fadeTo('slow', 0);
    );
);

当您将事件处理程序应用于多元素集合时,jQuery 会自动将相同的处理程序绑定到集合中的每个元素上。 (我在 jsFiddle(上面链接)上更新了我的示例,以显示代码 没有 each())。


编辑

OP 指出,将鼠标悬停在标题(位于图像顶部)上会导致触发 mouseleave 处理程序,从而导致执行转出操作。期望的行为是让标题触发推出。

出现此问题是因为标题“遮蔽”了图像,并且hover() 应用于图像。当鼠标滑过标题时,它不再在图像上(它在标题上),因此浏览器会在图像上触发 mouseleave。同样的情况也会引发各种其他微妙的问题——尤其是当您添加更复杂的内容时。

为了解决这个问题,我建议您简单地将hover() 应用到上一层(应用到包含图像标题的容器),而不是直接应用到图像。在这种情况下,该容器是$('.entry')。代码会变成这样:

$(function() 
    $('.entry').hover(function() 
        $('.image',this).stop().fadeTo('slow', 0.3)
            .siblings().stop().fadeTo('slow', 1);
    , function() 
        $('.image',this).stop().fadeTo('slow', 1)
            .siblings().stop().fadeTo('slow', 0);
    );
);

here is a new version of the jsFiddle

【讨论】:

谢谢你的解释和解释!在 Safari/Chrome/Firefox 中完美运行。不幸的是,在 IE 中效果不佳 - projects.klavina.com/***/01/index-02.html - 当我将鼠标悬停在 区域时;图像淡入 opacity:1 并且标题文本消失。 发生这种情况是因为您的hover() 处理程序在图像上——而不是在标题上——所以当你翻转标题时,IE 将其处理为“离开”图像。如果您为标题提供几个与定位相关的 css 属性中的任何一个,其他浏览器也会这样做。由于这个原因,还会出现其他一些微妙的问题——甚至是 Webkit 和 FF。最好的解决方案(在我看来)是将您的hover() 处理程序放在$('.entry') 而不是$('.image')。 see updated jsFiddle here.【参考方案2】:

不确定“慢”参数在您的动画函数中意味着多长时间。尝试将其调整为“快速”,甚至提供以毫秒为单位的数值,看看是否有帮助。

在鼠标离开元素时停止动画:

$('.image').mouseleave(function() 
    $(this).stop();
);

【讨论】:

我需要动画那么慢(慢 = 600 毫秒),因此将其更改为更快的值无济于事。无论如何我确实尝试过,但问题仍然存在 - 动画继续在前一层上发生,即使我已经移动到另一个层。我相信我需要更改代码,使其在我离开元素时停止执行动画,但不幸的是我没有这样做的知识。 如果您想在鼠标离开时尝试停止元素上的动画,请参阅我的回答编辑。【参考方案3】:

尝试使用 mouseenter() 和 mouseleave() 而不是 hover()。

$(function()
    $('.image').each(function() 
        $(this).mouseenter( function() 
            $(this).stop().animate( opacity: 0.3 , 'slow');
            $(this).siblings().fadeIn('slow');
        )
        .mouseleave( function() 
            $(this).stop().animate( opacity: 1 , 'slow');
            $(this).siblings().fadeOut('slow');
        );
    );
);

【讨论】:

hover() 绑定 mouseentermouseleave (see docs)。直接绑定这些事件应该没有任何区别。

以上是关于jQuery:淡入/淡出+动画元素的主要内容,如果未能解决你的问题,请参考以下文章

淡入淡出效果 (jQuery)

jQuery动画(显示隐藏,淡入淡出,滑动)

JQuery动画

jQuery基础(动画篇 animate,显示隐藏,淡入淡出,下拉切换)

jquery总结06-动画事件03-淡入淡出效果

jq 筛选选择器,方法,隐式迭代 元素显示隐藏 淡入淡出 上拉下拉 动画 类名操作以及样式