javascript - 当用户将鼠标悬停在 Canvas 上时创建动画

标签 javascript jquery canvas

当用户将鼠标悬停在 Canvas 上时,我尝试添加图像并为它们设置动画,一旦他们将鼠标移离 Canvas ,我想停止出现新图像。

为了实现这一目标,我尝试在新图像上设置一个间隔,每 100 毫秒触发一次,然后如果用户将鼠标移离 Canvas ,则该函数应该停止触发。

canvas.addEventListener("mouseover", setInterval(newImage, 100), false);
canvas.addEventListener("mouseout", clearInterval(newImage), false);

下面的 JS 代码

  //gets canvas element
  var canvas = document.getElementById('canvas');
  var ctx = canvas.getContext('2d');
  canvas.width = window.innerWidth;
  canvas.height = window.innerHeight;

  function newImage() {

    //random position on the canvas
    var randomPosition = parseInt(Math.random() * window.innerWidth);

    var images = [
      'http://www.convoy.me/image/landing/Scratcher.png',
      'http://www.convoy.me/image/landing/push_harder_0006.png'
    ];

    var y = window.innerHeight;

    //selects a random image
    var randomImage = parseInt(Math.random() * images.length);

    //IIFE draw
    (function draw() {
      var imageObj = new Image();
      imageObj.onload = function() {

        ctx.clearRect(randomPosition - imageObj.width, y, imageObj.width, imageObj.height);

        y -= 10;

        ctx.drawImage(imageObj, randomPosition - imageObj.width, y, imageObj.width, imageObj.height);

        if (y > -imageObj.height) {
          requestAnimationFrame(draw)
        }
      };
      imageObj.src = images[randomImage];
    })();
  }

  canvas.addEventListener("mouseover", setInterval(newImage, 100), false);
  canvas.addEventListener("mouseout", clearInterval(newImage), false);
<canvas id="canvas"></canvas>

最佳答案

我认为问题是间隔永远不会清除。您需要将间隔分配给变量,然后通过变量名称清除间隔:

var newImageInterval;

canvas.addEventListener("mouseover", function(){
  newImageInterval = setInterval(newImage, 100);
}, false);
canvas.addEventListener("mouseout", function(){
  clearInterval(newImageInterval);
}, false);

关于javascript - 当用户将鼠标悬停在 Canvas 上时创建动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39794186/

相关文章:

javascript - 为什么需要匿名函数来使用 setTimeout 保留 "this"

javascript - 如何在 Leaflet 中为 2 点制作曲线?

javascript - HTML5 canvas如何给它一个边界?

javascript - 结合传说中的系列

javascript - 比较 Vanilla JS 中包含对象的两个数组

javascript - 星级评分系统jquery

jquery 动画到自动高度不起作用

javascript - 如何使用 Bootstrap 模态对话框并获取返回值?

javascript - 使用与 DOCTYPE 不同的 window.innerHeight/Width 的全屏 HTML 元素

javascript - 如何在 HTML5 Canvas 中平滑缩放图案图像?