CSS動畫非常的有趣;這種技術的美就在於,通過使用很多簡單的屬性,你能建立出漂亮的消隱效果。其中代表性的一種就是CSS圖片翻轉效果,能讓你看到一張卡片的正反兩面上的內容。本文就是要用最簡單的方法向大家介紹如何建立這種效果。
網上有很多其它的教材,但裡面新增了很多多餘的程式碼樣式,需要讀者去分清哪些是必要的,那些是無用的;本文避免了這些問題,只列出了必要的CSS程式碼,你可以在其上新增自己喜歡的風格來美化這些卡片。
HTML程式碼
實現正反面效果的HTML程式碼,估計你也能想到應該是這樣的:
<div class="flip-container" ontouchstart="this.classList.toggle(`hover`);">
<div class="flipper">
<div class="front">
<!-- 前面內容 -->
</div>
<div class="back">
<!-- 背面內容 -->
</div>
</div>
</div>
正如你想到的,應該有兩個容器,分別存放卡片“前面”和“背面”,通過CSS,我們會指定這兩個容器元素自己的作用。還有需要注意的是ontouchstart
這段js,它能讓你使用觸屏來觸發翻轉動作。顯然,你應該把這段程式碼單獨提取出來,讓JavaScript程式碼放到一起。
CSS程式碼
/* entire container, keeps perspective */
.flip-container {
perspective: 1000;
}
/* flip the pane when hovered */
.flip-container:hover .flipper, .flip-container.hover .flipper {
transform: rotateY(180deg);
}
.flip-container, .front, .back {
width: 320px;
height: 480px;
}
/* flip speed goes here */
.flipper {
transition: 0.6s;
transform-style: preserve-3d;
position: relative;
}
/* hide back of pane during swap */
.front, .back {
backface-visibility: hidden;
position: absolute;
top: 0;
left: 0;
}
/* front pane, placed above back */
.front {
z-index: 2;
}
/* back, initially hidden pane */
.back {
transform: rotateY(180deg);
}
下面是大概的整個過程的原理:
- 在最外層的容器元素上設定整個動畫區域的透視(perspective)屬性。
- 當外層容器元素遇到滑鼠懸停事件時,內部存放卡片的容器旋轉180度。這裡也是控制旋轉速度的地方。如果將旋轉值設定為-180deg,是反向旋轉。
- 表示卡片正面和背面的元素都要絕對定位,這樣它們才能在相同的位置相互遮擋。它們的背面可視性(backface-visibility)屬性設定為隱藏,這樣每個卡片的背面在翻轉時都是看不見的。
- 將卡片的正面設定為一個比背面要高的z-index值,這樣保證卡片的正面在最上面。
- 將背面卡片旋轉180度,這樣讓它扮演背面的角色。
這就是全部這些程式碼的作用!你把這段程式碼放到你的網頁裡,然後修飾一下卡片的樣式就行了!
注:對卡片元素的某些屬性設定一些特定的值(例如)(like
overflow: hidden
)會導致其子元素喪失3D變換功能。我認可他的觀點,因為正是在本文的例子中我正好遇到了overflow: hidden
相關的麻煩,它導致了3D變換子元素全都出現在了同一個平面上,有幾個是被旋轉了180度。
觸發CSS翻轉
如果你喜歡用JavaScript來觸發翻轉動作,下面這個簡單的css樣式類就能幫你做到這樣:
.flip-container:hover .flipper, .flip-container.hover .flipper, .flip-container.flip .flipper {
transform: rotateY(180deg);
}
使用javascript
給容器元素新增這個css flip
類就能觸發卡片翻轉——不需要使用者懸停滑鼠在上面。用document.querySelector("#myCard").classList.toggle("flip")
實現它!
CSS豎向翻轉
執行豎向翻轉也很簡單,跟橫向翻轉一樣,只需要修改一下 transform-origin
的值,然後讓它按X軸旋轉。
.vertical.flip-container {
position: relative;
}
.vertical .back {
transform: rotateX(180deg);
}
.vertical.flip-container .flipper {
transform-origin: 100% 213.5px; /* 高的一半 */
}
.vertical.flip-container:hover .flipper {
transform: rotateX(-180deg);
}
注意這裡用的是rotateX
,而不是之前的rotateY
。
讓IE支援這種動畫技術
需要針對IE對這段標準的卡片翻轉程式碼進行特殊的修改,因為IE還沒有實現現代瀏覽器中的transform
功能。基本的做法就是對正面和背面兩個卡片同時分別翻轉:
/* entire container, keeps perspective */
.flip-container {
perspective: 1000;
transform-style: preserve-3d;
}
/* UPDATED! flip the pane when hovered */
.flip-container:hover .back {
transform: rotateY(0deg);
}
.flip-container:hover .front {
transform: rotateY(180deg);
}
.flip-container, .front, .back {
width: 320px;
height: 480px;
}
/* flip speed goes here */
.flipper {
transition: 0.6s;
transform-style: preserve-3d;
position: relative;
}
/* hide back of pane during swap */
.front, .back {
backface-visibility: hidden;
transition: 0.6s;
transform-style: preserve-3d;
position: absolute;
top: 0;
left: 0;
}
/* UPDATED! front pane, placed above back */
.front {
z-index: 2;
transform: rotateY(0deg);
}
/* back, initially hidden pane */
.back {
transform: rotateY(-180deg);
}
/*
Some vertical flip updates
*/
.vertical.flip-container {
position: relative;
}
.vertical .back {
transform: rotateX(180deg);
}
.vertical.flip-container:hover .back {
transform: rotateX(0deg);
}
.vertical.flip-container:hover .front {
transform: rotateX(180deg);
}
使用上面的這段程式碼,IE10裡也能正確的進行卡片翻轉了!
這個CSS卡片翻轉動畫技術一直是一個經典的案例,代表著CSS動畫能夠實現的效果,甚至3DCSS動畫能實現的強大效果。優點就是使用的程式碼很少很簡單。對於製作HTML5動畫來說這種效果非常的實用,可以說完美。