tailwind.config.js 設定客製化 animation keyframes 動畫
keyframes: {
wiggle: {
'10%': { transform: 'scale(1)' },
'20%': { transform: 'scale(0.9)' },
'80%': { transform: 'scale(0.9) translateY(15px)' },
},
wiggleCard: {
'0%': { transform: 'translate(-50%,5px)' },
'20%': { transform: 'translate(-50%,5px)' },
'80%': { transform: 'translate(-50%,15px)' },
},
},
除了 isShowTip 是一個 JS 變數去設定開關提示說明
使用 wiggle class 取模擬手勢往下按,深度離視線變遠,所以變小,然後往下移進行拖曳的感覺。
wiggleCard class 則是提示卡片配合動畫往下移動的動作。
<div
v-if="isShowTip"
class="absolute bottom-10 left-10 translate-x-1/2 translate-y-10"
>
<i-carbon-touch-1-filled class="animate-[wiggle_5s_infinite_forwards] text-4xl text-yellow-400" />
<div class="absolute w-60 -bottom-10 -left-20 -rotate-3 font-bold">
將線索拖曳到時間軌跡上!
</div>
</div>
<div
v-for="(clue, index) in clues"
v-show="clue.step === gameStatus.currentStep"
ref="clueCardEl"
:key="clue"
:data-test="clue.step === gameStatus.currentStep ? 'clue-card' : 'clue-card-hidden'"
class="cursor-grabbing absolute top-0 left-1/2 -translate-x-1/2 flex items-center w-[360px] px-2 py-3 border rounded-lg mx-auto bg-white shadow-bottom"
:class="isShowTip ? 'animate-[wiggleCard_5s_infinite_forwards]' : ''"
@mousedown.stop="handleClueCardMouseDown(index, $event)"
@mouseup.stop="handleClueCardMouseOff(index, $event)"
@touchstart.stop="handleClueCardTouch(index, $event)"
@touchend.stop="handleClueCardTouchOff(index, $event)"
@dragstart="() => false"
>
<img
class="w-[100px] h-[100px] mr-2 shrink-0 object-contain bg-white"
:src="clue.image"
alt=""
>
<p class="text-sm font-bold">
{{ clue.description }}
</p>
<div class="absolute right-2 bottom-2 font-Libre text-[#b1aea4] text-sm">
{{ clue.point }} 分
</div>
</div>
而其他的動畫我們會在「過場動畫實踐」 後面 JS 處理動畫的文章裡說明。
(預覽畫面)
CSS動畫通常用於較簡單、不需要用戶互動的動畫效果。這次的滑動提示動畫就是以 animation keyframe 完成 。
JavaScript動畫通常用於更複雜和需要與使用者互動。
JavaScript 動畫庫
CSS 動畫庫
由於我們採用 Vue.js 作為 JavaScript 框架,因此在動畫製作過程中,我們利用 Vue.js 提供的動態樣式綁定(style binding)來實現各種動畫流程所需的狀態切換。同時,我們也結合了 CSS 的 Transform 和 Transition 特性來進行動畫的「播放」。
另外 Vue.js 也提供 元素,可以用它來包裹想要添加過渡效果的元素。而此次專案並未使用到。