2016-07-27 104 views
4

我想要做一个从网页中加载的多个GIF组装成的动画。同时加载图像

所以,我会把gif放在另一个之上来做到这一点。 为了实现这个功能,gif需要在同一时间加载。 我如何在网络编程中做到这一点?

+0

我创造了这个小提琴:https://jsfiddle.net/baz3ynt1/5/它使用javascript来加载gif(你不能强制它们同时加载),然后创建空的'img' DOM元素并设置它们的'src'属性在同一时间...我试过它在Firefox和它的作品,但它不在IE 11中,我不知道为什么。目前无法在Chrome中尝试。 –

回答

2

我的小提琴https://jsfiddle.net/baz3ynt1/9/是使用JavaScript做图像加载一个答案异步,但是同时将它们添加到DOM以同步启动它们的动画。我不认为你可以强制浏览器在特定时间完成加载图像,因为浏览器不知道加载资源需要多长时间。

每个的Gif被使用

gif = new Image(); 
gif.src = 'image url'; 
gif.onload = handleLoading(); 

handleLoading()功能加载了触发startAnimation()功能的所有照片与图像触发其onload事件:

function handleLoading() 
{ 
    // numLoadedGifs is a counter previously initialized as zero 
    // gifUrls is an array of the urls to load 
    numLoadedGifs++; 
    if (numLoadedGifs === gifUrls.length) 
    { 
     // now all images are completely loaded 
     startAnimation(); 
    } 
}; 

然后startAnimation()函数将先前创建的img元素(存储在一个数组中)作为子元素放到<div id="animation">上,但为了让它们同时运行,它们的src属性被重新设置,并重新设置:

function startAnimation() 
{ 
    var animationDiv = document.getElementById('animation'); 
    for (var index in gifList) 
    { 
     var img = animationDiv.appendChild(gifList[index]); 
     img.classList.add('cloth'); 
     img.src = ''; 
     img.src = gifUrls[index]; 
    } 
}; 

我在Firefox和IE 11测试它(重置src是什么使得它在IE 11的工作)。


编辑:显然IE并不总是不够快,追加图像,然后重置其src的一步到位,所以https://jsfiddle.net/baz3ynt1/10/拆分两个任务:

function startAnimation() 
{ 
    var animationDiv = document.getElementById('animation'); 
    for (var index in gifList) 
    { 
     var img = animationDiv.appendChild(gifList[index]); 
     img.classList.add('cloth'); 
    } 
    for (var index in gifUrls) 
    { 
     gifList[index].src = ''; 
     gifList[index].src = gifUrls[index]; 
    } 
}; 
2

的GIF将需要在精确的同时

有一个叫拼合CSS技术加载。

相反装载4周100×100像素的GIF(或PNG),加载一个200x200像素的GIF,然后在一系列的100×100像素的div,你重新定位background-image,以便它显示只把部分的所需的200×200像素的图片显示:

.box { 
 
float: left; 
 
width: 100px; 
 
height: 100px; 
 
margin: 6px 12px 6px 0; 
 
background-image: url(http://placehold.it/200x200); 
 
} 
 

 
.top-left { 
 
background-position: 0 0; 
 
} 
 

 
.top-right { 
 
background-position: -100px 0; 
 
} 
 

 
.bottom-left { 
 
background-position: 0 -100px; 
 
} 
 

 
.bottom-right { 
 
background-position: -100px -100px; 
 
} 
 

 
.original { 
 
clear: left; 
 
width: 200px; 
 
height: 200px; 
 
}
<div class="box top-left"></div> 
 
<div class="box top-right"></div> 
 
<div class="box bottom-left"></div> 
 
<div class="box bottom-right"></div> 
 
<div class="box original"></div>

+0

这是一个很好的技术,它可以用于我的任务,但我设计了迄今为止不会使用这种技术的图像。我有一个人的设计,用户可以为这个人选择他想要的任何衣服。我可以选择上传用户选择的衣服并将其作为服务器上的图像,或者预先加载网页中每个布料的每个图像并将其放在人的上面。我选择了第二种方法,我正在寻找另一种技术。我不认为你提供的将会这样做。 –

+0

另一种方法是使用javascript检测何时加载了所有图像并仅在该时刻开始动画。 – Rounin