Elantris
接到一個活動頁面的製作需求,主體是一個幸運輪盤,有不少定位、動畫的目標要達成。
定位方面大致上都用百分比當單位就能處理,每個元件的相對大小、相對位置,動畫的部分不外乎 animation
以及 transition
,互動的部分就交給 js setTimeout
改變 class 即可。
整個輪盤的組成根據功能可以分為四個元件:
請設計師切圖的時候指定素材尺寸都要是正方形,圓心對準正中間,如此一來定位就能用相同尺寸直接疊起來,後續輪盤在轉動的時候才不會跑版。
要能反覆執行的動畫特效自然會用到 animation
以及 @keyframes
語法:
opacity
來達到開關燈的效果animation-delay
交替兩種燈飾的顯示animation-timing-function
決定漸變模式,如果用 linear
可以做到呼吸燈的效果、用 steps
則是瞬間切換這個就相對簡單很多,置中、動畫,用圖片或背景實作皆可。
盤面上的數字是由 API 取得,所以轉盤上的定位就顯得格外重要,仔細觀察這個轉盤分為 10 個區塊,指針的位置在正右方,所以我的策略是把第一個區塊定位之後再將其餘 9 塊用旋轉的方式轉到各自的區塊上就能完成盤面數字的定位。
因為要用 transform: rotate()
如果 transform-origin
直接在圖片的中心就能節省很多麻煩,所以 .sector-anchor
實際上是一個重心位於圓心的長方形。
借用 SASS 迴圈語法替每個區塊作旋轉。
最後是轉盤轉動的特效,我的做法是
.plate
上增加一個 class .spinning-${i}
,指定 transition
以及 transform
.spinning-${i}
替換為 .rotate-to-${i}
,此時不需要 transition
只需要 transform
.spinning-${i}
後轉盤會花 5 秒的時間從當下的狀態轉動到指定的角度,也就是 5 圈 + 36 * i
。.spinning-${i}
、獲得 .rotate-to-${i}
的瞬間因為沒有 transition
的關係,轉盤會直接跳到指定的角度,而視覺上 5 圈 + 36 * i
與 36 * i
都是相同的位置,就能銜接下一次轉動動畫。