【问题标题】:Animating background image relative to mousemove相对于 mousemove 动画背景图像
【发布时间】:2014-01-16 15:22:08
【问题描述】:

所以我在页面上有一个带有背景图像的对象,并且在 mousemove 上它移动了相对于鼠标的背景位置。但我唯一的问题是当鼠标进入对象时,将背景图像动画到鼠标的当前位置。

我能够将背景位置动画化回其原始位置。

这是我的 jQuery

    //MOUSE MOVE, INVERT BACKGROUND POSITION
    jQuery('.homeSlider').mousemove(function(move){
        var moveMouse = (move.pageX * -1 / 15);
        jQuery('.homeSlider .slide').css({
            'background-position-x': moveMouse + 'px'
        });
    });
    //MOUSE LEAVE, ANIMATE BACKGROUND TO START POSITION
    jQuery('.homeSlider').mouseleave(function(){
        jQuery('.homeSlider .slide').animate({
            'background-position-x': '0'
        });
    });

http://jsfiddle.net/TWHh2/

【问题讨论】:

    标签: javascript jquery html css mousemove


    【解决方案1】:

    添加这个 CSS

    .slide {
        transition: background-position-x 0.5s;
    }
    

    updated fiddle

    【讨论】:

    • 这样做的坏处是,它也会影响mousemove功能,并且使背景图像移动不再流畅,响应性也不是很好。
    • @abhitalks 它只是让 background-position-x 属性“过渡”到 0.5 秒。也就是说,对属性所做的更改会以一种过渡的方式进行更新。
    • @vals:谢谢。我曾经认为它只适用于 CSS 事件,如 ":hover" 等。再次感谢。
    【解决方案2】:

    除了按照 vals 的建议使用 CSS 过渡之外,您还可以使用 JS 来设置位置或根据需要移动的距离对其进行动画处理。如果距离高于阈值,则可以对其进行动画处理(否则运动会跳跃)。否则,请按照您当前的方式设置 CSS。

    这样的事情可能会奏效:

    var animating = false;
    jQuery('.homeSlider').mousemove(function(move){
        var $slider = jQuery('.homeSlider .slide');
        var moveMouse = (move.pageX * -1 / 3);
        var bgPos = $slider.css('background-position-x');
    
        if (!animating && Math.abs(moveMouse - parseInt(bgPos)) > 10) {
            animating = true;
            $slider.animate({
                'background-position-x': moveMouse + 'px'
            }, 400);
            setTimeout(function() {
                animating = false;
            }, 400);
        } else if (!animating) {
            $slider.css({
                'background-position-x': moveMouse + 'px'
            });
        }
    });
    

    jsFiddle

    我会推荐它而不是纯 CSS 解决方案,因为它总是会应用动画,其中包括小的背景位置变化。如果你检查了过渡的小提琴,平滑的背景效果不再是非常敏感的,并且失去了一些平滑度。

    这样做的缺点是当鼠标快速移动时它会变得反应迟钝,类似于纯 CSS 的解决方案。

    替代方案

    结合 JS 和 CSS 过渡解决方案:

    CSS

    .slide.animate {
        transition: background-position-x 0.4s;
    }
    

    JS

    ...
    if (!$slider.hasClass('animate') && Math.abs(moveMouse - parseInt(bgPos)) > 10) {
        $slider.addClass('animate');
        setTimeout(function() {
            $slider.removeClass('animate');
        }, 400);
    }
    ...
    

    【讨论】:

    • @TheOne 如果我不快速移动鼠标,它对我来说效果很好。还可以通过添加mouseenter 事件处理程序并让mousemove 检查背景是否从mouseenter 事件动画化来改进该示例。那么你就不需要 mousemove 事件的动画部分了。
    猜你喜欢
    • 1970-01-01
    • 2010-10-23
    • 1970-01-01
    • 2011-01-08
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 2016-03-31
    相关资源
    最近更新 更多