11年刚干这行的时候,看到这种什么百叶窗的动画,以为都是flash实现的,最近突然灵光一闪,想到了用js实现(虽然我不是做前端的,本人做.net)。代码虽然实现了,但是比较乱,先上个图:
代码主要就是一些数学的计算,然后结合html,css打造出类似flash的效果。
下面贴出主要的部分代码:
1 function all(books){ 2 for(var i=0;i<self.rows;i++) { 3 for (var j = 0; j < self.columns; j++) { 4 if(!books[i][j])return false; 5 } 6 } 7 return true; 8 } 9 function resetBooks(books){ 10 for(var i=0;i<self.rows;i++) { 11 for (var j = 0; j < self.columns; j++) { 12 books[i][j]=false; 13 } 14 } 15 return true; 16 } 17 var self=this,timer=null,_iindex= 0; 18 var initdir=[[[0,1],[1,0]],[[-1,0],[0,1]],[[0,-1],[-1,0]],[[0,-1],[1,0]],[[0,-1],[1,0],[0,1],[-1,0]]],dir=initdir[0]; 19 var weight=[1,1,1,1,6]; 20 var initpos=[[{x:0,y:-1}],[{x:self.columns-1,y:-1}],[{x:self.columns-1,y:self.rows}],[{x:0,y:self.rows}],[{x:self.columns/2,y:self.rows/2}]]; 21 timer=setInterval(function(){ 22 var n=[]; 23 for(var i=0;i<self.preDivs.length;i++){ 24 var _div=null,x= 0,y=0; 25 for(var j=0;j<dir.length;j++){ 26 x=self.preDivs[i].x+dir[j][0]; 27 y=self.preDivs[i].y+dir[j][1]; 28 if(x>=0&&y>=0&&x<self.columns&&y<self.rows&&!self.books[y][x]){ 29 self.books[y][x]=true; 30 _div=self.zzDivStatck[y][x]; 31 n.push({x:x,y:y}); 32 _div.style.backgroundImage = "url(" + self.zzImages[_iindex] + ")"; 33 _div.style.backgroundPositionX = (-x * self.zzDivW) + "px "; 34 _div.style.backgroundPositionY = (-y * self.zzDivH) + "px"; 35 } 36 } 37 38 } 39 40 self.preDivs=n; 41 if(all(self.books)){ 42 resetBooks(self.books); 43 var _r=util.randomWeight(weight); 44 self.preDivs = initpos[_r]; 45 dir=initdir[_r]; 46 _iindex++; 47 } 48 if(_iindex>=+self.zzImages.length){ 49 _iindex=0; 50 } 51 52 },100);