前言html
今天分享一下我昨晚作的CSS3動畫效果——卡通場景汽車動畫。在接觸CSS3動畫以前,我以前實現一些簡單的動畫效果都是使用flash完成的。可是自從CSS3橫空出世,在移動端對CSS3動畫的運用愈來愈多。今天這個分享是PC端的案例,由於我作的是大場景來的,原由仍是我無心間看到一張卡通圖片。因而我突發靈感,就趁熱打鐵使用CSS3動畫把它按照本身的想法實現了出來。接下來,就讓咱們一塊兒進入這個好玩的分享吧!git
預覽github
學習一個案例要有熱情,就應該先看一下案例的效果,因此,下圖爲我錄的gif圖片,你們先看一下:web
沒錯,上圖中每個細節都是使用CSS3製做的,有沒有感受像flash作的,哈哈!!!瀏覽器
我已經對全部主流瀏覽器都作了兼容,可是有時候動畫太快會有模糊現象,這個我暫定認爲是瀏覽器渲染問題。佈局
正題學習
OK,接下來我將仔細分析一下這個案例的每一部分效果,可是能夠看到其實場景有不少重複的小部分,好比窗戶,樹,山等。那麼我就將選取其中一個做爲這次講解的對象。另外,這個案例的工做量仍是偏多的,因此我不會每個步驟都講得很到位,主要仍是把個人思路講解一下,給你們本身思考吸收。文章最後我會把github地址告訴你們,方便使用這裏案例。接下來就趕忙進入主題吧!動畫
首先,確定是搭建html結構,這個的話須要根據本身對場景的剖析,作到本身內心有數,而後就會很天然地將html結構搭建出來。本案例html代碼以下:spa
<div class="container"> <!-- 山 --> <div class="mountain"> <div class="part_one"></div> <div class="part_two"></div> <div class="part_three"></div> <div class="part_four"></div> </div> <!-- 道路 --> <div class="load"></div> <!-- 石頭 --> <div class="stone"></div> <!-- 太陽 --> <div class="sun"> <div class="sunshine"></div> <div class="center_sun"></div> </div> <!-- 雲朵 --> <div class="cloud"></div> <!-- 房子 --> <div class="house"> <!-- 旗子部分 --> <div class="flag_whole"> <!-- 旗杆 --> <div class="pole"></div> <!-- 旗面 --> <div class="flag"> <span class="star"></span> <span class="littlestar star1"></span> <span class="littlestar star2"></span> <span class="littlestar star3"></span> <span class="littlestar star4"></span> </div> </div> <!-- 牆面 --> <div class="wall"></div> <!-- 房頂 --> <div class="roof"></div> <!-- 二樓 --> <div class="secondFloor"> <!-- 窗戶 --> <div class="window w1"> <!-- 窗戶賬篷 --> <div class="window_tent"></div> <!-- 窗體 --> <div class="window_body"></div> </div> <div class="window w2"> <!-- 窗戶賬篷 --> <div class="window_tent"></div> <!-- 窗體 --> <div class="window_body"></div> </div> <div class="window w3"> <!-- 窗戶賬篷 --> <div class="window_tent"></div> <!-- 窗體 --> <div class="window_body"></div> </div> <div class="window w4"> <!-- 窗戶賬篷 --> <div class="window_tent"></div> <!-- 窗體 --> <div class="window_body"></div> </div> </div> <div class="firstFloor"> <!-- 窗戶 --> <div class="window f-w1"> <!-- 窗戶賬篷 --> <div class="window_tent"></div> <!-- 窗體 --> <div class="window_body"></div> </div> <div class="window f-w2"> <!-- 窗戶賬篷 --> <div class="window_tent"></div> <!-- 窗體 --> <div class="window_body"></div> </div> <!-- 門 --> <div class="door"> <!-- 門梁 --> <div class="door_over"></div> <!-- 門主體 --> <div class="door_body"> <div class="leftDoor"></div> <div class="rightDoor"></div> </div> </div> <div class="window f-w3"> <!-- 窗戶賬篷 --> <div class="window_tent"></div> <!-- 窗體 --> <div class="window_body"></div> </div> </div> </div> <!-- 樹 --> <div class="trees"> <div class="leftTree"><span></span></div> <div class="leftTree l2"><span></span></div> <div class="rightTree"><span></span></div> <div class="rightTree r2"><span></span></div> </div> <!-- 第一輛汽車 --> <div class="car"> <div class="car_body"> <div class="car_top1"></div> <div class="car_top2"></div> <div class="car_win1"></div> <div class="car_win2"></div> <div class="car_bottom1"></div> <div class="car_bottom2"></div> </div> <div class="frontWheel"></div> <div class="endWheel"></div> <div class="exhaust"></div> </div> <!-- 第二輛車(淺綠色) --> <div class="car2"> <div class="car2_top"></div> <div class="car2_win"></div> <div class="car2_bottom"> <div class="car2_light1"></div> <div class="car2_light2"></div> <div class="car2_light3"></div> </div> <div class="car2_frontWheel"></div> <div class="car2_endWheel"></div> </div> </div>
是否是夠多的,我都預感博文篇幅會很長,你們要保持耐心哦!3d
仍是須要仔細看一下html結構,由於接下來就都是CSS3乾的活了:
這裏先對最外層的容器作一下樣式:
.container{ width: 800px; height: 450px; margin: 20px auto; position: relative; background: rgb(187,235,255); border:1px solid #ddd; box-shadow:1px 1px 1px 1px rgba(0,0,0,0.1); overflow: hidden; }
接下來分步講解:
第一部分:天空,陸地
這部分就太簡單了,最外層容器已經設置了天空的背景色,因此只須要將陸地的部分繪製出來就好了:
.load{ position: relative; top:290px; background: rgb(27,121,160); height: 160px; }
看一下效果:
第二部分:山脈,太陽,白雲
首先是山脈的繪製,從上面的動圖能夠看到,山脈都是一些不一樣夾角的三角形狀,那麼其實咱們製做的時候不必說非得畫出如出一轍的形狀出來,這裏我都是繪製矩形,而後經過旋轉來完成的,由於陸地在山脈上面,因此就遮掉了一部分,就能達到咱們看到的效果,最關鍵的一點是夾角的度數問題,能夠看到有銳角和鈍角,這個我使用了skew()方法對矩形進行傾斜,而後旋轉到合適的角度就達到我本身想要的效果了,第一塊山脈代碼以下:
.mountain .part_one{ width:300px; height: 300px; background: rgb(106,207,255); position: absolute; -webkit-transform:rotate(30deg) skew(-20deg) translate3d(120px,200px,0); -moz-transform:rotate(30deg) skew(-20deg) translate3d(120px,200px,0); -o-transform:rotate(30deg) skew(-20deg) translate3d(120px,200px,0); -ms-transform:rotate(30deg) skew(-20deg) translate3d(120px,200px,0); transform:rotate(30deg) skew(-20deg) translate3d(120px,200px,0); }
白雲的話,這個就簡單了,一個div加上兩個僞元素就搞定,很少說,代碼以下:
.cloud{ display: inline-block; width: 40px; height: 40px; border-radius: 50%; background: #fff; position: absolute; left:-60px; top:20px; } .cloud:before{ content: ''; display: inline-block; width: 40px; height: 16px; border-radius: 16px 0 0 16px; background: #fff; position: absolute; bottom:0; left:-12px; } .cloud:after{ content: ''; display: inline-block; width: 40px; height: 28px; border-radius: 0 28px 28px 0; background: #fff; position: absolute; bottom:0; right:-16px; }
太陽的製做主要仍是太陽的光圈,這裏我採用的是比較卡通的作法,顯得比較可愛,並且形象地體現出天氣陽光明媚。具體我使用了漸變背景,再加上一個陰影,而後實現動畫效果,看起來有活力一些,代碼以下:
.sun{ position: relative; } .sun .center_sun{ width:40px; height:40px; background: rgb(255,255,123); border-radius: 50%; position: absolute; top:-120px; right:160px; } .sun .sunshine{ width:60px; height:60px; background: #f67e28; /* Old browsers */ background: -moz-radial-gradient(center, ellipse cover, #f67e28 0%, #f67e28 50%, #f4bf9a 60%, #f4bf9a 100%); /* FF3.6+ */ background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%,#f67e28), color-stop(50%,#f67e28), color-stop(60%,#f4bf9a), color-stop(100%,#f4bf9a)); /* Chrome,Safari4+ */ background: -webkit-radial-gradient(center, ellipse cover, #f67e28 0%,#f67e28 50%,#f4bf9a 60%,#f4bf9a 100%); /* Chrome10+,Safari5.1+ */ background: -o-radial-gradient(center, ellipse cover, #f67e28 0%,#f67e28 50%,#f4bf9a 60%,#f4bf9a 100%); /* Opera 12+ */ background: -ms-radial-gradient(center, ellipse cover, #f67e28 0%,#f67e28 50%,#f4bf9a 60%,#f4bf9a 100%); /* IE10+ */ background: radial-gradient(ellipse at center, #f67e28 0%,#f67e28 50%,#f4bf9a 60%,#f4bf9a 100%); /* W3C */ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f67e28', endColorstr='#f4bf9a',GradientType=1 ); /* IE6-9 fallback on horizontal gradient */ position: absolute; top:-130px; right:150px; border-radius:50%; box-shadow: 0 0 2px 4px rgba(246,126,40,0.3); }
效果圖以下:
第三部分:房子和樹
房子這一部分基本就是佈局了,沒什麼難度,可是也有不少技巧,可以讓html結構更精簡。
房子我分紅房頂,旗子,牆,二樓,一樓:
1.牆:這是房子的基本,就是一個矩形,這裏不贅述。
2.房頂:這裏就是一個小正方形加上邊框,旋轉45度,也簡單,不贅述。
3.旗子:難點其實在於旗面的五角星,比較煩,因爲在場景中顯示比較小,因此五角星的繪製不須要精準到位,大概形狀像五角星就行,特別是旁邊四個小星星。
4.二樓:我這裏給二樓設置了高度,而後設置它的上下邊框以實現一二樓的遮出層,窗戶的話,要巧用兩個僞元素,特別是窗戶上面的遮篷部分,四個白色豎條就是使用兩個僞元素的左右邊框實現的。
5.一樓:一樓基本跟二樓差很少,門的繪製道理都相通,不贅述。
樹的話,跟白雲的繪製同樣簡單,不贅述。
效果圖以下:
因爲這一塊的代碼量有點多,我就不放上來了,直接到github下載吧。
第四部分:兩輛汽車和石頭
汽車自己的繪製關鍵也是使用了skew()方法,其餘都是佈局的問題,我就直接給代碼:
.stone{ width:30px; height: 16px; background: #333; border-radius: 16px 16px 5px 5px; position: absolute; top:410px; left:550px; box-shadow: 1px 1px 1px #333; } .car{ position: absolute; left:900px; top:340px; z-index:12; } .car .car_body{ position: absolute; } .car .car_top1,.car .car_top2{ width:45px; height: 35px; border-top-left-radius:10px; border-top-right-radius:10px; background: rgb(246,126,40); position: absolute; left:0; top:0; -webkit-transform:skew(24deg); -moz-transform:skew(24deg); -o-transform:skew(24deg); -ms-transform:skew(24deg); transform:skew(24deg); } .car .car_top1{ left:-29px; top:0px; -webkit-transform:skew(-24deg); -moz-transform:skew(-24deg); -o-transform:skew(-24deg); -ms-transform:skew(-24deg); transform:skew(-24deg); } .car .car_win1,.car .car_win2{ width:24px; height:24px; background: #fff; border-top-left-radius:10px; position: absolute; left:13px; top:6px; -webkit-transform:rotate(80deg) skew(-10deg); -moz-transform:rotate(80deg) skew(-10deg); -o-transform:rotate(80deg) skew(-10deg); -ms-transform:rotate(80deg) skew(-10deg); transform:rotate(80deg) skew(-10deg); } .car .car_win1{ left:-22px; -webkit-transform:rotate(0deg) skew(-10deg); -moz-transform:rotate(0deg) skew(-10deg); -o-transform:rotate(0deg) skew(-10deg); -ms-transform:rotate(0deg) skew(-10deg); transform:rotate(0deg) skew(-10deg); } .car .car_win1:after,.car .car_win2:after{ content:''; display:inline-block; width:10px; height: 24px; background: #fff; position: absolute; left:16px; top:0; -webkit-transform:skew(10deg); -moz-transform:skew(10deg); -o-transform:skew(10deg); -ms-transform:skew(10deg); transform:skew(10deg); } .car .car_win2:after{ top:9px; left:7px; -webkit-transform:rotate(-90deg) skew(-10deg); -moz-transform:rotate(-90deg) skew(-10deg); -o-transform:rotate(-90deg) skew(-10deg); -ms-transform:rotate(-90deg) skew(-10deg); transform:rotate(-90deg) skew(-10deg); } .car .car_bottom1,.car .car_bottom2{ width:74px; height:33px; background: rgb(246,126,40); border-top-left-radius: 24px 20px; border-bottom-left-radius: 3px; border-bottom:8px solid rgb(186,188,187); position: absolute; top:34px; left:-66px; -webkit-transform:skew(-4deg); -moz-transform:skew(-4deg); -o-transform:skew(-4deg); -ms-transform:skew(-4deg); transform:skew(-4deg); } .car .car_bottom2:before{ content: 'JR'; font-size:12px; font-weight: bolder; color:#fff; position: absolute; top:5px;left:45px; } .car .car_bottom1:after{ content: ''; display: inline-block; background: rgb(247,244,111); width:10px; height: 16px; border-radius: 6px/8px; position: absolute; top:11px; left:6px; } .car .car_bottom2{ height: 36px; border-top-left-radius: 0; border-top-right-radius: 13px 17px; border-bottom-right-radius: 3px; left:0px; top:31px; -webkit-transform:skew(8deg); -moz-transform:skew(8deg); -o-transform:skew(8deg); -ms-transform:skew(8deg); transform:skew(8deg); } .car .frontWheel,.car .endWheel{ width:34px; height:34px; border-radius: 50%; background:#333; position: absolute; top:55px; left:-40px; } .car .endWheel{ left:20px; } .car .frontWheel:after,.car .endWheel:after{ content: ''; display: inline-block; width:14px; height: 14px; background: #fff; border-radius: 50%; position: absolute; top:50%; left:50%; margin-top: -7px; margin-left: -7px; } .car .exhaust{ width:18px; height:18px; background: rgba(0,0,0,0.3); border-radius: 8px 8px 8px 1px; position: absolute; left:80px; top:55px; opacity: 0; } .car2{ position: absolute; left:900px; top:250px; z-index:10; } .car2 .car2_top{ width:55px; height: 40px; border-top-left-radius:15px; border-top-right-radius:10px; background: rgb(117,191,135); position: absolute; left:-29px; top:0px; -webkit-transform:skew(-20deg); -moz-transform:skew(-20deg); -o-transform:skew(-20deg); -ms-transform:skew(-20deg); transform:skew(-20deg); } .car2_top:after{ content: ''; display: inline-block; width:12px; height: 40px; background: rgb(117,191,135); -webkit-transform:skew(20deg); -moz-transform:skew(20deg); -o-transform:skew(20deg); -ms-transform:skew(20deg); transform:skew(20deg); position: absolute; left:48px; } .car2 .car2_win{ width:42px; height:30px; background: #fff; border-top-left-radius:10px; position: absolute; top:5px; left:-22px; -webkit-transform:rotate(0deg) skew(-20deg); -moz-transform:rotate(0deg) skew(-20deg); -o-transform:rotate(0deg) skew(-20deg); -ms-transform:rotate(0deg) skew(-20deg); transform:rotate(0deg) skew(-20deg); } .car2_win:after{ content: ''; display: inline-block; width:12px; height: 30px; background: #fff; -webkit-transform:skew(20deg); -moz-transform:skew(20deg); -o-transform:skew(20deg); -ms-transform:skew(20deg); transform:skew(20deg); position: absolute; left:36px; } .car2 .car2_bottom{ width: 180px; height: 56px; background: rgb(117,191,135); border-top-left-radius: 50px; border-bottom-left-radius: 50px; position: absolute; top:39px; left:-60px; } .car2 .car2_bottom .car2_light1{ width:14px; height: 20px; background: rgb(229,230,88); border-radius: 20px/30px; position: absolute; left:-3px; top:18px; } .car2 .car2_bottom .car2_light2,.car2 .car2_bottom .car2_light3{ width:12px; height: 12px; background: rgb(229,230,88); border-radius: 50%; position: absolute; right:-8px; top:12px; } .car2 .car2_bottom .car2_light3{ top:36px; } .car2 .car2_frontWheel,.car2 .car2_endWheel{ width:40px; height:40px; background: #333; border-radius: 50%; position: absolute; top:75px; left:-30px; } .car2 .car2_endWheel{ left:60px; } .car2 .car2_frontWheel:after,.car2 .car2_endWheel:after{ content: ''; display: inline-block; width:20px; height: 20px; background: rgb(216,107,82); border-radius: 50%; position: absolute; top:50%; left:50%; margin-left: -10px; margin-top: -10px; }
主要仍是講解一下動畫效果實現的原理:
1.淺綠色貨車就沒什麼好說的了,直接改變left值,一直開過去就好了。
2.橙色汽車動畫步驟分析:首先汽車比較快地從遠處往餐廳方向開過來,不當心磕碰到路面上的石頭,因爲汽車速度有點快,慣性大,因此汽車後半身往上翹,同時汽車往前推行了一點點,當汽車掉下來的時候,因爲重力的緣由,車身會有緩動的效果,表現爲掉落時車身向下壓,而後回彈,此車司機撞懵了一下,而後重啓汽車,開始汽車前行有點故障,而後過一小會就恢復正常,最後就開走了。大體思路就是這樣,具體實現確定是慢慢琢磨的過程了,要讓動畫效果合乎常理而又不失趣味性,纔是真正考驗的地方。
以上全部步驟完成了的話,那麼久實現了最初預覽時的效果了。
若是想學習整個案例的話,能夠前往我提供的github地址下載:
https://github.com/JR93/cartoonAnimation
但願對你們學習CSS3有所幫助!
若需轉載,請註明出處,謝謝合做!