CSS3動(dòng)畫的硬件加速的問題。。
問題描述
查資料好像是這么說的:CSS3硬件加速觸發(fā)時(shí)候,會(huì)創(chuàng)建一個(gè)新的層,其中的圖像會(huì)用GPU進(jìn)行渲染,來提高性能。
這樣有了一個(gè)問題呀,最近寫東西時(shí)候,發(fā)現(xiàn)如果子級(jí)元素觸發(fā)了硬件加速渲染的動(dòng)畫,如果父級(jí)也是硬件渲染的,就算父級(jí)沒有動(dòng)畫效果,也會(huì)在硬件渲染層里觸發(fā)父級(jí)的重繪。
下面是我簡(jiǎn)單寫了一個(gè)示例,父級(jí).p用transform屬性來調(diào)整了下位置,子元素a標(biāo)簽在hover時(shí)觸發(fā)了opacity的過渡動(dòng)畫效果的話,會(huì)發(fā)現(xiàn)父級(jí)元素也被重繪了。
用谷歌的layer border可以看到:
父級(jí)也在層里面,而且用paint flashing也會(huì)看到,父級(jí)也會(huì)被重繪,而這根本是沒必要的。。我的實(shí)際情況中,父級(jí)元素內(nèi)還有個(gè)圖片,如果圖片被重繪的話就會(huì)變模糊一段時(shí)間。。。
如果取消了父級(jí)的transform屬性,就不會(huì)觸發(fā)父級(jí)的重繪了。
該怎么辦才能使a標(biāo)簽觸發(fā)動(dòng)畫時(shí),不讓父元素也跟著重新渲染呢?
想過更改父元素定位的方法,不用transform了。。。但是貌似還要改dom結(jié)構(gòu)啊。。有沒有什么設(shè)置可以讓某個(gè)元素禁止使用硬件加速呀。。。
<!DOCTYPE html><html><head> <meta charset='UTF-8'> <title>test2</title> <style>*{ margin: 0; padding: 0; border: none;}body,html{ width: 100%; height: 100%;}.p{ width: 300px; height: 180px; background-color: #888; position: absolute; left: 50%; top: 50%; transform: translate(-50%,-50%);}.p a{ position: absolute; width: 40%; height: 80%; top: 10%; opacity: 0; transition: opacity 1s; background-color: #333;}.p a:hover{ opacity: 1;}.prev{ left: 0;}.next{ right: 0;} </style></head><body><p class='p'> <a class='prev'></a> <a class='next'></a></p></body></html>
問題解答
回答1:可能概念沒有描述清楚。chromium/webkit硬件加速中
transform case需要3D變換才會(huì)創(chuàng)建新的合成層 也就是例子中translate3d(-50%,-50%,0)即可。通常啟用使用translateZ(0);
opacity和過渡/動(dòng)畫case 需要?jiǎng)赢媹?zhí)行的過程中才會(huì)創(chuàng)建合成層,也就是過渡或動(dòng)畫沒有開始或結(jié)束后元素還會(huì)回到之前的狀態(tài),這也解釋了例子中過渡開始和結(jié)束父極元素會(huì)重繪,過程:移除元素(這里元素是渲染內(nèi)部表示RenderObject/Layer,下同)->創(chuàng)建合成層,過渡動(dòng)畫,刪除合成層->移回元素;
附:這里移除父極的transform就好了可能是因?yàn)閠ransform:translate破壞了父極的渲染層,創(chuàng)建了新渲染層但又未達(dá)到創(chuàng)建合成層(使用硬件加速)的條件,且使得其與其子元素p處于同一個(gè)渲染層(一般情況),子元素的離開和加入使其重繪。(這個(gè)結(jié)論的來源:使子元素啟用硬件加速,完全脫離父元素,如給其加tranform 3d變換 translateZ(0);)
相關(guān)文章:
1. python - 獲取到的數(shù)據(jù)生成新的mysql表2. javascript - js 對(duì)中文進(jìn)行MD5加密和python結(jié)果不一樣。3. mysql里的大表用mycat做水平拆分,是不是要先手動(dòng)分好,再配置mycat4. window下mysql中文亂碼怎么解決??5. sass - gem install compass 使用淘寶 Ruby 安裝失敗,出現(xiàn) 4046. python - (初學(xué)者)代碼運(yùn)行不起來,求指導(dǎo),謝謝!7. 為啥不用HBuilder?8. python - flask sqlalchemy signals 無法觸發(fā)9. python的文件讀寫問題?10. 為什么python中實(shí)例檢查推薦使用isinstance而不是type?
