主要利用CSS3-animation + JS实现效果,只是提供思路,具体细节可以参考
css3-animation属性,可实现动画效果,如下:
1 2 3
| .demo{ animation: 动画1,动画2; }
|
上面可以实现动画效果,但是不可控制,只能自动播放,于是乎看下面:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| const box = document.querySelector(".demo"); const animationList = ["longer", "divide", "fusion", "bigger"]; box.addEventListener("click", () => { box.classList.add(animationList[index]); }); let index = 0; box.addEventListener("animationend", (e) => { if ( e.animationName === "divide-right" || e.animationName === "fusion-right" ) { return; } index++; setTimeout(() => { if (index <= animationList.length - 1) { box.classList.add(animationList[index]); } else { index = 0; } }, 800); });
|
JS控制动画的三种方式:
**1.**直接覆盖 animation
1
| box.style.animation = `longer 800ms ease-in-out`;
|
如果动画效果较多,那就写的比较长了,建议封装CSS类,通过切换CSS类名实现动画效果
2.通过切换CSS类名,上面说过了,把不同动画封装在不同类里面,直接切换
1
| box.classList.toggle('longer');
|
3.animationPlayState属性
1 2
| box.style.animationPlayState="paused" // runing播放,paused暂停。
|
但是只支持单动画播放
动画结束如何让界面停留在结束时的状态呢?
1
| animation-fill-mode:forwards;
|
完整代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177
| <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <title>灵动岛</title> <style> * { margin: 0; padding: 0; } #iphone14pro { position: relative; margin: auto; width: 974px; height: 876px; overflow: hidden; background-image: url([img]https://www.qcodes.cn/wp-content/uploads/2022/09/2022091405393859.png[/img]); } .demo { width: 320px; margin-top: 72px; margin: 72px auto 0; background-color: red; height: 80px; border-radius: 40px; background-color: #272729; position: relative; } .demo::after { position: absolute; content: " "; right: 0; width: 80px; height: 100%; border-radius: 80px; background-color: #272729; } .longer { animation: longer 800ms ease-in-out forwards; } @keyframes longer { 0% { } 60% { width: 50vw; } 80% { transform: scaleX(1.04); } 100% { transform: scaleX(1); width: 50vw; } } .divide { animation: divide-left 800ms ease-in-out forwards; } @keyframes divide-left { 0% { } 40% { transform: scaleX(1.1); } 100% { transform: scaleX(1); } } .divide::after { animation: divide-right 800ms ease-in-out forwards; } @keyframes divide-right { 0% { } 40% { transform: scaleX(1.1); } 100% { transform: scaleX(1); right: -100px; } } .fusion { animation: fusion-left 800ms ease-in-out forwards; } @keyframes fusion-left { 0% { } 40% { transform: scaleX(1.1); } 100% { transform: scaleX(1); } } .fusion::after { animation: fusion-right 800ms ease-in-out forwards; } @keyframes fusion-right { 0% { right: -100px; } 40% { transform: scaleX(1.1); } 100% { transform: scaleX(1); right: 0; } } .bigger { animation: bigger 800ms ease-in-out forwards; } @keyframes bigger { 0% { } 60% { width: 81vw; height: 400px; border-radius: 100px; } 80% { transform: scaleX(1.04); } 100% { width: 81vw; height: 400px; border-radius: 100px; transform: scaleX(1); } } .bigger::after { display: none; } </style> </head> <body> <div id="iphone14pro"> <div class="demo"></div> </div> <script> const box = document.querySelector(".demo"); const animationList = ["longer", "divide", "fusion", "bigger"]; box.addEventListener("click", () => { box.classList.add(animationList[index]); }); let index = 0; box.addEventListener("animationend", (e) => { if ( e.animationName === "divide-right" || e.animationName === "fusion-right" ) { return; } index++; setTimeout(() => { if (index <= animationList.length - 1) { box.classList.add(animationList[index]); } else { index = 0; } }, 800); }); </script> </body> </html>
|