jQuery animate()backgroundPosition不能正常工作

时间:2012-01-18 18:27:52

标签: jquery jquery-animate background-image background-position

我有这个简单的HTML:

<span class="coverImg" style="background-image:url('images/show2.jpg');"></span></a>

和一些Javascript:

$(function() {
            $(".coverImg").hover(function() {
                $(this).animate({
                    backgroundPosition : "0 0"
                }, "fast");
            }, function() {
                $(this).animate({
                    backgroundPosition : "50% 50%"
                }, "fast");
            });
        });

所以当鼠标悬停时,该功能正常工作,虽然动画不是那么完美,很容易看到缓和.. 但是当mouseout功能不起作用时,背景图像只是坐在那里,甚至不在像素上移动......

有什么问题?我错过了什么?

OR:

$(function() {
            $(".coverImg").mouseover(function() {
                $(this)
                .animate({
                    "background-position-x" : "-=20px",
                    "background-position-y" : "-=20px"
                }, "fast");
            }).mouseout(function() {
                $(this).animate({
                    "background-position-x" : "0 ",
                    "background-position-y" : "0"
                }, "fast");
            })
        })

这仅适用于Chrome ...

所以又是什么问题!什么是虫子!我错过了什么?!

2 个答案:

答案 0 :(得分:3)

我认为jQuery不能将背景位置设为默认动画 - 我使用http://archive.plugins.jquery.com/project/backgroundPosition-Effect

标准CSS不支持background-position-xbackground-position-y,只有少数人支持此功能。

jQuery的animate()方法不支持同时为两个值设置动画,有时会出现错误,或者在某些浏览器中没有做任何事情。

毕竟,请查看http://snook.ca/archives/javascript/jquery-bg-image-animations。应该有一个名为jQuery.bgpos.js的jQuery插件,如果你想为背景位置设置动画效果很好。

代码是这样的:

(function($) {
$.extend($.fx.step, {
    backgroundPosition : function(fx) {
        if(fx.state === 0 && typeof fx.end == 'string') {
            var start = $.curCSS(fx.elem, 'backgroundPosition');
            start = toArray(start);
            fx.start = [start[0], start[2]];
            var end = toArray(fx.end);
            fx.end = [end[0], end[2]];
            fx.unit = [end[1], end[3]];
        }
        var nowPosX = [];
        nowPosX[0] = ((fx.end[0] - fx.start[0]) * fx.pos) + fx.start[0] + fx.unit[0];
        nowPosX[1] = ((fx.end[1] - fx.start[1]) * fx.pos) + fx.start[1] + fx.unit[1];
        fx.elem.style.backgroundPosition = nowPosX[0] + ' ' + nowPosX[1];
        function toArray(strg) {
            strg = strg.replace(/left|top/g, '0px');
            strg = strg.replace(/right|bottom/g, '100%');
            strg = strg.replace(/([0-9\.]+)(\s|\)|$)/g, "$1px$2");
            var res = strg.match(/(-?[0-9\.]+)(px|\%|em|pt)\s(-?[0-9\.]+)(px|\%|em|pt)/);
            return [parseFloat(res[1], 10), res[2], parseFloat(res[3], 10), res[4]];
        }

    }
});})(jQuery);

答案 1 :(得分:2)

好像你正在使用jQuery的重手法。这可以单独用css完成:

span {
    background: url(yourimage.jpg) top left no-repeat;
    transition: all 3s ease-in-out;
}

span:hover {
    background-position: 50% 50%;
}

背景位置更改将在现代浏览器中生成动画,并且只是IE8及以下版本的静态更改。

您可能还想添加transition属性的其他浏览器特定前缀版本:

-webkit-transition:  
-moz-transition:  
-o-transition:  
transition: