jQuery animate () backgroundPosition не работает нормально - PullRequest
3 голосов
/ 18 января 2012

У меня есть этот простой 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");
            });
        });

так что при наведении указателя мыши функция работает правильно, хотя анимация не настолько хороша, и ослабление едва заметно но когда указатель мыши не работает, фоновое изображение просто не движется даже на пикселе ...

В чем проблема? Что я пропустил?

ИЛИ:

$(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 ]

3 голосов
/ 18 января 2012

Я не думаю, что jQuery может анимировать положение фона по умолчанию - я использую http://archive.plugins.jquery.com/project/backgroundPosition-Effect

Стандартный CSS не поддерживает background-position-x и background-position-y, только некоторые поддерживают это, например, Chrome.

А метод jQuery animate() не поддерживает анимацию двух значений одновременно, он иногда будет ошибкой или просто не будет ничего делать в некоторых браузерах.

Так, в конце концов, проверьте это http://snook.ca/archives/javascript/jquery-bg-image-animations. Должен быть плагин jQuery с именем jQuery.bgpos.js, который очень хорошо работает, если вы хотите анимировать положение фона.

Код такой:

(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);
2 голосов
/ 18 января 2012

Похоже, вы используете сложный подход с 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:
...