小莫的成神之旅(二)純css3實現翻轉效果


小莫碎碎念

小莫見到很多網站的圖片翻轉效果很炫,忍不住手癢癢,遂摩拳擦掌打算研究一番,無奈17素材網上很多成型的插件都比較復雜,不適合小莫這樣的小白,所以找到一個簡單的栗子趕緊拿來和眾小白分享,大神請繞路,大神請繞路,大神請繞路,重要的事情說三遍!

雖然小莫研究了一番,但自我感覺還沒吃到css3的精髓,下面只是小莫一些淺顯的理解,如有紕漏,還望眾小白海涵,眾大神不吝賜教。

由於是直接從網上找的栗子,所以直接上干貨,省略實現思路這一模塊。

 

最終代碼

 1 <!doctype html>
 2 <html>
 3 <head>
 4     <meta charset="utf-8">
 5     <style>
 6         /* entire container, keeps perspective */
 7         .flip-container {
 8             border: 1px solid black; 
 9             -webkit-perspective: 600px; 
10             -moz-perspective: 600px;
11         }
12         /* flip the pane when hovered */
13         .flip-container:hover .flipper {
14             transform: rotateY(180deg);
15             -moz-transform:rotateY(180deg);     /* Firefox */
16         }
17 
18         .flip-container, .front, .back {
19             width: 320px;
20             height: 320px;
21         }
22 
23         /* flip speed goes here */
24         .flipper {
25             transition: 0.6s;
26             transform-style: preserve-3d;
27             -moz-transform-style: preserve-3d;
28             position: relative;
29         }
30 
31         /* hide back of pane during swap */
32         .front, .back {
33             line-height:320px;
34             color:#ffffff;
35             text-align: center;
36             font-size: 24px;
37 
38             backface-visibility:hidden;
39             -webkit-backface-visibility:hidden;    /* Chrome 和 Safari */
40             -moz-backface-visibility:hidden;     /* Firefox */
41             position: absolute;
42             top: 0;
43             left: 0;
44         }
45 
46         /* front pane, placed above back */
47         .front {
48             background-color: #4cae4c;
49         }
50 
51         /* back, initially hidden pane */
52         .back {
53             background-color: #5bc0de;
54             transform: rotateY(180deg);
55             -moz-transform:rotateY(180deg);     /* Firefox */
56         }
57     </style>
58 
59 </head>
60 <body>
61 <div class="flip-container">
62     <div class="flipper">
63         <div class="front">
64             front
65         </div>
66         <div class="back">
67             back
68         </div>
69     </div>
70 </div>
71 </body>
72 </html>

 

代碼分析

首先,先來科普幾個官方定義:

perspective 屬性定義 3D 元素距視圖的距離,以像素計。該屬性允許您改變 3D 元素查看 3D 元素的視圖。當為元素定義 perspective 屬性時,其子元素會獲得透視效果,而不是元素本身。通俗點說就是父元素添加這個屬性后,子元素可以呈現3D的效果。比方說像下面左圖介樣,如果不設置它,就會像右邊介樣:

transform 屬性向元素應用 2D 或 3D 轉換。該屬性允許我們對元素進行旋轉、縮放、移動或傾斜。也就是說我們的動畫效果主要是依靠它滴,這是一個神奇的屬性,只有你想不到的沒有它做不到的!(誇張手法,誇張手法,見諒見諒)

transition 屬性是一個簡寫屬性,用於設置四個過渡屬性。簡單來說這是翻轉動畫的執行者。

transform-style 屬性規定如何在 3D 空間中呈現被嵌套的元素。這個屬性可以有兩種值:flat,子元素將不保留其 3D 位置(也就是說,當transform-style為flat的時候,再對其子元素改變3D位置則不起作用);preserve-3d子元素將保留其 3D 位置。

backface-visibility 屬性定義當元素不面向屏幕時是否可見。


好,下面小莫課堂正式開課啦!

既然要實現翻轉效果,那首先要定義一個雙面div,默認顯示正面,鼠標hover顯示反面,鼠標離開則顯示正面,但在這之前我們需要一個裝雙面div的盒子,就像下面這樣:

 1 <div class="flip-container">
 2  
 3 </div>
 4 <style>
 5     .flip-container {
 6             border: 1px solid black; /*純屬為了方便查看效果而定義*/
 7             -webkit-perspective: 600px; /*加上這個屬性,盒子的子元素就能有3D效果了,不然只能是一個被壓扁的盒子*/
 8             -moz-perspective: 600px;
 9         }
10 </style>

盒子有了,下面就要定義雙面div了,就像一張撲克牌,雖然有兩面但它仍舊是一個整體,我們來定義一張撲克牌...呃,定義一個雙面div:

 1     <div class="flipper">
 2 
 3     </div>
 4     <style>
 5         .flip-container {
 6             width: 320px;
 7             height: 320px;
 8             line-height:320px;
 9             color:#ffffff;
10             text-align: center;
11             font-size: 24px;
12 
13             transition: 0.6s; /*雙面div翻轉效果的時間*/
14             transform-style: preserve-3d; /*雙面div的子元素可保持其3D位置*/
15             -moz-transform-style: preserve-3d;
16             position: relative;
17         }
18     </style>    

下面就是撲克牌的正反面,也就是雙面div正反面的內容:

 1     <div class="front">
 2          front
 3     </div>
 4     <div class="back">
 5          back
 6      </div>
 7      <style>
 8         .front, .back {
 9             line-height:320px;
10             color:#ffffff;
11             text-align: center;
12             font-size: 24px;
13 
14             backface-visibility:hidden; /*div背對屏幕時不可見*/
15             -webkit-backface-visibility:hidden;    /* Chrome 和 Safari */
16             -moz-backface-visibility:hidden;     /* Firefox */
17             position: absolute;
18             top: 0;
19             left: 0;
20         }
21 
22         .front {
23             background-color: #4cae4c;
24         }
25 
26         .back {
27             background-color: #5bc0de;
28             transform: rotateY(180deg); /*反面內容初始化為背對着屏幕的*/
29             -moz-transform:rotateY(180deg);     /* Firefox */
30         }
31      </style>

盒子、雙面div、正反面內容都有了,萬事俱備只欠“翻轉”這個東風啦:

1         .flip-container:hover .flipper {
2             transform: rotateY(180deg);
3             -moz-transform:rotateY(180deg);     /* Firefox */
4         }

當鼠標hover到盒子上則執行過度動畫,這里沒有把hover加到雙面div上是因為,雙面div在旋轉過程中元素的位置大小都會發生變化:

到此為止,翻轉功能就算是圓滿啦!

小莫在找栗子的時候還找到了另一個品相不太好的栗子,就是不給雙面div加翻轉動作,而將翻轉動作加到正反面div上,在只有正反面的時候這樣做顯然有些累贅,但如果是多面內容可能就不同,這種方法或許更靈活些,當然現在小莫的技能還沒點到那個級別,多面翻轉的功能留着日后實現吧!

 

總結

一入css3深似海,從此XX是路人!(這里XX泛指各種動畫插件,請自行腦補。)為什么總覺得沒有個總結就不算是寫完了呢?這是個不好的習慣,咳咳。(寫小說湊字數留下的惡習,見諒見諒)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM