今年3月份,因爲公司業務須要,我轉崗到微信產品部,離開了TID團隊,人都是有感情的動物,更況且在一個團隊呆了快 3 年,心中十分捨不得,鬼哥說了「天下沒有不散的宴席...」,在個人世界裏又多了一次離別的傷感(雖然還在隔壁工做)。加入了微信產品中心後,開始新的團隊生活,工做比之前忙多了,有時週六也要上班,須要更快更高效的完成任務,除了重構頁面,須要主動參與邊緣外的工做,承擔更多。最近比較忙,給本身敲個響鐘:注意身體。css
說完題外話,開始近期的主題動畫設計。雖然css3動畫基礎知識學習過,但之前項目使用場景比較少,並無太多的實踐,加入新團隊以來,作得幾個項目與動畫有關,嘗試用css3來實現,過程當中遇到了很多坑。android
大學學過一個月畫畫,但沒有這方面天賦,連簡單卡通動畫也畫很差,因而在國外網站找來以下動畫,利用它來作例子,並把此次用 css3 實現動畫的原理分享給你們~ios
來自 dribbble 某位大師的做品,GIF圖中一個小女孩抱着一隻貓在跑步,很是可愛,動做輕巧,過渡天然。
css3
回到項目需求,要實現相似上圖卡通人物跑步動畫,分析結果以下:web
1.跑步動畫能夠應用在不一樣的場景canvas
要求人物的背景是透明的,圖片保證高清,避免邊緣雜邊瀏覽器
2.跑步動畫運動速度與動做成正比關係微信
人物跑步速度越快,身體動做越快;人物跑步速度爲零時,身體動做立刻中止在當前的狀態css3動畫
3.跑步動畫效果流暢學習
不會出現卡頓現象
用PS打開該大師的 GIF 圖,在時間軸窗口中有 24 張不一樣的圖片,經過一幀一幀的播放來實現跑步動畫,很簡單得說明作一個精細的動畫須要多費點心思和勞動力啊,向大師表示敬禮~
項目組要求的動畫跟上圖人物大小差很少,一開始跟交互和視覺的同事討論時,嘗試使用 gif 來實現動畫,使用7張圖片輪播,間隔 0.2 秒可知足的動畫效果,簡單實現以下:
分析下gif動畫
好處:實現簡單、可維護性高、工做成本低
缺點:只適合簡單的動畫效果,不能動態控制動畫
那麼項目的硬性要求(控制動畫的暫停、速度等)讓我放棄了對gif實現跑步的想法~
放棄了 gif,而 swf 也不是咱們的選擇,canvas 實現也是能夠的,這裏不作介紹,本次主題是 css3 動畫~
方式一:經過切換 7 張圖片來實現
@-webkit-keyframes charector-1{ 0% {background-image: url(charector_1.png);} 14.3% {background-image: url(charector_2.png);} 28.6% {background-image: url(charector_3.png);} 42.9% {background-image: url(charector_4.png);} 57.2% {background-image: url(charector_5.png);} 71.5% {background-image: url(charector_6.png);} 85.8% {background-image: url(charector_7.png);} 100% {background-image: url(charector_1.png);} }
方式二:7 張圖片合成 1 張,經過切換背景圖片位置來實現
@-webkit-keyframes charector-1{ 0% {background-position: 0 0;} 14.3% {background-position: -180px 0;} 28.6% {background-position: -360px 0;} 42.9% {background-position: -540px 0;} 57.2% {background-position: -720px 0;} 71.5% {background-position: -900px 0;} 85.8% {background-position: -1080px 0;} 100% {background-position: 0 0;} }
分析這2種方式
方式一:
實現起來會比較簡單,但帶來額外的 7 個請求數
7 張圖片總大小爲:50k
方式二:
須要設計雪碧圖,並量取背景位置,請求數少
雪碧圖大小爲:37k
能夠看出多張圖片合成的雪碧圖比 7 張圖片還少 13k 外,還能夠減小 7 個HTTP請求,那麼切換背景位置方式是比較好的,代碼以下:
HTML:
<div class="charector"></div>
CSS:
.charector{ position: absolute; width: 180px; height: 300px; background: url(../img/charector.png) 0 0 no-repeat; -webkit-animation-name: charector-1;/* 動畫名稱 */ -webkit-animation-iteration-count: infinite;/* 動畫無限播放 */ -webkit-animation-timing-function: step-start;/* 立刻跳到動畫每一結束楨的狀態 */ -webkit-animation-duration: 950ms;/* 動畫運行的時間 */ } @-webkit-keyframes charector-1{ 0% {background-position: 0 0;} 14.3% {background-position: -180px 0;} 28.6% {background-position: -360px 0;} 42.9% {background-position: -540px 0;} 57.2% {background-position: -720px 0;} 71.5% {background-position: -900px 0;} 85.8% {background-position: -1080px 0;} 100% {background-position: 0 0;} }
demo,這裏下載(請使用 webkit 內核的瀏覽器打開)
加快跑步速度:能夠經過快速切換背景圖片位置,animation-duration 能夠控制動畫運行的時間,那麼減小動畫的時間能夠提高跑步的速度,經過在父級動態加載不一樣的功能 class 來運行不一樣的動畫,從而改變跑步速度
詳細內容請看代碼,留意註釋
HTML:
<div class="charector-wrap " id="js_wrap"> <div class="charector"></div> </div> <a class="run-xfast" href="#none">最快</a> <a class="run-fast" href="#none">快</a> <a class="run-normal" href="#none">正常</a> <a class="run-slow" href="#none">慢</a> <button class="btn-paused">暫停</button>
CSS:
.charector{ position: absolute; width: 180px; height:300px; background: url(../img/charector.png) 0 0 no-repeat; -webkit-animation-iteration-count: infinite;/* 動畫無限播放 */ -webkit-animation-timing-function:step-start;/* 立刻跳到動畫每一結束楨的狀態 */ } /* 跑步動畫名稱 */ @-webkit-keyframes person-xfast{/* 超快 */ 0% {background-position: 0 0;} 14.3% {background-position: -180px 0;} 28.6% {background-position: -360px 0;} 42.9% {background-position: -540px 0;} 57.2% {background-position: -720px 0;} 71.5% {background-position: -900px 0;} 85.8% {background-position: -1080px 0;} 100% {background-position: 0 0;} } @-webkit-keyframes person-fast{/* 快 */ 0% {background-position: 0 0;} 14.3% {background-position: -180px 0;} 28.6% {background-position: -360px 0;} 42.9% {background-position: -540px 0;} 57.2% {background-position: -720px 0;} 71.5% {background-position: -900px 0;} 85.8% {background-position: -1080px 0;} 100% {background-position: 0 0;} } @-webkit-keyframes person-normal{/* 正常 */ 0% {background-position: 0 0;} 14.3% {background-position: -180px 0;} 28.6% {background-position: -360px 0;} 42.9% {background-position: -540px 0;} 57.2% {background-position: -720px 0;} 71.5% {background-position: -900px 0;} 85.8% {background-position: -1080px 0;} 100% {background-position: 0 0;} } @-webkit-keyframes person-slow{/* 慢 */ 0% {background-position: 0 0;} 14.3% {background-position: -180px 0;} 28.6% {background-position: -360px 0;} 42.9% {background-position: -540px 0;} 57.2% {background-position: -720px 0;} 71.5% {background-position: -900px 0;} 85.8% {background-position: -1080px 0;} 100% {background-position: 0 0;} } /* 跑步動做頻率控制 */ .xfast .charector{/* 超快 */ -webkit-animation-name: person-xfast; -webkit-animation-duration: 500ms; } .fast .charector{/* 快 */ -webkit-animation-name: person-fast; -webkit-animation-duration: 650ms; } .normal .charector{/* 正常 */ -webkit-animation-name: person-normal; -webkit-animation-duration: 800ms; } .slow .charector{/* 慢 */ -webkit-animation-name: person-slow; -webkit-animation-duration: 950ms; }
暫停跑步:使用 animation-play-state:paused 能夠暫停正在進行的動畫,並停留到當前的動做,那麼當用戶中止操做時,給父級加上功能 class 來中止動畫
CSS:
/* 暫停動畫 */ .paused .charector{ -webkit-animation-play-state:paused; }
最後再經過 js 控制不一樣的跑步速度。
jQuery:
$(document).ready(function(){ $("a").on("click",function(e){ $("#js_wrap").find(".charector-wrap").removeClass("paused"); $("#js_wrap").attr("class","charector-wrap " + $(e.target).attr("class").split("-")[1]) }) $(".btn-paused").click(function(){ $("#js_wrap").addClass("paused"); }) })
最後界面:
demo,這裏下載(請使用 webkit 內核的瀏覽器打開)
animation 適合相對簡單的動畫,使用起來比較靈活,如支持切換不一樣的動畫名、暫定動畫等
animation-timing-function 的 step-start 屬性等不徹底支持 android 2.1~4.3 、ios 4.3 系統
ok~ 跑步動畫到此結束~