2012-01-24 59 views
2

我已經創建了一個介紹動畫到我正在使用jQuery和Raphael,一個JavaScript庫的頁面。動畫以我喜歡的方式工作,但經常會令人不安。通常刷新會使其動畫比首次加載頁面時更平滑。我想知道這是否與加載時間有關或者它只是我的代碼的效率。有效編碼jQuery動畫

你可以看到頁面:http://developer.crawford.com以及下面的動畫代碼。

有沒有什麼辦法提高效率,當涉及到JavaScript動畫,或具體與我的代碼?我是否在做任何事情導致腳本效率非常低?有沒有什麼好的方法可以讓代碼在執行之前加載幾秒鐘,以使其運行更平滑,而不僅僅是setTimeout()?

function introAnimation() { 
// creating the canvas 
var paper = new Raphael(document.getElementById('mainCanvas'), '100%', '100%'); 

var canvasWidth = 500; 
var canvasHeight = 500; 
var offset = .6; 
// speed of circle getting bigger 
var speed1 = 1000; 
// speed of circles diverging 
var speed2 = 1200; 
var hide = Raphael.animation({'opacity': 0}); 

// ellipse variable instantiation 
var cRadius = 105; 
var diam = cRadius*2; 
// centerpoint 
var cX = canvasWidth/2; 
var cY = canvasHeight/2; 

var circ1 = paper.ellipse(cX, cY, 10, 10); 
circ1.attr({opacity: 1, stroke: '#777'}); 

var circRed = paper.ellipse(cX, cY, cRadius, cRadius).attr({opacity: 0, stroke: '#777'}); 
var circGreen = paper.ellipse(cX, cY, cRadius, cRadius).attr({opacity: 0, stroke: '#777'}); 
var circBlue = paper.ellipse(cX, cY, cRadius, cRadius).attr({opacity: 0, stroke: '#777'}); 

//red, green, blue watermarks, and logo 
var redWatermark = paper.image('images/circle_red.png', cX-50, cY-50, 100, 100).attr({opacity: 0}); 
var greenWatermark = paper.image('images/circle_green.png', cX-50, cY, 100, 100).attr({opacity: 0}); 
var blueWatermark = paper.image('images/circle_blue.png', cX-50, cY, 100, 100).attr({opacity: 0}); 

var logoWidth = 60; 
var logoHeight = 30; 
var logo = paper.image('images/CMS_logo_only.png', cX-(logoWidth/2), cY*1.04, logoWidth*.95, logoHeight*.95).attr({opacity: 0}); 

var letterOffset = cRadius*1.2; 
// circle centerpoints xR, yR: center of red; xG, yG: center of green; xB, yB: center of blue 
var xR = cX; var yR = cY-cRadius*offset; 
var xG = cX-cRadius*offset; var yG = cY+cRadius*offset; 
var xB = cX+cRadius*offset; var yB = cY+cRadius*offset; 

// insert CMS letter text 
var c = paper.text(xR-Math.cos(.8)*letterOffset, yR-Math.sin(.8)*letterOffset, "c.").attr({fill: '#737373', 'font-size': '25px', 'font-family': 'IMFELLDWPicaItalic', opacity: 0}); 
var m = paper.text(xG+Math.cos(5*Math.PI/4)*letterOffset, yG-Math.sin(5*Math.PI/4)*letterOffset, "m.").attr({fill: '#737373', 'font-size': '25px', 'font-family': 'IMFELLDWPicaItalic', opacity: 0}); 
var s = paper.text(xB+Math.cos(0)*letterOffset, yB-Math.sin(0)*letterOffset, "s.").attr({fill: '#737373', 'font-size': '25px', 'font-family': 'IMFELLDWPicaItalic', opacity: 0}); 

// white overlap 
// Three points of overlap: 
var pointTopX = cX; var pointTopY = cY-(cRadius*.2); 
var pointLeftX = cX-(cRadius*.365); var pointLeftY = cY+(cRadius*.33); 
var pointRightX = cX+(cRadius*.365); var pointRightY = cY+(cRadius*.33); 
var pathString = 'M'+pointTopX+' '+pointTopY+'A'+cRadius+' '+cRadius+' '+xG+' '+yG; 
var pathString = "M"+pointTopX+" "+pointTopY+',' 
        +"A"+cRadius+","+cRadius+",0,0,0,"+pointLeftX+","+pointLeftY+',' 
        +"A"+cRadius+","+cRadius+",0,0,0,"+pointRightX+","+pointRightY+',' 
        +"A"+cRadius+","+cRadius+",0,0,0,"+pointTopX+","+pointTopY; 
var overlapFill = paper.path(pathString).attr({'stroke-width': 0, fill: '#fff', opacity: 0}); 
var overlapPath = paper.path(pathString).attr({opacity: 0}); 

//resize circle 
circ1.animate({ 'rx': cRadius, 'ry': cRadius }, speed1, function() { 
    //hide it once it's done 
    circ1.animate({opacity: 0}, 0); 
    //show other circles 
    circRed.animate({opacity: 1}, 0); 
    circGreen.animate({opacity: 1}, 0); 
    circBlue.animate({opacity: 1}, 0); 
    //move other circles 
    circRed.animate({cy: cY-cRadius*offset, rx: cRadius, ry: cRadius}, speed2); 
    circGreen.animate({cx: cX-cRadius*offset, cy: cY+cRadius*offset, rx: cRadius, ry: cRadius}, speed2); 
    circBlue.animate({cx: cX+cRadius*offset, cy: cY+cRadius*offset, rx: cRadius, ry: cRadius}, speed2); 

    logo.animate({opacity: 1}, speed2); 

    //move to center 
    redWatermark.attr({width: diam, height: diam, x: imgX(cX, diam), y: imgY(cY, diam)}); 
    greenWatermark.attr({width: diam, height: diam, x: imgX(cX, diam), y: imgY(cY, diam)}); 
    blueWatermark.attr({width: diam, height: diam, x: imgX(cX, diam), y: imgY(cY, diam)}); 
    //animate out 
    redWatermark.animate({y: imgY(cY-cRadius*offset, diam), opacity: .35}, speed2); 
    greenWatermark.animate({x: imgX(cX-cRadius*offset, diam), y: imgY(cY+cRadius*offset, diam), opacity: .35}, speed2); 
    blueWatermark.animate({x: imgX(cX+cRadius*offset, diam), y: imgY(cY+cRadius*offset, diam), opacity: .35}, speed2, function() { 
     logo.toFront(); 
     c.animate({opacity: 1}, 1000); m.animate({opacity: 1}, 1000); s.animate({opacity: 1}, 1000); 
     overlapFill.animate({opacity: 1}, 1000); overlapPath.animate({opacity: .3}, 1000); 
     //nav slide in 
     nav(); 
    }); 
}); 

redWatermark.hover(function() { 
    $('#createSub').slideDown(300); 
}); 
redWatermark.mouseout(function() { 
    $('#createSub').slideUp(300); 
}); 
greenWatermark.hover(function() { 
    $('#storeSub').slideDown('fast'); 
}); 
greenWatermark.mouseout(function() { 
    $('#storeSub').slideUp('fast'); 
}); 
blueWatermark.hover(function() { 
    $('#manageSub').slideDown('fast'); 
}); 
blueWatermark.mouseout(function() { 
    $('#manageSub').slideUp('fast'); 
}); 

}

+0

使用flash!開玩笑。 – maxedison

回答

6

你PNG的是400 + K http://developer.crawford.com/images/circle_blue.png

你強迫用戶試圖在同一時間以動畫它下載了圖像數據的MEG。這對大多數遊客來說都不會很順利。我建議要麼壓縮/縮小圖像,要麼預加載它們。

+0

借調;使用較低分辨率圖像。也可以嘗試使用獨立圖形在其他圖像加載時顯示某些內容。 –

+0

很棒的建議。我認爲有時最明顯的是容易被忽視。我把它們分別降低到30Kb,沒有任何質量損失。這是一個很好的壓縮腳本,對於有此問題的任何人都不會導致質量損失: http://punypng.com/ –

0

它看起來跳動在我身上。在調用任何動畫之前,你有沒有考慮預先緩存圖像?

+0

這就是我所得到的。我的問題是我能做到這一點的方式是什麼? –

1

,結果替換重複計算:常出現

cY-cRadius*offset變化,因此提前計算。

+0

我確定這是因爲偏移在整個動畫中始終在變化。 – AlienWebguy

+0

好主意。實際上我已經有了偏移量,所以一切都按比例設置,所以我可以輕鬆編輯動畫的大小。在這個和其他建議之間,我能夠使它更平滑。 –

+0

漂亮的網站。雖然你的左邊菜單目前有點溜溜球效果。看看使用.stop() –