使用JS和canvas实现gif动图的停止和播放代码

发布时间 - 2026-01-11 03:03:34    点击率:

HTML5 canvas可以读取图片信息,绘制当前图片。于是可以实现图片马赛克,模糊,色值过滤等很多图片特效。我们这里不用那么复杂,只要读取我们的图片,重绘下就可以。


HTML代码:

<img id="testImg" src="xxx.gif" width="224" height="126">
<p><input type="button" id="testBtn" value="停止"></p>

JS代码:

if ('getContext' in document.createElement('canvas')) {
 HTMLImageElement.prototype.play = function() {
  if (this.storeCanvas) {
   // 移除存储的canvas
   this.storeCanvas.parentElement.removeChild(this.storeCanvas);
   this.storeCanvas = null;
   // 透明度还原
   image.style.opacity = '';
  }
  if (this.storeUrl) {
   this.src = this.storeUrl; 
  }
 };
 HTMLImageElement.prototype.stop = function() {
  var canvas = document.createElement('canvas');
  // 尺寸
  var width = this.width, height = this.height;
  if (width && height) {
   // 存储之前的地址
   if (!this.storeUrl) {
    this.storeUrl = this.src;
   }
   // canvas大小
   canvas.width = width;
   canvas.height = height;
   // 绘制图片帧(第一帧)
   canvas.getContext('2d').drawImage(this, 0, 0, width, height);
   // 重置当前图片
   try {
    this.src = canvas.toDataURL("image/gif");
   } catch(e) {
    // 跨域
    this.removeAttribute('src');
    // 载入canvas元素
    canvas.style.position = 'absolute';
    // 前面插入图片
    this.parentElement.insertBefore(canvas, this);
    // 隐藏原图
    this.style.opacity = '0';
    // 存储canvas
    this.storeCanvas = canvas;
   }
  }
 };
}
 
var image = document.getElementById("testImg"), 
 button = document.getElementById("testBtn");
 
if (image && button) {
 button.onclick = function() {
  if (this.value == '停止') {
   image.stop();
   this.value = '播放';
  } else {
   image.play();
   this.value = '停止';
  }
 };
}

上面代码并未详尽测试,以及可能的体验问题(IE闪动)没有具体处理(影响原理示意),若要实际使用,需要自己再微调完美下。

不足:

1. IE9+支持。IE7/IE8不支持canvas没搞头。

2. 只能停止gif,不能真正意义的暂停。因为canvas获得的gif图片信息为第一帧的信息,后面的貌似获取不到。要想实现暂停,而不是停止,还需要进一步研究,如果你有方法,非常欢迎分享。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# canvas  # gif  # 动画  # html5  # nodejs实现截取上传视频中一帧作为预览图片  # javascript帧动画(实例讲解)  # 复杂的javascript窗口分帧解析  # 详解关于JSON.parse()和JSON.stringify()的性能小测试  # JS使用JSON.parse()  # JSON.stringify()实现对对象的深拷贝功能分析  # 关于JSON.parse()  # JSON.stringify()  # jQuery.parseJSON()的用法  # js获取 gif 的帧数的代码实例  # 你有  # 要想  # 不支持  # 可以实现  # 若要  # 还需  # 大家多多  # 移除  # 就可以  # 而不是  # 插入图片  # 要进一步  # src  # testImg  # xxx  # width  # height  # button  # testBtn 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】  Laravel如何配置Horizon来管理队列?(安装和使用)  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】  免费视频制作网站,更新又快又好的免费电影网站?  ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】  JavaScript如何实现路由_前端路由原理是什么  Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】  如何快速搭建个人网站并优化SEO?  微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】  如何在腾讯云服务器上快速搭建个人网站?  米侠浏览器网页图片不显示怎么办 米侠图片加载修复  深圳网站制作平台,深圳市做网站好的公司有哪些?  如何彻底卸载建站之星软件?  Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转  BootStrap整体框架之基础布局组件  Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置  如何在云服务器上快速搭建个人网站?  什么是JavaScript解构赋值_解构赋值有哪些实用技巧  奇安信“盘古石”团队突破 iOS 26.1 提权  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  如何实现javascript表单验证_正则表达式有哪些实用技巧  Java Adapter 适配器模式(类适配器,对象适配器)优缺点对比  Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康  如何彻底删除建站之星生成的Banner?  *服务器网站为何频现安全漏洞?  Android GridView 滑动条设置一直显示状态(推荐)  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  香港服务器租用每月最低只需15元?  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】  浅谈javascript alert和confirm的美化  Laravel如何为API生成Swagger或OpenAPI文档  微信小程序 五星评分(包括半颗星评分)实例代码  如何使用 jQuery 正确渲染 Instagram 风格的标签列表  Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】  如何在七牛云存储上搭建网站并设置自定义域名?  Laravel如何处理异常和错误?(Handler示例)  Laravel怎么判断请求类型_Laravel Request isMethod用法  使用C语言编写圣诞表白程序  打造顶配客厅影院,这份100寸电视推荐名单请查收  如何登录建站主机?访问步骤全解析  浅谈redis在项目中的应用  ,在苏州找工作,上哪个网站比较好?  制作旅游网站html,怎样注册旅游网站?  如何快速辨别茅台真假?关键步骤解析  Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】  详解阿里云nginx服务器多站点的配置  bing浏览器学术搜索入口_bing学术文献检索地址  Laravel怎么解决跨域问题_Laravel配置CORS跨域访问