Twitterから直接画像を参照するTwitterアプリケーションを開発しています。アニメーションGIFが再生されないようにするにはどうすればよいですか?
ページの最後で使用window.stop()
しても、Firefoxでは機能しません。
より良いJavaScriptハックはありますか?できれば、これはすべてのブラウザで機能するはずです
Twitterから直接画像を参照するTwitterアプリケーションを開発しています。アニメーションGIFが再生されないようにするにはどうすればよいですか?
ページの最後で使用window.stop()
しても、Firefoxでは機能しません。
より良いJavaScriptハックはありますか?できれば、これはすべてのブラウザで機能するはずです
@Karussellの答えに触発されて、私はGiffferを書きました。ここでそれをチェックしてくださいhttps://github.com/krasimir/gifffer
それはあなたのGifの上に自動的に停止/再生制御を追加します。
これはクロスブラウザソリューションではありませんが、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);
}
}
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内から(それ自体で)呼び出すことができます。これにより、ページの残りの部分が停止するのを防ぎます。