第一次發博客,有點緊張。首先來一張效果圖。html
主要是實現了點擊右下角的風扇按鈕實現了:瀏覽器
導航欄的開啓與關閉,中間伴隨着 transition過渡以及transform的2D動畫。函數
上源碼:動畫
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width,initial-scale=1.0,user-scalable=no"> <title>扇形導航</title> </head> <style> *{ margin: 0; padding: 0; } html,body{ height: 100%; overflow: hidden; } #main{ overflow: auto; height: 100%; position: relative; } h1{ color: #1c86e5; text-align: center; } .navigation{ position: fixed; right:5px ; bottom: 5px; height: 40px; width: 40px; } .right-bottom{ height: 40px; width: 40px; position: absolute; border-radius: 50%; z-index: 1; transition: 1.5s; background-color: white; } img{ position: absolute; transition: 1s; } </style> <body> <div id="main"> <h1>扇形導航</h1> <div class="navigation"> <img src="img/衣服.png" width="40"> <img src="img/禮物.png" width="40"> <img src="img/設置.png" width="40"> <img src="img/返回.png" width="40"> <img class="right-bottom" src="img/風扇.png" width="40"> <!-- <div class="right-bottom">--> <!-- </div>--> </div> </div> <script> // 1.在元素首次渲染尚未完成的狀況下,是不會觸發過渡的 // 2.在絕大部分變換樣式切換時,若是變化函數的位置個數、類型不相同也可能不會觸發過渡 window.onload=function () { let imgArr=document.getElementsByTagName('img') let flag=true for (let i=0;i<imgArr.length;i++){ imgArr[i].onmousedown=function () { switch (i) { case 0:imgArr[i].style.transform='translate(0,-90px) rotate(360deg)scale(1.5)' imgArr[i].style.opacity=0.3; imgArr[i].style.transition='300ms';break; case 1:imgArr[i].style.transform='translate(-45px,-85px) rotate(360deg)scale(1.5)' imgArr[i].style.opacity=0.3; imgArr[i].style.transition='300ms';break; case 2:imgArr[i].style.transform='translate(-90px,-50px) rotate(360deg)scale(1.5)' imgArr[i].style.opacity=0.3; imgArr[i].style.transition='300ms';break; case 3:imgArr[i].style.transform='translate(-100px,0) rotate(360deg)scale(1.5)' imgArr[i].style.opacity=0.3; imgArr[i].style.transition='300ms';break; } } imgArr[i].onmouseup=function () { switch (i) { case 0:setTimeout(function () { imgArr[i].style.transform='translate(0,-90px) rotate(360deg)scale(1)' imgArr[i].style.opacity=1; },300);break; case 1:setTimeout(function () { imgArr[i].style.transform='translate(-45px,-85px) rotate(360deg)scale(1)' imgArr[i].style.opacity=1; },300);break; case 2:setTimeout(function () { imgArr[i].style.transform='translate(-90px,-50px) rotate(360deg)scale(1)' imgArr[i].style.opacity=1; },300);break; case 3:setTimeout(function () { imgArr[i].style.transform='translate(-100px,0) rotate(360deg)scale(1)' imgArr[i].style.opacity=1; },300);break; } setTimeout(function () { imgArr[i].style.transition='1s' },400) } } imgArr[4].onclick=()=>{ if (flag){ for (let i=0;i<imgArr.length-1;i++){ // debugger imgArr[i].style.transition='1s '+(i*0.12)+'s' } imgArr[4].style.transform='rotate(360deg)'; imgArr[0].style.transform='translate(0,-90px) rotate(360deg)' imgArr[1].style.transform='translate(-45px,-80px) rotate(360deg)' imgArr[2].style.transform='translate(-90px,-50px) rotate(360deg)' imgArr[3].style.transform='translate(-100px,0) rotate(360deg)' } else { for (let i=0;i<imgArr.length-1;i++){ imgArr[i].style.transition='1s '+((imgArr.length-i-1)*0.12)+'s' } imgArr[4].style.transform='rotate(0deg)'; imgArr[0].style.transform='translate(0,0) rotate(0deg)' imgArr[1].style.transform='translate(0,0) rotate(0deg)' imgArr[2].style.transform='translate(0,0) rotate(0deg)' imgArr[3].style.transform='translate(0,0) rotate(0deg)' } flag=!flag; } } </script> </body> </html>
主要的坑有:
1.在元素首次渲染尚未完成的狀況下,是不會觸發過渡的 2.在絕大部分變換樣式切換時,若是變化函數的位置個數類型不相同也可能不會觸發過渡 3.感受內存中變化的太快瀏覽器可能來不及渲染因此採用定時器,等待瀏覽器渲染總結: 實現方法有不少,我這邊只是一個特別笨拙的方式。 還能夠經過經過修改left,top的值來實現。這樣能夠利用三角函數,定義函數會優雅一些。 圖片來自阿里矢量圖標庫。