以编程方式停止 GIF 动画

IT技术 javascript html animated-gif
2021-01-13 22:33:48

我正在开发一个 Twitter 应用程序,它直接从 Twitter 引用图像。如何防止播放 gif 动画?

window.stop()在页面末尾使用在 Firefox 中对我不起作用。

有没有更好的 JavaScript hack?最好这应该适用于所有浏览器

4个回答

受到@Karussell 回答的启发,我写了 Gifffer。在这里查看https://github.com/krasimir/gifffer

它会自动在您的 Gif 顶部添加停止/播放控制。

我意识到这是 3 1/2 岁。我不在乎,这并不意味着这仍然不出色。今天把它插入一个页面,效果很好。
2021-03-13 22:33:48
如果可以,为什么要多出 g?
2021-03-18 22:33:48
希望我能在这里为之前的评论 +5 ...... :) 这是一段很棒的小(但非常聪明)代码,用于处理这样的动画 GIF。谢谢
2021-03-31 22:33:48
@Marvin 我猜你在问为什么额外的“f”。我想“gifer”已经被拿走了。
2021-04-04 22:33:48
希望我能+5这个。
2021-04-09 22:33:48

这不是跨浏览器的解决方案,但它适用于 Firefox 和 Opera(不适用于 ie8 :-/)。采取从这里

[].slice.apply(document.images).filter(is_gif_image).map(freeze_gif);

function is_gif_image(i) {
    return /^(?!data:).*\.gif/i.test(i.src);
}

function freeze_gif(i) {
    var c = document.createElement('canvas');
    var w = c.width = i.width;
    var h = c.height = i.height;
    c.getContext('2d').drawImage(i, 0, 0, w, h);
    try {
        i.src = c.toDataURL("image/gif"); // if possible, retain all css aspects
    } catch(e) { // cross-domain -- mimic original with all its tag attributes
        for (var j = 0, a; a = i.attributes[j]; j++)
            c.setAttribute(a.name, a.value);
        i.parentNode.replaceChild(c, i);
    }
}
基于此答案的
2021-03-14 22:33:48
如果我没记错的话,在 IE8 中 gif 元素有一个stop函数,你可以调用它来停止动画。
2021-03-14 22:33:48
剧本有问题,不是吗?如果.drawImage没有因错误而失败,则没有 CORS 问题并且catch分支将不会执行。但是,如果存在 CORS 问题,则脚本会结束并且try/catch不会到达整体我对吗?
2021-03-16 22:33:48
认为这仅适用于本地动画 gif,而不是托管在不同域上的那些
2021-03-30 22:33:48
据我所知,它使用的是 HTML5,它应该适用于任何支持 HTML5 的浏览器。根据这个:deepbluesky.com/blog/-/browser-support-for-css3-and-html5_72 IE 仍然不支持它。
2021-04-09 22:33:48

为了改进 Karussell 的回答,这个版本应该是跨浏览器的,冻结所有图像,包括那些文件结尾不正确的图像(例如自动图像加载页面),并且不与原始图像的功能发生冲突,允许原件被右键单击,就好像它在移动一样。

我会让它检测动画,但这比仅仅冻结它们要密集得多。

function createElement(type, callback) {
    var element = document.createElement(type);

    callback(element);

    return element;
}

function freezeGif(img) {
    var width = img.width,
    height = img.height,
    canvas = createElement('canvas', function(clone) {
        clone.width = width;
        clone.height = height;
    }),
    attr,
    i = 0;

    var freeze = function() {
        canvas.getContext('2d').drawImage(img, 0, 0, width, height);

        for (i = 0; i < img.attributes.length; i++) {
            attr = img.attributes[i];

            if (attr.name !== '"') { // test for invalid attributes
                canvas.setAttribute(attr.name, attr.value);
            }
        }

        canvas.style.position = 'absolute';

        img.parentNode.insertBefore(canvas, img);
        img.style.opacity = 0;
    };

    if (img.complete) {
        freeze();
    } else {
        img.addEventListener('load', freeze, true);
    }
}

function freezeAllGifs() {
    return new Array().slice.apply(document.images).map(freezeGif);
}

freezeAllGifs();

这有点麻烦,但是您可以尝试将 gif 加载到 iframe 中,并window.stop()在图像加载后从 iframe 内部(在其自身上)调用这可以防止页面的其余部分停止。

你介意给我一个代码示例。我无法使用你的方法 + 查看更新
2021-03-12 22:33:48
这会减慢页面渲染速度吗?
2021-03-19 22:33:48
我不这么认为,不。试试看!
2021-03-23 22:33:48
从 iframe 内部调用 window.stop() 也会停止执行原始窗口,或者您将如何执行此操作?
2021-04-02 22:33:48