原生JS實現圖片翻轉旋轉效果
阿新 • • 發佈:2019-02-01
/*
* 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代表是在冒泡階段
}
}