chrome 16, css3 ,html5, transition, animation
避免google 瀏覽器執行CSS3屬性時出現黑屏
前一陣子開發web前端服務,大量的使用CSS3的動畫特效,尤其是animation與transition,原本一切都好好的,某天,Chrome瀏覽器自動更新後(版本16之後),突然畫面上就偶發性的出現黑色區塊,或是邊界殘影,上網搜尋了很久,發現也有不少人遇到這個問題。
經過一番辛苦的爬文後,依然沒有結論,只知道確定是Chrome瀏覽器的問題,因為別家browser的都沒事。Case就這樣擺爛放著一陣子,有一天,同事突然問了一句,他需要回報確定的發生問題,想知道究竟是設定了哪個屬性才造成這種現象,恩...然後...我發現...疑...沒有設定屬性耶,那怎麼效果跑的這麼開心,又經過一翻研究,發現,原來在chrome中,animation與transition沒有特別指定要套用的屬性時,預設是 all,也就是全屬性。
噹噹~! 馬上就著手進行測試,嗯嗯,設定成特定屬性試試看,哇,果然黑色區塊的問題不翼而飛,接下來直接寫上transition全屬性套用呢? 嘿嘿,問題又出現了! 賓果,抓到你了!
結論,使用CSS3的transition與animation時,為了避免在chrome瀏覽器出現錯誤,記得要指派特定的屬性喔~
各位看到這裡,一定覺得奇怪,怎麼會有stylesheet裡面的樣式用到css3特效卻沒有指定屬性的,這裡要特別說明,就是有! 因為我們知道CSS3特效要作用,必須要設定好幾個參數:[時間]、[屬性]、[播放方式],又由於目前各家瀏覽器都是屬於beta階段,所以都要加上前綴,這樣一來樣式設定就會變成以下的樣子。
.myClass { transition-duration:0.3s; -moz-transition-duration:0.3s; -webkit-transition-duration:0.3s; -o-transition-duration:0.3s; -ms-transition-duration:0.3s; transition-timing-function: linear; -moz-transition-timing-function: linear; /* Firefox 4 */ -webkit-transition-timing-function: linear; /* Safari and Chrome */ -o-transition-timing-function: linear; /* Opera */ transition-property:width,height; -moz-transition-property:width,height; -webkit-transition-property:width,height; -o-transition-property:width,height; -ms-transition-property:width,height; }
看到沒,長長一大段,為了可以讓代碼重複使用,所以我們做了如下的抽象化動作
.TransSettings { transition-duration:0.3s; -moz-transition-duration:0.3s; -webkit-transition-duration:0.3s; -o-transition-duration:0.3s; -ms-transition-duration:0.3s; transition-timing-function: linear; -moz-transition-timing-function: linear; /* Firefox 4 */ -webkit-transition-timing-function: linear; /* Safari and Chrome */ -o-transition-timing-function: linear; /* Opera */ } .opacTrans { transition-property:opacity; -moz-transition-property:opacity; -webkit-transition-property:opacity; -o-transition-property:opacity; -ms-transition-property:opacity; } .borderTrans{ transition-property:border; -moz-transition-property:border; -webkit-transition-property:border; -o-transition-property:border; -ms-transition-property:border; }
使用的時候就可以這樣指派
class="TransSettings opacTrans"
有沒有發現,上面的TransSettings就成了"沒有設定屬性的"CSS3特效了
解決方式
將TransSettings改成如下:
.Trans { transition-property:none; -moz-transition-property:none; -webkit-transition-property:none; -o-transition-property:none; -ms-transition-property:none; transition-duration:0.3s; -moz-transition-duration:0.3s; -webkit-transition-duration:0.3s; -o-transition-duration:0.3s; -ms-transition-duration:0.3s; transition-timing-function: linear; -moz-transition-timing-function: linear; /* Firefox 4 */ -webkit-transition-timing-function: linear; /* Safari and Chrome */ -o-transition-timing-function: linear; /* Opera */ }
也就是加上了 transition-property:none的設定,就可以避免問題發生囉,另外,animation也可以如法炮製,如下
.animationSet { -webkit-animation-name:none; -moz-animation-name:none; -ms-animation-name:none; -o-animation-name:none; animation-name:none; -webkit-animation-duration: 0.8s; -moz-animation-duration: 0.8s; -ms-animation-duration: 0.8s; -o-animation-duration: 0.8s; animation-duration: 0.8s; -webkit-animation-fill-mode: both; -moz-animation-fill-mode: both; -ms-animation-fill-mode: both; -o-animation-fill-mode: both; animation-fill-mode: both; }
animation目前還沒找到解決方法!
P.S 因為問題的發生是設定成全屬性造成(或沒設定預設全屬性),所以千萬不要貪圖方便就使用全屬性的設定方法喔。
CSS3 Animations
CSS3 Transitions
沒有留言:
張貼留言