如何使用javascript从PNG图像显示动画图像?[像gmail]

IT技术 javascript image animation png
2021-03-14 09:49:36

首先,查看这张图片
眨眼
Gmail 使用这张图片来显示动画表情。
我们如何使用 png 图像显示这样的动画?

6个回答

我给你留下一个粗略的例子,所以你可以得到一个起点:

我将使用一个简单的 div 元素,width以及height动画图像将具有的 和 png 精灵作为background-imagebackground-repeat设置为no-repeat

需要的 CSS:

#anim {
  width: 14px; height: 14px;
  background-image: url(https://ssl.gstatic.com/ui/v1/icons/mail/im/emotisprites/wink2.png);
  background-repeat: no-repeat; 
}

需要标记:

<div id="anim"></div>

诀窍基本上是使用background-positionCSS 属性向上滚动背景图像精灵

我们需要知道height动画图像的(知道我们每次向上滚动多少)和滚动多少次(多少会有动画)。

JavaScript 实现:

var scrollUp = (function () {
  var timerId; // stored timer in case you want to use clearInterval later

  return function (height, times, element) {
    var i = 0; // a simple counter
    timerId = setInterval(function () {
      if (i > times) // if the last frame is reached, set counter to zero
        i = 0;
      element.style.backgroundPosition = "0px -" + i * height + 'px'; //scroll up
      i++;
    }, 100); // every 100 milliseconds
  };
})();

// start animation:
scrollUp(14, 42, document.getElementById('anim'))

编辑:您还可以以编程方式设置 CSS 属性,这样您就不必在页面上定义任何样式,并从上面的示例中创建一个构造函数,这将允许您同时显示多个精灵动画:

用法:

var wink = new SpriteAnim({
  width: 14,
  height: 14,
  frames: 42,
  sprite: "https://ssl.gstatic.com/ui/v1/icons/mail/im/emotisprites/wink2.png",
  elementId : "anim1"
});

var monkey = new SpriteAnim({
  width: 18,
  height: 14,
  frames: 90,
  sprite: "https://ssl.gstatic.com/ui/v1/icons/mail/im/emotisprites/monkey1.png",
  elementId : "anim4"
});

执行:

function SpriteAnim (options) {
  var timerId, i = 0,
      element = document.getElementById(options.elementId);

  element.style.width = options.width + "px";
  element.style.height = options.height + "px";
  element.style.backgroundRepeat = "no-repeat";
  element.style.backgroundImage = "url(" + options.sprite + ")";

  timerId = setInterval(function () {
    if (i >= options.frames) {
      i = 0;
    }
    element.style.backgroundPosition = "0px -" + i * options.height + "px";
     i++;
  }, 100);

  this.stopAnimation = function () {
    clearInterval(timerId);
  };
}

请注意,我添加了一个stopAnimation方法,因此您稍后可以通过调用它来停止指定的动画,例如:

monkey.stopAnimation();

这里检查上面的例子

2021-04-20 09:49:36
+1 对于一个相当简单的问题的最深入的回答之一
2021-04-24 09:49:36
很好的答案,很好的实施。作为站点注释:如果您的动画内容变得越来越复杂:spritely.net似乎是与 sprite 动画相关的所有内容的不错的小型库。
2021-04-30 09:49:36
我想补充一点,也可以使用 CSS 中的 steps()函数在没有 JS 的情况下使用这种技术来制作简单的动画:blog.teamtreehouse.com/css-sprite-sheet-animations-steps
2021-05-06 09:49:36
谢谢你,但是我不明白第一个例子中两个匿名函数的使用(为什么是“返回函数”?)。
2021-05-08 09:49:36

CMS 的回答很好,但也有您可能想要使用APNG(动画 PNG)格式。当然,第一帧(甚至由不支持 APNG 的浏览器显示的帧)应该是“结束”帧,只需指定跳过文件中的第一帧。

很高兴了解新格式。但我只是想知道我们如何使用静态 PNG 显示动画。
2021-04-21 09:49:36

将元素的背景图像设置为第一张图像,然后使用 javascript 通过每 x 毫秒更改一次样式来更改图像。

请告诉我怎么做。 change the image every x milli
2021-04-24 09:49:36

您可以使用 TweenMax 和 stepedEase 缓动:http ://codepen.io/burnandbass/pen/FfeAahttp://codepen.io/burnandbass/pen/qAhpj, 无论您选择什么:)