我試圖淡入淡出我的照片庫切換圖像。所有這些都是在JavaScript中完成的,它只是改變圖像元素的不透明CSS值。這在一些電腦上真的很慢(例如我的筆記本電腦不是非常強大,但它是全新的(華碩Eeepc))。CSS不透明度表現。圖像褪色
我想知道是否有無論如何我可以解決這個性能問題。我已經看到了Canvas動畫和HTML5應用於圖像的演示,並且它們在我的筆記本電腦上非常流暢。我想知道我是否可以將相同的東西應用於我的圖像淡化功能。
任何想法?我將如何做到這一點?
我試圖淡入淡出我的照片庫切換圖像。所有這些都是在JavaScript中完成的,它只是改變圖像元素的不透明CSS值。這在一些電腦上真的很慢(例如我的筆記本電腦不是非常強大,但它是全新的(華碩Eeepc))。CSS不透明度表現。圖像褪色
我想知道是否有無論如何我可以解決這個性能問題。我已經看到了Canvas動畫和HTML5應用於圖像的演示,並且它們在我的筆記本電腦上非常流暢。我想知道我是否可以將相同的東西應用於我的圖像淡化功能。
任何想法?我將如何做到這一點?
我趕緊扔在一起的圖像逐漸消失使用canvas
標籤的例子的要求:http://jsfiddle.net/6wmrd/12/
我不確定(在Chrome和Firefox只測試),如果有任何性能增益,雖然,但這裏至少是如何完成的一個非常簡單的例子。還應該注意的是,這是在5分鐘內完成的,因此可以改進和優化代碼。否則,從我的經驗來看,如果你在圖像背後有一個堅實的背景,我發現它有時更平滑地在圖像上淡化與背景相同顏色的元素。
其他可以提高性能的方法可能是降低FPS。如果我沒有弄錯MooTools有50個FPS作爲標準。然而,減少FPS可能會影響感知性能。
Luca使其更快的一種方法是使用硬件加速和webkit轉換。問題在於不同的瀏覽器對此有不同程度的支持。見
http://mir.aculo.us/2010/06/04/making-an-ipad-html5-app-making-it-really-fast/
在沒有到遙遠的未來希望支持硬件加速的瀏覽器會更好。
看看這個site的首頁這是5張圖片,在旋轉,純css2,html4,javascript中淡入和淡出,並且是跨瀏覽器(據我所知)。 JavaScript有點陳腐 - 前段時間寫過:)但它似乎足夠流暢。看看它是如何在你的機器上。如果它滯後,你可以嘗試一個較慢的更新,比如說150或200ms,而不是100.
性能主要與JavaScript代碼效率有關。你使用任何框架(jQuery,Mootools)?
順便說一下,新的CSS3 transition
將適合這些情況。
在撰寫本文時,它支持Gecko 2(Firefox 4),webkit(Safari和Chrome)和Opera。
因爲CSS轉換規範仍然處於草案階段,與之相關聯的所有屬性必須有自己特定的供應商名稱:
#example {
opacity: 0;
-o-transition: opacity .3s linear;
-moz-transition: opacity .3s linear;
-webkit-transition: opacity .3s linear;
transition: opacity .3s linear;
}
#example:hover {
opacity: 1;
}
什麼不支持的瀏覽器?一個漂亮的解決方案可以瞄準他們(實質上是Firefox < 4和IE),併爲他們發送一些專用的Javascript代碼。對於小休息,總是有優雅的退化原則。
這裏是代碼,對於所有瀏覽器的工作原理: 添加到頭:
/* ****************************
* updated for all browsers by
* Evan Neumann of Orbiting Eden on
* October 6, 2011.
* www.orbitingeden.com - [email protected]
* original version only worked for IE
*****************************/
<!-- Begin
/* *****************************
* * editable by user
* ***************************/
var slideShowSpeed = 5000; // Set slideShowSpeed (milliseconds) shared by IE and other borwsers
var crossFadeDuration = 5; // Duration of crossfade (1/10 second) shared by IE and other borwsers
var crossFadeIncrement = .05; //crossfade step amount (1 is opaque) for non-IE browsers
// Specify the image files
var Pic = new Array(); // do not change this line
// to add more images, just continue the pattern, adding to the array below
Pic[0] = 'images/dare2wear-427ED-e.jpg';
Pic[1] = 'images/PBW_3238EDSM-e.jpg';
Pic[2] = 'images/dare2wear-441_2ED-e.jpg';
/* ********************************
* do not change anything below this line
**********************************/
var f = 0; //index of the foreground picture
var b = 1; //index of the background picture
var p = Pic.length; //number of pictures loaded and in queue - this may increase as time goes on depending on number and size of pictures and network speed
//load the picture url's into an image object array
//used to control download of images and for IE shortcut
var preLoad = new Array();
for (i = 0; i < p; i++) {
preLoad[i] = new Image();
preLoad[i].src = Pic[i];
}
function runSlideShow() {//this is trigerred by <body onload="runSlideShow()" >
//if IE, use alternate method
if (document.all) {
document.images.SlideShow.style.filter="blendTrans(duration=2)";
document.images.SlideShow.style.filter="blendTrans(duration=crossFadeDuration)";
document.images.SlideShow.filters.blendTrans.Apply();
}
//increment the foreground image source
document.images.SlideShow.src = preLoad[f].src;
//if IE, use the shortcut
if(document.all) {
document.images.SlideShow.filters.blendTrans.Play();
}
//all other browser use opacity cycling
else {
var imageContainer = document.getElementById('imageContainer');
var image = document.images.SlideShow;
//convert an integer to a textual number for stylesheets
imageContainer.style.background = "url('"+Pic[b]+"')";
//set opacity to fully opaque (not transparent)
image.style.opacity = 1;
//run fade out function to expose background image
fadeOut();
}
//increment picture index
f++;
//if you have reached the last picture, start agin at 0
if (f > (p - 1)) f = 0;
//set the background image index (b) to one advanced from foreground image
b = f+1;
//if b is greater than the number of pictures, reset to zero
if(b >= p) {b = 0;}
//recursively call this function again ad infinitum
setTimeout('runSlideShow()', slideShowSpeed);
}
function fadeOut(){
//convert to element
var el = document.images.SlideShow;
//decrement opacity by 1/20th or 5%
el.style.opacity = el.style.opacity - crossFadeIncrement;
//if we have gone below 5%, escape out to the next picture
if(el.style.opacity <= crossFadeIncrement) {
return;
}
//wait 50 milliseconds then continue on to decrement another 5%
setTimeout('fadeOut()', crossFadeDuration*10);
}
// End -->
,並添加兩個元素的身體。第一個是容器背景元素。我使用了div,但td,body和其他人也應該工作。第二個是前景圖像。最後,<body>
標籤內,添加的onload函數調用
<body onLoad="runSlideShow()">
<!-- this is the main image background -->
<div id="imageContainer">
<!-- this is the main image foreground -->
<img id="SlideShow" name='SlideShow' width="324" height="486">
</div>
驚訝它的laggy - 你如何快速變化的透明度?我實現了一個平滑過渡,每隔100毫秒進行一次非常類似的更新。 – 2011-01-21 16:54:26