摘要:所以給父元素添加至此,就實(shí)現(xiàn)了一個(gè)翻轉(zhuǎn)卡牌的效果,但是這里需要解決一個(gè)問(wèn)題,因?yàn)閷傩圆槐恢С种С?,所以需要進(jìn)行降級(jí),我的做法是直接顯示隱藏。
今天在工作中遇到需求,需要用CSS3寫(xiě)一個(gè)卡片翻轉(zhuǎn)效果,這個(gè)效果看起來(lái)簡(jiǎn)單,但是還是涉及到一些不常用的CSS3中的3D轉(zhuǎn)換的屬性以及實(shí)現(xiàn)該效果的思路,所以這里總結(jié)一下。
原文鏈接:http://mrzhang123.github.io/2016/08/17/FlipCards/
項(xiàng)目地址:https://github.com/MrZhang123/Practice/tree/master/FlipCards
需要的CSS3屬性 perspective目前瀏覽器都不支持perspective屬性
在chrome和Safari中需要使用-webkit-perspective,而在Firefox中需要使用-moz-perspective來(lái)定義。
定義和用法perspective屬性定義3D元素距視圖的距離,以像素計(jì)。該屬性允許改變查看3D元素的視圖。當(dāng)為元素定義
perspective屬時(shí),其子元素會(huì)獲得透視效果,而不是元素本身。換句話說(shuō),設(shè)置這個(gè)元素是為了給該元素的子元素用。
值number:元素距離視圖的距離,以像素計(jì)
none:默認(rèn)值,與0相同。不設(shè)置透視
transform-styleFirefox支持transfrom-style屬性。
Chrome、Safari和Opera支持代替的-webkit-transform-style屬性。
定義和用法transform-style屬性固定如何在3D空間中呈現(xiàn)被嵌套的元素。一般給父元素設(shè)置讓其所有子元素跟著父元素一起位置移動(dòng),一般會(huì)設(shè)置。
值flat:子元素將不保留其3D位置(默認(rèn)值)
perserve-3d:子元素將保留其3D位置
transitionIE10+、Firefox、Opera、Chrome均支持transition屬性。Safari支持替代的-webkit-transition屬性。但是IE9-不支持該屬性。
定義和用法transition屬性是一個(gè)簡(jiǎn)寫(xiě)屬性,用于設(shè)置四個(gè)過(guò)渡屬性:
transiton-property:規(guī)定設(shè)置過(guò)渡效果的CSS屬性的名稱
transiton-duration:規(guī)定完成過(guò)渡效果需要多少秒或毫秒
transiton-timing-funciton:規(guī)定速度效果的速度曲線
transition-delay:規(guī)定過(guò)渡效果何時(shí)開(kāi)始
transiton-duration必須設(shè)置,否則時(shí)長(zhǎng)為0 ,不會(huì)有過(guò)渡效果
backface-visibility只有IE10+和Firefox支持backface-visibility,Opera15+、Safari和Chrome支持替代的-webkit-backface-visibility
定義和用法backface-visibility屬性定義當(dāng)前元素不面向屏幕時(shí)是否可見(jiàn),如果元素在旋轉(zhuǎn)后不希望看到背面,則可以使用。
visible:背面是可見(jiàn)的(默認(rèn)值)
hidden:背面是不可見(jiàn)的
實(shí)現(xiàn)的思路要實(shí)現(xiàn)類似的翻牌效果,首先我們需要有一張可以翻的牌,這張牌由兩個(gè)元素重疊組成,位于上層正面我們看到,而位于下層的背面我們看不到并且本身是繞Y軸旋轉(zhuǎn)過(guò)的,這樣,當(dāng)鼠標(biāo)移動(dòng)上去后,同時(shí)讓正面和背面執(zhí)行旋轉(zhuǎn)就可以實(shí)現(xiàn)翻牌效果。
實(shí)現(xiàn)基本結(jié)構(gòu)代碼如下:
ul,li { margin:0; padding:0; list-style:none; } #content ul li{ width: 225px; height: 180px; } #content ul li a{ position: relative; display: block; width: 100%; height: 100%; } #content ul li a > div{ position: absolute; left: 0; height: 0; width: 100%; height: 100%; color: #fff; } #content ul li a div:first-child{ background-color: rgb(255, 64, 129); z-index:2; } #content ul li a div:last-child{ background:rgb(0, 188, 212); z-index:1; } #content ul li a div h3{ margin: 0 auto 15px; padding: 15px 0; width: 200px; height: 16px; line-height: 16px; font-size: 14px; text-align: center; border-bottom: 1px #fff dashed; } #content ul li a div p{ padding: 0 10px; font-size: 12px; text-indent: 2em; line-height: 18px; }
這樣就讓兩個(gè)div疊在一起了,但是如果要進(jìn)行翻轉(zhuǎn)的話,首先是需要將背面本身就翻過(guò)去,當(dāng)鼠標(biāo)放上去之后翻轉(zhuǎn)過(guò)來(lái),讓我們看到,所以我們需要給背面添加翻轉(zhuǎn)180°的屬性,鼠標(biāo)放上去之后讓它翻轉(zhuǎn)到0°,同時(shí)為保證每個(gè)瀏覽器渲染統(tǒng)一,給正面加一個(gè)翻轉(zhuǎn)0°,鼠標(biāo)移動(dòng)上去之后翻轉(zhuǎn)-180°,并且是一個(gè)動(dòng)畫(huà),所以要添加過(guò)渡。所以給正面背面添加CSS如下:
#content ul li a > div{ -webkit-transition:.8s ease-in-out; -moz-transition:.8s ease-in-out; } #content ul li a div:first-child{ -webkit-transform:rotateY(0); -moz-transform:rotateY(0); } #content ul li a div:last-child{ -webkit-transform:rotateY(180deg); -moz-transform:rotateY(180deg); } #content ul li a:hover div:first-child{ -webkit-transform:rotateY(-180deg); -moz-transform:rotateY(-180deg); } #content ul li a:hover div:last-child{ -webkit-transform:rotateY(0); -moz-transform:rotateY(0); }
在添加這些CSS3屬性后,可以實(shí)現(xiàn)翻轉(zhuǎn),但是發(fā)現(xiàn)只看到正面,沒(méi)有看到背面,這又是為什么呢,前面提到有一個(gè)屬性backface-visibility,這個(gè)屬性用于控制在翻轉(zhuǎn)后,元素的背面是否可見(jiàn),默認(rèn)是可見(jiàn)的,所以就會(huì)擋著背面那個(gè)元素,我們需要手動(dòng)設(shè)置元素翻轉(zhuǎn)后背面不可見(jiàn),所以需要設(shè)置:
#content ul li a > div{ -webkit-backface-visibility: hidden; -moz-backface-visibility: hidden; }
這樣設(shè)置之后,由于正面的元素在翻轉(zhuǎn)后背面不可見(jiàn),我們就可以看到背面的元素了。
但是,仔細(xì)觀察會(huì)發(fā)現(xiàn)這個(gè)翻轉(zhuǎn)似乎并不是那么立體,似乎在兩條平行線之間實(shí)現(xiàn)了翻轉(zhuǎn),所以我們需要設(shè)置一個(gè)觀察點(diǎn)距離視圖的距離,這時(shí)候就需要給父元素添加perspective屬性,這個(gè)屬性的值一般為800px ~ 1000px,這個(gè)范圍內(nèi)的值會(huì)看上去合理。所以給父元素添加:
#content ul li a{ -webkit-perspective: 800px; -moz-perspective: 800px; }
至此,就實(shí)現(xiàn)了一個(gè)翻轉(zhuǎn)卡牌的效果,但是這里需要解決一個(gè)問(wèn)題,因?yàn)?b>perspective屬性不被IE支持(Microsoft Edge支持),所以需要進(jìn)行降級(jí),我的做法是直接顯示隱藏。那么如何識(shí)別IE9+瀏覽器呢?在stackoverflow中我找到了答案:
附:CSS中識(shí)別各類IE的方法 IE6* html .ie6{ property:value; }
or
html .ie6{ _property:value; }IE7
*+html .ie7{ property:value; }
or
*:first-child+html ie7{ property:value; }IE6 and IE7
@media screen9{ ie67{property:value;} }
or
.ie67{ *property:value;}
or
.ie67{ #property:value;}IE6,7 and 8
@media