# CSS 動畫效果 @keyframes animation ###### tags: `CSS` [TOC] --- ## :star:關鍵影格動畫效果 @keyframes & animation * @keyframes 需搭配 animation 服用 * 不可單獨使用數字,一定要加入 % * 如果同樣的百分比,則相同屬性會後蓋前 ==語法格式↓== :::info /* 動畫設定 */ @keyframes 自訂名稱 { from { background-color: yellow;} to { background-color: red;} } /* 動畫關鍵影格的漸層設定 */ @keyframes 自訂名稱 { 0% { top: 0px;} 25% { top: 150px;} 50% { top: 300px;} 75% {top: 150px;} 100% {top: 0px;} } ::: :::warning :fire: 滑鼠移入後停止 animation-play-state:paused; ::: #### ==動畫名稱 animation-name:== * 設定動畫名稱,預設值是「none」 * 名稱可以加引號、亦可不加引號 ex:@keyframes oxxo { ... } @keyframes "oxxo" { ... } * 如果同名,以後面的名稱為主 * 名稱大小寫有區別 * 特殊字元不能使用,但是用引號框起來就可以 #### ==動畫持續時間 animation-duration:== * 動畫單次播放的時間,預設 0 ,單位為 s 或 ms * 和 animation-name都是屬於一定要有的屬性 #### ==動畫加速度函式(屬性) animation-timing-function:== * 動畫轉換速度,預設為「ease」  * 較少用的語法: * step-start (看不到第一格) * step-end (看不到最後一格)  * steps(int,start|end) 以上2種的進化型語法 * cubic-bezier(n,n,n,n) 以上語法可參考:https://www.oxxostudio.tw/articles/201803/css-animation.html #### ==動畫延遲時間 animation-delay:== * 動畫要延後多久才開始播放,預設 0 ,單位為 s 或 ms * 如果設定為「負值」,例如 -1s、-2s,得到的結果「**不會延遲,而是快轉**」 ex:一段動畫要 5 秒,animation-delay 設定為 -2s,那麼動畫將會直接從第二秒的位置開始播放,播放三秒後停止 ( 類似 5-2=3 的概念 )。 #### ==動畫播放次數 animation-iteration-count:== * 需設定大於0的數字,預設1,設定「**infinite**」表示無限重複播放 #### ==動畫播放方向 animation-direction:==  * **normal**:正常播放,從 0% 到 100% (預設值) * **reverse**:反轉播放,從 100% 到 0% * **alternate**:正反轉輪流播放 奇數次為 0% 到 100%,偶數次為 100% 到 0% 若動畫播放次數只有一次就只會正常播放 * **alternate-reverse**:alternate的相反,奇數次為 100% 到 0%,偶數次為 0% 到 100%,若動畫播放次數只有一次就只會反轉播放。 #### ==動畫播放狀態 animation-play-state:== * **running**,預設值,表示動畫播放中 * **paused**,表示暫停 #### ==動畫播放前後模式(屬性) animation-fill-mode:== * **none**:預設值,不論動畫播放次數,結束後一律返回原始狀態。 * **forwards**:動畫結束後,保持在最後一個影格狀態。 * **backwards**:動畫結束後,保持在第一個影格狀態 ( 但實際測試和 none 效果一樣 )。 * **both**:依據動畫的次數或播放方向,保持在第一個影格或最後一個影格狀態,相當實用。 ### 總表整理如下:  :::danger 這八種屬性,亦可透過 **animation** 的屬性,做簡短的縮寫,用法如下: animation:name duration | timing-function | delay | iteration-count | direction | fill-mode | play-state; 縮寫除了在代碼上簡短許多,更可以讓「同一個元素套用多組動畫」,用法只需要在後方用逗點分隔即可 ::: --- ## Animation Events * animationstart:當動畫開始。 * animationend:當動畫結束。 * animationiteration:當動畫重複。 * animationcancel:當動畫中止 ( 目前還不支援 )。 練習:變色圓圈圈 ```htmlmixed= <title>animation動畫效果-變色圓圈圈</title> <style> @keyframes myanimation{ from { background-color: #55555; } to { background-color: #428bca; } } .box { width: 150px; height: 150px; background-color: lightgreen; border-radius: 50%; border: 1px dotted black; text-align: center; line-height: 150px; position: absolute; animation-name: myanimation; animation-duration: 2s; animation-timing-function: ease; animation-delay: 1s; } </style> </head> <body> <div class="box">light</div> </body> ``` 顯示如下:  --- 練習:抓方塊 ```htmlmixed= <title>animation動畫效果-抓方塊</title> <style> /*抓方塊*/ @keyframes ssanimation{ from { left: 10px; } to { left: 300px; } } .box2 { width: 100px; height: 100px; background-color: #428bca; border: 1px dotted black; text-align: center; line-height: 100px; position: absolute; animation-name: ssanimation; animation-duration: 1s; animation-timing-function: ease-in-out; animation-direction: alternate; animation-iteration-count: infinite; } .box2:hover { animation-play-state: paused; } </style> </head> <body> <!-- 抓方塊 --> <div class="box2">box2</div> </body> ``` 顯示如下:  --- 練習:來回繞圈的方形 ```htmlmixed= <title>animation動畫效果-來回繞圈的方形</title> <style> /*方形繞圈圈*/ @keyframes squarecircle { 0% { background-color: #23C89C; left:10px; top:10px;} 25% { background-color: #F1CF3A; left:310px; top:10px;} 50% { background-color: #4DB3CE; left: 310px; top:210px;} 75% { background-color: #F9B885; left: 10px; top:210px;} 100% { background-color: #F76C91; left:10px; top:10px;} } .box3 { width: 100px; height: 100px; background-color: #BBE1F5; border: 10px dotted ##FCF8A7; text-align: center; line-height: 100px; position: absolute; animation: squarecircle 4s ease-in-out alternate infinite; } </style> </head> <body> <!-- 方形繞圈圈 --> <div class="box3">來回繞的方形</div> </body> ``` 顯示如下: 
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up