1. 程式人生 > >原生JS實現圖片翻轉旋轉效果

原生JS實現圖片翻轉旋轉效果

/* * 1.閃爍效果(瞬間將寬高都變為0,scale,並且是隨機的) * 2.圖片從小到大,同時透明度從1變成0(必須是當前圖片上一步效果走完了,才會開始) * 3.圖片旋轉,同時透明度從0變成1,有層次感(位移translate)(當所有圖片透明度都變為0的時候,才會開始) */ window.onload=function(){ var btn=document.getElementById('btn'); var imgs=document.querySelectorAll('img'); var
allEnd=0;//用來判斷所有的圖片是否都完成了所有的運動步驟 var on=true;//用來決定使用者是否可以再次點選 //給btn新增點選事件 btn.onclick=function(){ console.log("on:"+on); if(!on){ return; } on=false; var endNum=0;//運動完成的圖片數量 for(var i=0;i<imgs.length;i++){ //寫成自執行函式的原因:for迴圈速度很快,將會導致setTimeout中的i找不到值
(function(i){ setTimeout(function(){ montion(imgs[i],'10ms',function(){ this.style.transform='scale(0)';//因為函式用了call函式,所以可以用this,否則只能用imgs[i] },function(){ //第二步的運動從這裡開始
montion(this,'1s',function(){ this.style.transform="scale(1)"; this.style.opacity=0; },function(){ endNum++;//只要有一張圖片完成了第二步,則加1 if(endNum===imgs.length){ toBig(); } }) }); },Math.random()*1000); })(i); } //定時器,用來延遲時間,不讓圖片同步所放 }; //第三個運動效果 function toBig(){ /* *座標軸,x,y,z */ for(var i=0;i<imgs.length;i++){ imgs[i].style.transition=''; // imgs[i].style.opacity='1'; //想要一個物體有css3中的動作變化,那就需要給它一個初始值 imgs[i].style.transform='rotateY(0deg) translateZ(-'+Math.random()*500+'px)'; //自執行函式的目的是,為了找到i,否則for迴圈執行太快,會找不到i (function(i){ setTimeout(function(){ montion(imgs[i],'2s',function(){ this.style.opacity=1; this.style.transform='rotateY(-360deg) translateZ(0)' },function(){ allEnd++; if(allEnd===imgs.length){ console.log("allEnd:"+allEnd+',imgs.length:'+imgs.length); //這個條件成立,說明所有的圖片都運動完了,接下來才允許再次點選 //當所有運動完了以後,才允許再次點選 on=true; allEnd=0; } }); },Math.random()*1000); })(i); } } //運動函式(運動的物件,運動的時間,運動的屬性函式,運動完成後要做的事情) function montion(obj,time,doFn,callBack){ obj.style.transition=time; doFn.call(obj);//呼叫函式,並且把this的指向給obj var called=false;//這裡的原因是為了解決transitionend呼叫多次的bug obj.addEventListener('transitionend',function(){ if(!called){ callBack&&callBack.call(obj);//解決如果沒有傳入第四個callBack引數的問題 called=true; } },false);//事件三階段,第三個引數決定是在捕獲階段還是冒泡階段,呼叫此函式,false代表是在冒泡階段 } }