一、屋外:寒风吹,雪花飘;屋内:空调吹,代码飘

上午出去买菜,正好下雨了,还夹杂着冰珠子。鄙人大意,穿的是一件帅气但单薄的黄色大衣,立马冻成了中华田园犬。原本计划去钓鱼的,科科,作罢,上午在家看CCTV5 骑士队vs鹈鹕队,下午补动漫码代码做文章,好生惬意。

对于习惯性刷微博的我,总时不时会看到类似下面的游戏:

测测你和小白(白百何)有哪些共同点,戳开动图,最先看清的词是什么?ie浏览器的同学可以按esc键(或截屏),据说在哪个词暂停,哪个词就是你哦!

OK, 这里出现一个浏览器特性,就是通过ESC快捷键,暂停gif的播放。据说FireFox浏览器以前也有,后来被干掉了,根据@紫云妃的说法是:

是这样的,Firefox原来的表现是:在页面load事件完成,同时x按钮变成刷新按钮之后,esc仍然有几个作用,中断当前正在发送的ajax,websocket,停止gif,apng动画的播放.但这些功能太小众了,影响了普通用户的使用,可能不小心按了esc,结果ajax断了,网页出错了.所以Firefox20修改成:网页加载完成后,esc键完全失效.

然而,这种隐晦的但似乎会影响正常功能的小技巧显然是无法实现真正意义上的gif动态图片的停止与播放的。一是兼容性,二是功能性,三是移动端没有ESC键。

所以,如果我们遇到需要可以随时随地停止gif动态图片播放的需求的时候,就需要寻找其他的出路。好,寒冬里的暖身结束,开始进入正题~~

二、gif图片自己可控前提下的方法一:多img资源控制处理

假如说,我们希望暂停的gif是自己(开发人员)传上去的,不是用户可以随机上传不可控的gif. 我们可以这么处理,就是准备2套图片,一个是gif动态图片,还有一个是只有一帧的静止的图片。然后使用JS来回切换的src值为这两张图片地址就好了。

此方法甚简单,我就不放实例了。

img.src="animate.gif";

// 或者呈现的是

img.src="static.png";

这个方法最大的优点就是兼容性强,所有浏览器都可以实现停止效果。然而,这种方法有个局限,就是,暂停时候呈现的图片永远是同一张。基本上可以说是停止,而不是暂停。

那有没有什么方法可以真正意义上的暂停呢?还真有!

三、gif图片自己可控前提下的方法二:CSS3 animation控制

也就是我们看到的gif效果并不是一个真正的gif图片,而是使用CSS3的animation属性控制形成的逐帧动态图片效果。我搜了下,@DO1路人乙有篇文章“css3-animation制作逐帧动画”专门介绍了这种技术。说穿了就是animation控制Sprites图片的background-position值模拟gif效果。

例如,新版twitter的Like的效果,貌似就有使用该技术:

使用CSS3 animation实现类gif效果的好处在于,图片可以无损,且我们可以很轻松地控制图片动画的暂停和播放,使用的是:animation-play-state: paused;这个声明。

点击demo页面的暂停按钮,您会发现,直接就停住了,如下截图示意,截自IE10浏览器:

再次点击,就会在暂停画面之后继续播放了。从而实现了我们对动画图片的精确控制效果。

此方法看上去完美,但是,1. IE10+等支持CSS3 animation的浏览器才行;2. 最大的问题是图片需要是自己控制,如果想控制用户上传的真正意义的gif图片,只能……望洋兴叹……………………吗?

四、自己无法控制的gif图片的停止与播放

比方说,页面上用户上传了些gif图片,哎呀,闪瞎了我的中华田园眼,我要全部暂停,肿么办?如果后台同学没有对gif进行静态处理,此时,只能靠前端小伙伴,有什么办法吗?

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

点击按钮,然后:

如何使用?

我对HTMLImageElement原型进行了扩展,增加了stop()和play()两个方法,如下:

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;

}

}

};

}

大家只要在页面中自己的JS文件中复制上面的代码,然后就可以直接:

var image = document.getElementsByTagName("img")[0];

// 停止gif图片

image.stop();

// 播放gif图片

image.play();

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

不足

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

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

更新于2020-08-11

可以对GIF文件进行完全的解析,因此,暂停具体的某一帧不在话下。

五、结束语

是胡不是霍,是霍躲不过!哈哈!

上面这个gif也是demo示意gif强力候选。后来一琢磨,看我文章的还是宅男多,腐女少,所以,你懂的……

——我是多年不见的低调的分隔线—–

本文gif比较多,如果您是移动设备查看本文,会发现,怎么我的电池怎么越来越瘦了!不是因为天冷冻小了,而是gif比较耗电。所以,从这个角度讲,我们其实有必要在移动端默认停止这些gif的播放,用户点击再播放。一来省流量,二来省电。

如果没有静态图片资源支持,那不妨试试文章出现的一些方法,有心得记得来这里反馈哈!

最后,本文的方法都是有瑕疵的,自己也尚未在实际项目中使用过。因此,假如阅读本文的您:

1. 有更完美的gif暂停与播放方法;

2. 发现文中方法有不足和遗漏;

都非常希望可以不吝赐教!

感谢阅读!周末温暖!

本文为原创文章,包含脚本行为,会经常更新知识点以及修正一些错误,因此转载请保留原出处,方便溯源,避免陈旧错误知识的误导,同时有更好的阅读体验。

本文地址:http://www.zhangxinxu.com/wordpress/?p=5081

(本篇完)

gif在html里为何会自动停止,CSS或JS实现gif动态图片的停止与播放相关推荐

  1. CSS或JS实现gif动态图片的停止与播放

    by zhangxinxu from http://www.zhangxinxu.com 本文地址:http://www.zhangxinxu.com/wordpress/?p=5081 一. 对于习 ...

  2. html 禁止gif自动播放,通过CSS或JS实现gif动态图片的停止与播放

    到需要可以随时随地停止gif动态图片播放的需求的时候,可以通过下面几种方法实现. 方法一:多img资源控制处理 就是准备2套图片,一个是gif动态图片,还有一个是只有一帧的静止的图片,如jpg图片.然 ...

  3. 【前端 HTML+CSS+JavaScript(JS)】DOM练习-图片在DIV间移动的实现-removeChild cloneNode position append 上下对齐 带注释/总结

    作业要求: 效果: 总结: 1.让元素上下对齐的方法: ①让图片上下对齐用vertical-align:cender; ②让其他元素上下对齐设置line-height与height一样. 2.CSS中 ...

  4. [css] 如何让大小不同的图片等比缩放不变形显示在固定大小的div里?写个例子

    [css] 如何让大小不同的图片等比缩放不变形显示在固定大小的div里?写个例子 图片等比缩放 img{ object-fit: cover/contain;}div宽高比例固定,跟随屏幕变化而变化, ...

  5. HTML5期末大作业:美食网页制作——餐饮料里(12页) HTML+CSS+JavaScript 大学生简单个人静态HTML网页设计作品 DIV布局个人介绍网页模板代码 DW学生个人网站制作成品下载

    HTML5期末大作业:美食网页制作--餐饮料里(12页) HTML+CSS+JavaScript 学生DW网页设计作业成品 web课程设计网页规划与设计 计算机毕设网页设计源码 常见网页设计作业题材有 ...

  6. django里面的css无法加载,django使用admin后台,一部分 css和js文件无法加载-无法打开文件...

    解决使用admin功能时, 一部分 css和js文件无法加载 原因是由settings.py修改debug = true 为 debug =false 引起的, 1.在settings.py添加如下 ...

  7. 如何修改chrome里的html,chrome css修改不更新怎么解决?

    在做web开发过程中,经常需要调试js代码,而在这个时候我们修改过的代码可能不能生效.这是因为浏览器默认是有缓存的,但是这个时候缓存就会影响我们的调试工作,在这里就介绍一下chrome浏览器解决该问题 ...

  8. css样式里把背景设置为图片,利用css如何设置全屏背景图片

    利用css如何设置全屏背景图片 如果你有一张比较绚烂的图片想做背景,可以这样设置,就跟随百分网小编一起去了解下吧,想了解更多相关信息请持续关注我们应届毕业生考试网! 代码如下: body{ backg ...

  9. 介绍html CSS和JS的定义或引用

    现在的网页设计,一般采用内容与表现相分离,即网页的组成包含:内容(HTML)+ 样式(CSS) + 脚本(JS) . 浏览器解析原理 服务器接收到HTML->解析HTML结构建DOM树-> ...

最新文章

  1. 华为交换机路由器常用命令
  2. Nature Method:Bioconda解决生物软件安装的烦恼
  3. 怎么调用获取被创建的预制体_Uber 开源 Plato:扩展性极强的开发测试会话 AI 平台,可实现多智能体并行训练...
  4. 【 FPGA 】序列检测器的Mealy状态机实现
  5. python【数据结构与算法】一维前缀和与差分
  6. 将秒(非时间戳)转化成 ** 小时 ** 分
  7. 我用AI回怼美女汽车销售系列[yolo车牌识别](五) 完结
  8. 2021高考理综单科成绩查询,2021全国各省市高考总分及各科分数 分值是多少
  9. 设计模式之美 - 64状态模式
  10. 走进javascript——解开switch之谜
  11. datax底层原理_Datax 任务分配原理
  12. react全局状态管理_Recoil - Facebook出品的全新React状态管理库
  13. HbuilderX 运行app项目不成功
  14. 英语作文计算机用途80词,初3英语作文_关于介绍电脑的英语作文,初三,80词左右。急!!!...
  15. 自定义mui的索引列表indexedList(可用作通讯录)详细用法
  16. LoadRunner使用教程
  17. mysql初始化后再次输入初始化密码怎么都不对
  18. 改变未来IT业发展的趋势
  19. 使用JavaScript制作动态网页-1
  20. RUST 学习日记 第8课 ——类型转换

热门文章

  1. ORACLE子查询的多种用法
  2. 苹果基带坏了怎么办_iPhone8/8plus无服务怎么办?
  3. 10. 从0学ARM-基于Exynos4412的pwm详解
  4. 如何设计一个分布式环境下全局唯一的发号器
  5. 《论文笔记》Autonomous Robotic Exploration Based on Multiple Rapidly-exploring
  6. rtems bbb板uart驱动编写
  7. 三星SDS为韩国航运业成功测试区块链技术
  8. 【文史】百家讲坛讲稿txt下载
  9. UI设计培训技术教程之字体排版规则
  10. 云平台运行python_如何免费云端运行Python深度学习框架?