前端如何控制GIF的播放和暂停

知乎上的 GIF 动图,在PC 端默认是暂停的,不会自动播放,大致的效果就是下面这个样子。



你一定很想知道图片里面的人是谁对不对,哈哈哈。动图是1994 年拍的「笑林小子」这部电影里面的片段,主演之一就是徐若瑄,因为这部电影是台湾电影,所以我们大陆的同胞知道徐若瑄大致就是通过这部片子,但是我可不是通过「笑林小子」了解她的,「笑林小子」都是后来看的,最先看的她的电影,是天使三部曲第一部「赤裸天使」,当时看的时候,我年龄还小三观都还没有形成,这部电影给我看的挺受伤的,电影里面表现的东西和我当时那点脑容量里面的东西是大大的不同。不过三部曲也就第一部好看点,剩下两部,还是算了吧。

今天看博客的时候,发现有个博客的博主(日本人)也喜欢徐若瑄,特此截图:


https://jp-nightlife.com/profile

注意上面的一句话:其實她還拍過裸體寫真呢。无论是看书看文章还是看照片一定的看仔细了。相关写真内容请自行百度,下面是我认为最好看的一张写真。

唯一遗憾的是这张图片和上面的那张都不是电影里面的截图

跑题结束。


回到正题,知乎的那个效果,你审查元素看下源代码就知道他其实用的是 gifplayer 这个第三方插件。我们就用下,来试试效果。
gifplayer 配合 jQuery 使用要求:

  • 需要有 jquery.js,jquery.gifplayer.js 和 gifplayer.css,在 gifplayer dist 文件里面都能找到。
  • 其次需要准备一张静态图和一个 gif 动图,静态图最好是从 GIF 动图的第一帧,使用 wps 打开 GIF ,就能保存动图的任意一帧为图片,然后把静态图片和动图取相同的名字放在同级目录下,注意动图的后缀为 gif。
  • 调用.gifplayer()方法获取所需图像。
    来看使用源代码:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="./gifplayer.css">
    <style>
        .gifplayer{
            width: 100px;
        }
    </style>
</head>
<body>

    <img class="gifplayer" src="./vivian.jpg" />
    <script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
    <script src="./jquery.gifplayer.js"></script>
    <script>
        $('.gifplayer').gifplayer();
    </script>
</body>
</html>

动图演示:


默认情况下,图片上显示的文字是 GIF ,如果想要自定义可以这么设置:

$('.gifplayer').gifplayer({ label: 'play' });

你是不是也感觉图片上显示的圆有点大,看着不好看,这就得去改我们引入的 css 样式表了,调到你看着合适。



这个效果还凑合。但是没有知乎的好看,原因是知乎上面的那个图片是自己放的 svg 。要想达到如此高度的自定义只能自己写了。

那我们就自己写,但我告诉你要写你自己写。我的技能当然是 ctrl + c 然后 ctrl + v 了。



源代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        img{
            width: 150px;
        }
    </style>
</head>
<body>
<p><input type="button" id="btn" value="停止"></p>
<img src="./vivian.gif" alt="">
    <script>
        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.getElementsByTagName("img")[0];
        button = document.getElementById("btn");

        if (image && button) {
            button.onclick = function() {
                if (this.value == '停止') {
                    image.stop();
                    this.value = '播放';
                } else {
                    image.play();
                    this.value = '停止';
                }
            };
        }
    </script>
</body>
</html>

现在只需要把按钮给布局到动图的中央,换上去一个图片轻轻松松就能达到知乎动图播放暂停的效果了。操作 gif 很明显还没有想操作 video 标签似的能够做到操作素材的每一帧,所有文章标题准确点应为(暂停=》停止):

前端如何控制GIF的播放和停止

在工作中,我遇到的可没这么难,其中一个场景就是鼠标移上图片播放 gif,鼠标没有移动到图片上就是一个静态图片。这个就简单只需要简单的操作下 DOM 元素就行了。就类似:

img.src="animate.gif";
// 或者呈现的是
img.src="static.png";

但是浏览器有个很神奇的功能,照理说 gif 图片在浏览器里面会一直播放,结果我在操作 DOM 把图片由原来的静图给替换成动图,死活 gif 就执行了一次。多一次都不执行,恰好和产品要求的一样真是天助我也。效果如下:


这个动图不知道存多久了,就等写文章的时候用上

最后放个别人的博客:https://github.com/sunseekers
参考来源:小tips: CSS或JS实现gif动态图片的停止与播放

2020年1月18日19:05:59

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,348评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,122评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,936评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,427评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,467评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,785评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,931评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,696评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,141评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,483评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,625评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,291评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,892评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,741评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,977评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,324评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,492评论 2 348

推荐阅读更多精彩内容