悬停时的 jQuery 动画 |非常快的传球,停止动画

Posted

技术标签:

【中文标题】悬停时的 jQuery 动画 |非常快的传球,停止动画【英文标题】:jQuery animation on hover | Very fast pass, stop the animation 【发布时间】:2012-10-16 13:31:22 【问题描述】:

我创建了一个非常小的 jQuery 插件,供个人使用,它在悬停事件时在图像顶部创建叠加层,然后为两个图标设置动画。

鼠标移开时,它会再次为图标设置动画,然后淡出覆盖层。

虽然动画很好,但问题出在图标上。在鼠标过快的过程中动画 - 进入 - 图标但没有动画 - 出 - 图标。

在这里你可以看到我的意思的一个活生生的例子:http://jsfiddle.net/merianos/yPerY/1/

跟随源码

HTML

<section class="clearfix span-10 last post_container ">
    <article>
        <div class="imageHover">
            <span class="overlay"></span>
            <a href="#" class="image_preview"></a>
            <a href="#" class="image_link"></a>
            <img src="http://goo.gl/YRC7G" />
        </div>
    </article>
</section>​

CSS

.post_container

    position : relative;
    margin   : 100px;


    .post_container article
    
        position    :   relative;
        display     :   block;
        width       :   280px;
    


        .post_container article img
        
            width   :   278px;
            border  :   1px solid #dfe1e0;
        

            .post_container article .overlay
            
                z-index     :   740;
                display     :   block;
                width       :   100%;
                height      :   121px;
                background  :   #000;
                opacity     :   0;
                position    :   absolute;
                top         :   0;
                left        :   0;
            


            .post_container article .image_link,
            .post_container article .image_preview
            
                display             :   block;
                width               :   32px;
                height              :   32px;
                position            :   absolute;
                cursor              :   pointer;
                z-index             :   741;
                top                 :   88px;
                opacity             :   0;
            

            .post_container article .image_link
            
                background :   #0AF;
                left       :   98px;
            

            .post_container article .image_preview
            
                background :   #F0A;
                left       :   150px;
            ​

JavaScript

;(
    function($)
    
        $.fn.extend(
            
                wplImageHover: function(options)
                
                    this.defaultOptions = ;

                    var settings    =   $.extend(, this.defaultOptions, options);
                    var image       =   null;

                    var methods =   
                        init    :   function()
                        
                            image.mouseenter(
                                function(e)
                                
                                    var overlay = $(this).find('.overlay');

                                    overlay.stop().animate(
                                        
                                            'opacity'   :   '0.25'
                                        ,
                                        150
                                    );

                                    overlay.queue(
                                        function()
                                        
                                            var image_preview   =   $(this).siblings('.image_preview');
                                            var image_link      =   $(this).siblings('.image_link');

                                            image_preview.stop().animate(
                                                
                                                    'opacity'   :   1,
                                                    'top'       :   '44px'
                                                ,
                                                150
                                            );

                                            image_link.stop().animate(
                                                
                                                    'opacity'   :   1,
                                                    'top'       :   '44px'
                                                ,
                                                150
                                            );

                                            $(this).dequeue();
                                        
                                    );

                                    e.preventDefault();
                                
                            ).mouseleave(
                                function(e)
                                
                                    var image_preview   =   $(this).find('.image_preview');
                                    var image_link      =   $(this).find('.image_link');

                                    image_preview.stop().animate(
                                        
                                            'opacity'   :   0,
                                            'top'       :   0
                                        ,
                                        150
                                    );

                                    image_link.stop().animate(
                                        
                                            'opacity'   :   0,
                                            'top'       :   0
                                        ,
                                        150
                                    );

                                    image_link.queue(
                                        function()
                                        
                                            var overlay   =   $(this).siblings('.overlay');

                                            overlay.stop().animate(
                                                
                                                    'opacity'   :   0
                                                ,
                                                150
                                            );

                                            overlay.queue(
                                                function()
                                                
                                                    $(this).css(
                                                        
                                                            'opacity'   :   '0'
                                                        
                                                    );

                                                    $(this).siblings('.image_link, .image_preview').css(
                                                        
                                                            'opacity'   :   '0',
                                                            'top'       :   '88px'
                                                        
                                                    );

                                                    $(this).dequeue();
                                                
                                            );

                                            $(this).dequeue();
                                        
                                    );

                                    e.preventDefault();
                                
                            );
                        
                    

                    return this.each(
                        function()
                        
                            image = $(this);

                            methods.init();
                        
                    );
                
            
        );
    
)(jQuery);

$('.imageHover').wplImageHover();​

有人可以帮帮我吗?

亲切的问候 梅里亚诺斯·尼科斯

【问题讨论】:

【参考方案1】:

Demo JSFiddle

在使用 CSS 对图像应用顶部和不透明度之前的 mouseleave 事件中,停止在这些图像上发生的动画。否则它将覆盖您正在应用的 CSS(仅当动画在应用 CSS 时发生)。如果我们移动得非常快,您在鼠标输入中应用的动画正在发生。所以这会导致问题。

所以试试下面的脚本。

;(
function($)

    $.fn.extend(
        
            wplImageHover: function(options)
            
                this.defaultOptions = ;

                var settings    =   $.extend(, this.defaultOptions, options);
                var image       =   null;

                var methods =   
                    init    :   function()
                    
                        image.mouseenter(
                            function(e)
                            
                                var overlay = $(this).find('.overlay');

                                overlay.stop().animate(
                                    
                                        'opacity'   :   '0.25'
                                    ,
                                    150
                                );

                                overlay.queue(
                                    function()
                                    
                                        var image_preview   =   $(this).siblings('.image_preview');
                                        var image_link      =   $(this).siblings('.image_link');

                                        image_preview.stop().animate(
                                            
                                                'opacity'   :   1,
                                                'top'       :   '44px'
                                            ,
                                            150
                                        );

                                        image_link.stop().animate(
                                            
                                                'opacity'   :   1,
                                                'top'       :   '44px'
                                            ,
                                            150
                                        );

                                        $(this).dequeue();
                                    
                                );

                                e.preventDefault();
                            
                        ).mouseleave(
                            function(e)
                            
                                var image_preview   =   $(this).find('.image_preview');
                                var image_link      =   $(this).find('.image_link');

                                image_preview.stop().animate(
                                    
                                        'opacity'   :   0,
                                        'top'       :   0
                                    ,
                                    150
                                );

                                image_link.stop().animate(
                                    
                                        'opacity'   :   0,
                                        'top'       :   0
                                    ,
                                    150
                                );

                                image_link.queue(
                                    function()
                                    
                                        var overlay   =   $(this).siblings('.overlay');

                                        overlay.stop().animate(
                                            
                                                'opacity'   :   0
                                            ,
                                            150
                                        );

                                        overlay.queue(
                                            function()
                                            
                                                $(this).css(
                                                    
                                                        'opacity'   :   '0'
                                                    
                                                );

                                                $(this).siblings('.image_link, .image_preview').stop().css(
                                                    
                                                        'opacity'   :   '0',
                                                        'top'       :   '88px'
                                                    
                                                );

                                                $(this).dequeue();
                                            
                                        );

                                        $(this).dequeue();
                                    
                                );

                                e.preventDefault();
                            
                        );
                    
                

                return this.each(
                    function()
                    
                        image = $(this);

                        methods.init();
                    
                );
            
        
    );

)(jQuery);

$('.imageHover').wplImageHover();​

【讨论】:

以上是关于悬停时的 jQuery 动画 |非常快的传球,停止动画的主要内容,如果未能解决你的问题,请参考以下文章

悬停时的 Jquery 动画

悬停时的Jquery动画子菜单不流畅

悬停时的图像动画jquery

JQuery中鼠标悬停和鼠标悬停时停止和继续动画的方法

使用jQuery动画远离光标时,停止“:悬停”元素保持其状态?

使用 jQuery .animate() 时的图像动画问题