是否可以使用javascript来控制GIF
图像的哪个帧正在显示和/或停止动画。我希望能够加载一个具有几个帧的GIF
并仅显示其中一个。
我知道我可以使用大量单独的图像来完成它,但如果我能用GIF
做我想做的事情,那么只需要担心一个文件。
答案 0 :(得分:51)
您可以使用libgif库。
它允许你启动/停止gif并控制gif所在的帧。
<script type="text/javascript" src="./libgif.js"></script>
<img src="./example1_preview.gif" rel:animated_src="./example1.gif"
width="360" height="360" rel:auto_play="1" rel:rubbable="1" />
<script type="text/javascript">
$$('img').each(function (img_tag) {
if (/.*\.gif/.test(img_tag.src)) {
var rub = new SuperGif({ gif: img_tag } );
rub.load(function(){
console.log('oh hey, now the gif is loaded');
});
}
});
</script>
(大多数代码直接取自他们的例子)
答案 1 :(得分:21)
我使用x-gif它非常酷且易于设置。
来自Github:
<x-gif src="probably_cats.gif"></x-gif>
您可以在其中添加以下内容作为属性:
speed="1.0"
(默认模式)将速度乘以属性值; sync
将播放延迟到外部对象; bpm="120"
将GIF同步到给定的每分钟节拍; 选项:
stopped
阻止GIF制作动画;
fill
导致GIF展开以覆盖其容器;
n-times="3.0"
(仅限速度模式)在设定次数后停止播放(通过添加停止的属性); snap
(仅限同步&amp; bpm模式),而不是允许更长的GIF同步到多个节拍,强制它们只适合一个; ping-pong
从前到后依次播放GIF格式; debug
打开Gif Exploder的调试输出; exploded
停止播放,并将每个帧并排显示。答案 2 :(得分:9)
您可以使用CSS sprites在单个图片中执行此操作。
答案 3 :(得分:8)
如果你可以将你的gif转换为精灵表,你可以这样做(使用ImageMagick):
montage animation.gif -coalesce -tile x1 -geometry +0+0 -background None -quality 100 spritesheet.png
新图像甚至可能是较小的尺寸。
获得精灵表后,使用CSS动画。这里使用具有固定帧时间的动画:
var el = document.getElementById('anim');
function play() {
el.style.animationPlayState = 'running';
}
function pause() {
el.style.animationPlayState = 'paused';
}
function reset() {
el.style.animation = 'none';
el.offsetHeight; /* trigger reflow to apply the change immediately */
el.style.animation = null;
}
function stop() {
reset();
pause();
}
&#13;
#anim {
background-image: url('https://i.stack.imgur.com/J5drY.png');
width: 250px;
height: 188px;
animation: anim 1.0s steps(10) infinite;
}
@keyframes anim {
100% { background-position: -2500px; }
}
&#13;
<div id="anim" title="Animated Bat by Calciumtrice"></div>
<button onclick="play()">Play</button>
<button onclick="pause()">Pause</button>
<button onclick="reset()">Reset</button>
<button onclick="stop()">Stop</button>
&#13;
如果您希望动画无法自动启动,请将paused
添加到animation
规则的末尾。