Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/406.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JQuery动画在按键时变慢_Javascript_Jquery_Html_Css_Animation - Fatal编程技术网

Javascript JQuery动画在按键时变慢

Javascript JQuery动画在按键时变慢,javascript,jquery,html,css,animation,Javascript,Jquery,Html,Css,Animation,我正在使用JQuery使用箭头键设置div的动画 由于某些原因,当我在当前方向重复按箭头键时,动画每次都会以拖动方式减慢 我以为$player.stop()和$player.clearQueue()可以解决这个问题,但显然不行。有什么建议吗 这里有一个jsfiddle: 下面是我的JS代码 $(document).ready(function () { var $player = $('#player'), $enemy1 = $('#enemy1'), $bg = $

我正在使用JQuery使用箭头键设置div的动画

由于某些原因,当我在当前方向重复按箭头键时,动画每次都会以拖动方式减慢

我以为
$player.stop()
$player.clearQueue()
可以解决这个问题,但显然不行。有什么建议吗

这里有一个jsfiddle:

下面是我的JS代码

$(document).ready(function () {

    var $player = $('#player'),
    $enemy1 = $('#enemy1'),
    $bg = $('#container'),
    playerW = $player.outerWidth(),
    playerH = $player.outerHeight(),
    bgW = $bg.width(),
    bgH = $bg.height(),
    playerX,
    playerY,
    enemySpeed = 1000,
    playerSpeed = 1000,
    direction,
    down = false;

    var targetSound1 = $('#targetSound1')[0];
    targetSound1.loop = true;

    function keypress(e) {

        $player.clearQueue();
        $player.stop()
        if (down) {
            return;
        }
        down = true;

        var playerLeft = $player.css('left');
        var playerTop = $player.css('top');
        var key = e.which || e.keyCode;
        if ([38, 40, 37, 39].includes(key)) {
            e.preventDefault(); // prevent defualts (scrolling)!
        }

        if (key == "37") {
            direction = 'left';
            playerLeft = 0;
        } else if (key == "38") {
            direction = 'up';
            playerTop = 0;
        } else if (key == "39") {
            direction = 'right';
            playerLeft = bgW - playerW;
        } else if (key == "40") {
            direction = 'down';
            playerTop = bgH - playerH;
        }

        $player.animate({
            left: playerLeft,
            top: playerTop
        },
            playerSpeed, 'linear');

    }

    function makeNewPosition($container) {

        // Get viewport dimensions (remove the dimension of the div)
        $container = ($container || $(window))
        var h = $container.height() - 50;
        var w = $container.width() - 50;
        var nh = Math.floor(Math.random() * h);
        var nw = Math.floor(Math.random() * w);

        return [nh, nw];
    }

    function animateDiv() {

        var $target = $($enemy1);
        var newq = makeNewPosition($target.parent());
        var oldq = $target.offset();
        var speed = enemySpeed;

        $($enemy1).animate({
            top: newq[0],
            left: newq[1]
        }, speed, 'linear', function () {
            animateDiv();
        });
    };

    $(document).on('keydown', keypress);
    $(document).on('keyup', function () {
        down = false
    });

    animateDiv();

});

我检查了你的小提琴。我玩了一会儿,找到了一个解决办法。小提琴在这儿

解决方案:所以我的逻辑是,如果触发事件的键是触发前一个事件的键,那么我们不应该再为#player div设置动画。只有当关键点发生变化时,我们才应该设置它的动画。这将阻止不必要的动画堆积和减慢动画。因此,我认为我们可能会跟踪最后一个动画,只有当按下的键发生变化时,我们才会允许动画发生。结果:平滑动画:)

这就是成功的代码!检查小提琴的全部代码

if(key==lastKey)
{
return;
}
else
lastKey=key;
此外,还必须从代码中删除这一行,因为它会停止player div的动画

$player.stop()

美好的简单有效。谢谢