CSS3的 3D立方體旋轉(zhuǎn)動畫

今次就來個大家用3D屬性最愛炫技的場景朴爬,旋轉(zhuǎn)的立方體扣癣,有人聲稱這種動畫簡直代表了CSS3的癲瘋椭坚,不不,是巔峰搏色。做完之后只想吼一聲善茎,你說的沒差!由平面動效進階到立體動效真是……立方體六個面要做足足六種不同的設(shè)置频轿,所以那些玩八面體垂涯,十二面體,……等等的航邢,大寫的“服”字耕赘。其他人做的立方體3D動畫,看了幾個膳殷,差不多都是<div>實現(xiàn)的操骡,嗯哼,我用<SVG>來做一下吧,至于原因嘛册招,后面揭曉岔激,當(dāng)然,如果失敗的話是掰,此句請自動忽略虑鼎。

1. 先立起來

不可避免的,要先來個基礎(chǔ)圖形键痛。錯錯錯炫彩,是基礎(chǔ)物體,反正就是個需要立體的東西絮短,隨便怎么稱呼江兢。基本上有兩種方法可以實現(xiàn)丁频,先來一種直觀好理解的杉允。

看上面這張圖,我把立方體的六個面平鋪開限府,右上角的那個是后面夺颤。此時痢缎,假設(shè)立方體是在視線正前方胁勺,好了,面有了独旷,現(xiàn)在需要把它們折疊起來署穗,像折紙盒一樣,組成一個立方體嵌洼。先看一下dom結(jié)構(gòu)案疲。

<div class="stage">
<div class="content">
<svg   id="cubic1" xmlns="http://www.w3.org/2000/svg" >
<rect   height="200" width="200" />
</svg>
<svg   id="cubic2" xmlns="http://www.w3.org/2000/svg" >
<rect   height="200" width="200" />
</svg>
<svg   id="cubic3" xmlns="http://www.w3.org/2000/svg" >
<rect   height="200" width="200" />
</svg>
<svg   id="cubic4" xmlns="http://www.w3.org/2000/svg" >
<rect   height="200" width="200" />
</svg>
<svg   id="cubic5" xmlns="http://www.w3.org/2000/svg" >
<rect   height="200" width="200" />
</svg>
<svg   id="cubic6" xmlns="http://www.w3.org/2000/svg" >
<rect   height="200" width="200" />
</svg>
</div>
</div>

非常簡單,我定義了兩個容器麻养,一個是舞臺stage褐啡,一個是包裹立方體的content,content里是6個SVG鳖昌,每個SVG只有一個簡單的矩形rect备畦。我的目的是讓content在stage里進行3D動效變化。

CSS定義如下:

.stage {width: 800px; height: 600px; background:#e5fffb; perspective:1000px;}
.content{transform-style: preserve-3d}
#cubic1{fill:#f29a76}
#cubic2{fill:#61BFBE}
#cubic3{fill:#BADDD6}
#cubic4{fill:#FFB5BA}
#cubic5{fill:#866667}
#cubic6{fill:#E25D6E}
SVG {position: absolute;top:200px; left:300px;width:200px; height:300px}

6個SVG都是寬200许昨,高200懂盐,雖然里面的矩形<rect>也都是相同尺寸,卻沒有進行統(tǒng)一的定義糕档,是因為想嘗試后期給每個SVG定義不同的動畫屬性莉恼。容器的擺放關(guān)系如下圖:

目前,通過position屬性的設(shè)置,六個面是重疊在一起的俐银,因此尿背,在折疊之前,先把每個方塊挪到自己對應(yīng)的位置悉患。移動的CSS屬性就很簡單了残家。根據(jù)圖示,cubic1售躁,也就是正對著我們的面坞淮,不需要移動,其他增加transform: translate相應(yīng)的屬性設(shè)置陪捷,定義如下:

#cubic2{fill:#61BFBE;transform: translateZ(-200px)} /*后面遠離屏幕200px移動*/
#cubic3{fill:#BADDD6;transform: translateY(-200px)} /*上面垂直向上200px*/
#cubic4{fill:#FFB5BA;transform: translateX(200px)} /*右面水平向右200px*/
#cubic5{fill:#866667;transform: translateY(200px)} /*下面垂直向下200px*/
#cubic6{fill:#E25D6E;transform: translateX(-200px)} /*左面水平向左200px*/

移動之后的效果是下面這種(閑著也是閑著回窘,我把移動過程做了動效):


好了,現(xiàn)在各在其位市袖,下面要各司其職啡直,進行折疊了。


這里有一點要說明苍碟,就是移動過之后酒觅,關(guān)于坐標(biāo)系的變化,拿其中一個面cubic4為例來說微峰,當(dāng)發(fā)生水平向右移動200px后舷丹,此時坐標(biāo)系也會發(fā)生變化同樣的位移,因此在做折疊(旋轉(zhuǎn))90度的3D變形時蜓肆,旋轉(zhuǎn)的基軸雖然在原坐標(biāo)系是右邊的垂直軸颜凯,但對于移動后的坐標(biāo)系,變成了左邊的垂直軸仗扬,因此症概,對應(yīng)的變形原點的設(shè)置為transform-origin: center left。舉一反五早芭,其他的幾個就不一一細說了彼城,直接放上增加3D旋轉(zhuǎn)后的CSS3屬性(cubic2僅僅發(fā)生了Z軸方向的位移,沒有旋轉(zhuǎn)動畫退个,所以無需設(shè)置)募壕。

#cubic3{fill:#BADDD6;transform: translateY(-200px) rotateX(90deg) ;transform-origin: bottom center;}
#cubic4{fill:#FFB5BA;transform: translateX(200px) rotateY(90deg);transform-origin: center left;}
#cubic5{fill:#866667;transform: translateY(200px)  rotateX(-90deg);transform-origin:top center;}
#cubic6{fill:#E25D6E;transform: translateX(-200px) rotateY(-90deg);transform-origin: center right;}

完成之后,效果是下面這種:

(這特么是不是在逗我帜乞,就一個平面非說是個立方體……K颈А)別急,就知道你會這樣說黎烈,所以我用動效展示一下這個過程:

此處應(yīng)有動畫O澳匀谣!應(yīng)有動畫!资溃!應(yīng)有動畫N漪帷!(我忘記錄屏了溶锭,天雷滾滾)

這下信了吧宝恶?其實這貨就是個立方體,貨真價實趴捅,只不過我們沒有給最外層的容器(也就是3D變形的舞臺)設(shè)置透視點位置垫毙,默認是屏幕正前方,所以你只看到了一面拱绑。來來來综芥,我把透明度調(diào)整一下,再改改透視原點的位置猎拨,效果是下面這種膀藐。喲,立方體出來了红省。


上面說過额各,關(guān)于立方體的組成有兩個方法,我們第一種是用了先平移后折疊吧恃,那第二種就是先折疊后平移了虾啦。說到這里,可能會不解蚜枢,無所謂了管它呢缸逃,有甚區(qū)別针饥,我自己做的過程中感覺差別還蠻大厂抽,下面這種方法要求對空間的理解能力更強,但代碼卻優(yōu)化了很多丁眼,省去一干transform-origion的設(shè)置筷凤。在上面的組合立方體的過程中,我們把面向自己的那一面作為了二維的基面苞七,其他方形都是基于此進行了變換藐守,也就是說最后組成的立方體從三維角度來說,是向背離屏幕的Z軸進行延伸的(代表背面的cubic2進行了Z軸負向的位移)蹂风。
這次卢厂,我們假定組成后的立方體的中心就是坐標(biāo)系的原點,首先惠啄,我仍然是用絕對定位法把所有的組成面都固定到容器統(tǒng)一的位置曙聂,只進行位移的正面和背面不用管,先來進行3D方向的旋轉(zhuǎn)廓译。依舊用動畫表示吧促王。這里為了能看到效果,我把舞臺stage的透視原點定義為偏右下方perspective-origin:80% 80%褒繁。


動畫效果有了,只是由于透視點的方向問題,結(jié)果似乎少了兩個面越除,再把透視點改成偏左上perspective-origin:20% 20%看一下:


完成第一步的旋轉(zhuǎn),下面就是要進行全體位移了外盯,那么重點來了摘盆。
以左面cubic6為例,如下圖所示:


在進行3D旋轉(zhuǎn)變形后饱苟,坐標(biāo)系也相應(yīng)的做了旋轉(zhuǎn)變形骡澈,從視覺角度來看,做完選擇變形后的cubic6要進行向左移動100px的水平位移掷空,但由于坐標(biāo)系變形的緣故肋殴,對于其本身旋轉(zhuǎn)后的坐標(biāo)系而言,此時水平方向變成了Z軸坦弟,因此水平位移也就變成了translateZ护锤。 把第二種方法形成立方體的動畫看一下:

方法二之所以更優(yōu)化,是因為關(guān)于六個cubic的定義簡化如下:

#cubic1{fill:#f29a76;transform:translateZ(100px);}
#cubic2{fill:#61BFBE;transform:translateZ(-100px);}
#cubic3{fill:#BADDD6;transform:rotateX(90deg) translateZ(-100px)}
#cubic4{fill:#FFB5BA;transform:rotateY(-90deg) translateZ(100px)}
#cubic5{fill:#866667;transform:rotateX(-90deg)translateZ(-100px)}
#cubic6{fill:#E25D6E;transform: rotateY(90deg) translateZ(100px)}

2. 再轉(zhuǎn)起來

基礎(chǔ)部件已經(jīng)搭起來了酿傍,下面就讓這個立方體動起來烙懦。說立方體不好理解,但我們在做的時候把它放到了一個content<div>容器里赤炒,因此氯析,讓這個容器做一些變換就可以了。至于用哪種方法得到的立方體莺褒,此處隨意掩缓,我用了二。先來個最簡單的繞Y軸旋轉(zhuǎn)的遵岩,CSS部分如下:

@keyframes content{
to{transform: rotateY(360deg)translateZ(20px)}
}
.content{transform-style: preserve-3d; animation:content 2s linear both infinite; }

效果:

寫到這里暫時停一下你辣,剩下的放到另一篇吧,我要好好想一下關(guān)于3D能做哪些炸裂的效果尘执。等更新舍哄。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市誊锭,隨后出現(xiàn)的幾起案子表悬,更是在濱河造成了極大的恐慌,老刑警劉巖丧靡,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蟆沫,死亡現(xiàn)場離奇詭異叉讥,居然都是意外死亡,警方通過查閱死者的電腦和手機饥追,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門图仓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人但绕,你說我怎么就攤上這事救崔。” “怎么了捏顺?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵六孵,是天一觀的道長。 經(jīng)常有香客問我幅骄,道長劫窒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任拆座,我火速辦了婚禮主巍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘挪凑。我一直安慰自己孕索,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布躏碳。 她就那樣靜靜地躺著搞旭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪菇绵。 梳的紋絲不亂的頭發(fā)上肄渗,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天,我揣著相機與錄音咬最,去河邊找鬼翎嫡。 笑死,一個胖子當(dāng)著我的面吹牛丹诀,可吹牛的內(nèi)容都是我干的钝的。 我是一名探鬼主播翁垂,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼铆遭,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了沿猜?” 一聲冷哼從身側(cè)響起枚荣,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎啼肩,沒想到半個月后橄妆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體衙伶,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年害碾,在試婚紗的時候發(fā)現(xiàn)自己被綠了矢劲。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡慌随,死狀恐怖芬沉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情阁猜,我是刑警寧澤丸逸,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站剃袍,受9級特大地震影響黄刚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜民效,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一憔维、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧畏邢,春花似錦埋同、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至逆甜,卻和暖如春虱肄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背交煞。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工咏窿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人素征。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓集嵌,卻偏偏與公主長得像,于是被迫代替她去往敵國和親御毅。 傳聞我的和親對象是個殘疾皇子根欧,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 把立方體的盒子搭出來之后,因為怕文章又臭又長(嗯端蛆,就是沒有想好玩什么效果凤粗,偏不告訴你)關(guān)于動效沒有做更多的處理,只...
    泱泱悲秋閱讀 1,952評論 1 8
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,517評論 25 707
  • 1今豆、屬性選擇器:id選擇器 # 通過id 來選擇類名選擇器 . 通過類名來選擇屬性選擇器 ...
    Yuann閱讀 1,619評論 0 7
  • 以前覺得23歲就是最好的年齡了嫌拣。青春柔袁,張揚,可以肆意揮灑自己的精力异逐。熬一個通宵后睡一覺立馬精神煥發(fā)捶索。尤其生了哥哥以...
    景一夫閱讀 370評論 0 0
  • 一 寶貝最近幾天情组,張開眼睛,看到什么箩祥,都要指著問:“這是啥院崇?”“這是啥?”告訴她了還是接著問“這是啥袍祖?”底瓣,全家人都...
    棒棒糖讀寫筆記閱讀 746評論 3 3