动图可控
本帖最后由 亚伦影音工作室 于 2025-9-11 16:26 编辑 <br /><br /><style>#papa{margin: 130px -320px;
width: 1086px;
height: 650px;
background:#800000 url('https://pic1.imgdb.cn/item/6732aa3bd29ded1a8cf96a8e.webp') no-repeat center/cover;
box-shadow: 0px 0px 0px 2px #cccccc, 0px 0px 0px 8px #880000;
position: relative;overflow: hidden;
z-index: 12345;}
#source{width:100%;height: 100%;position:absolute;left: 0px; top:0px;cursor: pointer;background:#800000 url('https://pic1.imgdb.cn/item/68c15a5958cb8da5c898663a.gif') no-repeat center/cover;}
#source img{width:100%;height: 100%;}
</style>
<divid="papa">
<img id="source" src="https://pic1.imgdb.cn/item/68c15a5958cb8da5c898663a.gif">
</div>
<audio id="aud" src="https://s2.ananas.chaoxing.com/sv-w7/audio/e6/09/98/6e1ebeeca17bb7f13a4baa9eb5e31982/audio.mp3" loop autoplay ></audio>
<script>
const renderGif = function (dom) {
if (!dom || !dom.src) {
return;
}
// gif图片的url地址
const src = dom.src;
// 创建的用来播放gif的canvas元素
const canvas = document.createElement('canvas');
const context = canvas.getContext("2d");
// 一些与GIF播放有关的变量
let imageDecoder = null;
let imageIndex = 0;
let paused = false;
// 绘制方法
const renderImage = function (result) {
context.drawImage(result.image, 0, 0);
const track = imageDecoder.tracks.selectedTrack;
// 如果播放结束,从头开始循环
if (imageDecoder.complete) {
if (track.frameCount === 1) {
return;
}
if (imageIndex + 1 >= track.frameCount) {
imageIndex = 0;
}
}
// 绘制下一帧内容
imageDecoder
.decode({ frameIndex: ++imageIndex })
.then((nextResult) => {
if (paused === false) {
setTimeout(() => {
renderImage(nextResult);
}, result.image.duration / 2000.0);
} else {
canvas.nextResult = nextResult;
}
})
.catch((e) => {
// imageIndex可能超出的容错处理
if (e instanceof RangeError) {
imageIndex = 0;
imageDecoder.decode({ frameIndex: imageIndex }).then(renderImage);
} else {
throw e;
}
});
};
// 判断地址能够请求
fetch(src).then((response) => {
// 可以请求,进行样式处理
// 设置canvas尺寸
canvas.width = dom.naturalWidth;
canvas.height = dom.naturalHeight;
// 实际显示尺寸
canvas.style.width = dom.clientWidth + 'px';
canvas.style.height = dom.clientHeight + 'px';
// 隐藏图片,显示画布
dom.after(canvas);
dom.style.position = 'absolute';
dom.style.opacity = '0';
// 将GIF绘制在canvas上
imageDecoder = new ImageDecoder({
data: response.body,
type: "image/gif"
});
// 解析第一帧并绘制
imageDecoder.decode({
frameIndex: imageIndex
}).then(renderImage);
});
// 事件绑定处理
canvas,dom.addEventListener('click', function () {
if (paused) {aud.play();
paused = false;
renderImage(canvas.nextResult);
} else {aud.pause();
paused = true;
}
});
};
renderGif(source);
</script>
这个厉害了,和视频一样,可以停在任何一帧上呢。{:4_187:} 欣赏亚伦老师好帖{:4_199:} 动图控制实现了,谢谢亚伦老师经典分享{:4_191:} 亚纶也是厉害的,第一步完成,后面在一键停止动图的基础上加上播放器和歌词同步{:4_173:} 期待亚纶完美实现后面部分,前面的应该比后面的难一点,后面你容易了{:4_199:}
页:
[1]