原生js實現扇形導航以及動畫的坑

第一次發博客,有點緊張。首先來一張效果圖。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的值來實現。這樣能夠利用三角函數,定義函數會優雅一些。  圖片來自阿里矢量圖標庫。
相關文章
相關標籤/搜索