純CSS3畫出小黃人並實現動畫效果

發表於2015-07-29

前言

前兩天我剛釋出了一篇CSS3實現小黃人動畫的部落格,但是實現的CSS3動畫是基於我在站酷網找到的一張小黃人的jpg格式圖片,並自己用PS摳出需要實現動畫的部分,最後才完成的動畫效果。但是,其實我的初衷是想體驗一下用圖片做動畫的趕腳,但是找不到素材,才無奈用了最笨的方法來滿足自己的需求,本想勉強能看就行了。可是呢,還是抵不住自己內心的完美,於是乎,用了一個晚上用CSS3畫出了小黃人再實現類似的動畫效果。

正題

OK,大家看一下下面兩張圖有什麼不同:

當然,很多人會說,明顯大小不同,嘴巴,頭髮也是不一樣的。但是其實最大的不同是,用一個形象一點的例子就是:這是兩個孩子,第一個是從超市貨架上拿的,另外一個是我自己生的。怎麼生呢?——用CSS3!

那麼生下來得會動啊,不然就夭折了,所以,我就多拍了幾個,就變成這樣子了:

怎麼樣?雖然手腳動畫還是不怎麼神似,但人類聰明地大腦還是能看得出啥意思的吧!今天就讓我們一起學習如何生出一個小黃人來。

首先,還是直接把HTML結構放出來給大家打量打量:

好的,每一處我都標明瞭它的用途,大家可以稍微理解一下,在頭腦裡有一個大概的模型或者層次結構。

接下來就是猛料了。。。我將分步講解,一步一步實現:

首先對容器和整體做一些簡單的樣式設定:

其中.bodyH主要就是繪製小黃人的身體,身體的比例很重要,現在執行看一下效果:

OK,身體已經有了,現在趕緊給它穿個褲子吧!

其中.trousers_top就是矩形部分,那麼穿完褲子是什麼樣子的呢?

現在怎麼看都像一顆膠囊,不行,趕緊修飾修飾,給它一個吊帶,不然褲子會掉呢:

這一塊主要就是實現兩個吊帶,左右各一條,然後我使用:after偽元素來實現吊帶上的小黑點:

咦,開始有模有樣了,接下來我們一鼓作氣把褲袋和一下修飾的邊邊給實現了:

先看效果圖:

OK,兩個注意點說一下:

1.我把褲子放在身體裡面,然後給.bodyH新增overflow:hidden,這樣我們就不用去多慮溢位怎麼辦,而且很輕鬆就能實現褲子的效果;

2.可以看到褲子兩邊有兩條有弧度的曲線段,我是通過給矩形某一個角實現圓角效果,然後只設定與這個角相鄰的兩條邊的邊框樣式,然後旋轉一下角度就實現這個效果了,當然只能實現簡單一點的效果。

好的,我們繼續,接下來先實現以下眼睛部分吧:

眼睛部分還是挺好實現的,先畫眼鏡,然後黑眼珠,再畫白點,最後我才畫的眼鏡框,眼睛框我是用:after偽元素實現的。效果圖如下:

嘴巴是最困惑我的,但還是最後還是能實現:

首先也是通過矩形其中一個角實現圓角來模擬嘴巴形狀,再加以旋轉:

結果是這樣的,那麼想要達到我們預期的效果,就需要把上半部分給遮掉,所以我用:after偽元素來實現遮罩效果:

這個地方就需要慢慢調到合適的位置,模擬圖如下:

紅色部分就是遮罩了,也是一個矩形,設定了底邊框,實現和嘴巴下半部分形成閉合效果,現在我們就可以把顏色改成膚色就行了:

效果圖如下:

接下來實現雙手部分,這一部分不難,就是兩個圓角矩形,旋轉了角度,然後層級低於身體的層級就行,然後再通過:after偽元素實現胳膊關節處就搞定了。

效果圖如下:

再接下來就是雙腳的部分了,主要就是鞋面的設計,我是通過一個矩形,然後設定不同的圓角值,加上一點點的旋轉來模擬的,這一塊的話,怎麼做我都覺得不是很像,所以最後差不多我就妥協了。

效果圖如下:

本來是不想畫頭髮的,感覺怪難的,最後嘗試了一下,還是能出個樣子,那就新增上去吧。原理跟褲子左右兩邊的實現原理是一樣的,只是引數值不一樣罷了,大家參考程式碼琢磨一下:

補充腳底陰影部分:

最後就是最初的效果了:

這時大家可能會問:然後呢?不是還會動的嗎?

是的,這裡我就大概講一下實現的思路吧:

1.頭髮:頭髮我想實現的是被小風輕輕地吹起來,然後很快就塌下去,所以吹起和下塌分配的時間很關鍵;

2.眼睛:眼睛我設想的場景是小黃人在悠閒地走路,然後不時左右看一下兩邊的風景,所以眼睛轉動很悠哉,所以分配的時間可以稍微長一點點;

3.嘴巴:讓嘴巴動起來確實比較難,因為要動的話,遮罩也得實時跟著改變,而且不能露餡,所以最後實現的是當它往左邊看了一下之後賣了一下萌;

4.雙手和雙腳:這部分確實很難逼真,本來腳就不是正常的走路狀態,所以只能按卓別林老爺爺的走路方式模擬一下,而且左右腳動作是緊接實現而不是同步實現。雙手的話,我是簡單模擬人在走路時有擺手的自然慣性,而且是左腳配右手,右腳配左手。考慮到它的雙手是放在背後的,所以我的擺動幅度設定為非常小,有效果但不明顯。

OK,我就直接把動畫程式碼放上來吧:

篇幅比較大,程式碼看多了會亂,如果覺得自己懶得整理的話,可以直接到我的github上下載這個簡單又好玩的案例吧:https://github.com/JR93/littleHuang

相關文章