iOS中CSS的transition動(dòng)畫閃動(dòng)bug

場(chǎng)景:
1.在開發(fā)中使用瀏覽器打開有CSS transition動(dòng)畫的網(wǎng)頁(yè),發(fā)現(xiàn)動(dòng)畫一開始是連貫的,到了后面動(dòng)畫還沒結(jié)束就突然閃到動(dòng)畫結(jié)束的位置。
2.瀏覽器組件是WKWebView。
3.重復(fù)打開瀏覽器,情況會(huì)越來(lái)越嚴(yán)重,到最后動(dòng)畫沒了,直接從動(dòng)畫開始位置變換到動(dòng)畫結(jié)束的位置。
4.系統(tǒng)越低級(jí)越嚴(yán)重,到了iOS10閃動(dòng)情況減緩了不少。

下面是測(cè)試的html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta http-equiv="Content-Language" content="zh-cn"/>  
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">  
    <meta name="viewport" content="width=640,target-densitydpi=device-dpi,user-scalable=no">  
</head>
<style>
    *{
        margin: 0;
    }
    #demo{
        width:200px;
        height: 200px;
        position: absolute;
        right: 0;
        background-color:green;
        -webkit-transition:all  1s;
        transition:all 1s;
        
    }
    #btn{
        font-size: 30px;
        color:#fff;
        width: 170px;
        height: 50px;
        line-height: 50px;
        border-radius: 12px;
        text-align: center;
        background-color:red;
        position: absolute;
        top: 250px;
        left: 250px;
    }
</style>
<body style="position: relative;">
    <div id="demo"></div>
    <div id="btn">我是按鈕</div>
</body>
<script type="text/javascript" src="http://s1.bdstatic.com/r/www/cache/static/jquery/jquery-1.10.2.min_f2fb5194.js"></script>
<script>
    var bol = true;
    $('#btn').click(function(){
        if (bol) {
            $('#demo').css('webkit-transform','translate(-400px)');
            $('#demo').css('transform','translate(-400px)');
            bol = false;
        }
        else{
            $('#demo').css('webkit-transform','translate(0px)');
            $('#demo').css('transform','translate(0px)');
            bol = true;
        }
        
    })
</script>
</html>

就是一個(gè)點(diǎn)擊按鈕就能左右移動(dòng)方塊的demo

Paste_Image.png

解決:
看了好久沒發(fā)現(xiàn)原因,只能用二分法注釋代碼來(lái)找(囧)。
最后發(fā)現(xiàn),是下面這個(gè)方法導(dǎo)致的:

[subview drawViewHierarchyInRect:subview.bounds afterScreenUpdates:YES];

這是用來(lái)對(duì)網(wǎng)頁(yè)進(jìn)行截屏的方法,當(dāng)afterScreenUpdates的參數(shù)是YES的時(shí)候,系統(tǒng)會(huì)等待所有視圖變更完畢之后采取截取屏幕。例如,在調(diào)用了此方法之后,仍然去修改subview的樣式,那么系統(tǒng)就會(huì)等到修改完成之后才進(jìn)行截屏工作。

把參數(shù)設(shè)成NO,或者不使用這個(gè)方法就會(huì)解決此問(wèn)題。

類似的,還有以下這個(gè)方法:

- (nullable UIView *)snapshotViewAfterScreenUpdates:(BOOL)afterUpdates NS_AVAILABLE_IOS(7_0);

凡是帶有"AfterScreenUpdates"字樣的參數(shù)應(yīng)該都有這個(gè)問(wèn)題。

至于更深層次的原因,例如是不是調(diào)用以上的方法會(huì)占用GPU資源、還是影響了CSS動(dòng)畫繪制,我就不知道了,希望有大神能解答。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,922評(píng)論 25 709
  • 為什么分頁(yè)? 從開發(fā)者的角度來(lái)看,如何加載所有內(nèi)容?一次不可能顯示很多的內(nèi)容。我們只能顯示它們的部分。 分頁(yè)允許用...
    Kotyo閱讀 13,771評(píng)論 1 17
  • 今天和環(huán)姐簡(jiǎn)單溝通了下,對(duì)自己有些啟發(fā),不管現(xiàn)在如何,至少我在路上,是真正的想做好。 和會(huì)員溝通了她的情況,因?yàn)楸?..
    Mela仙仙閱讀 192評(píng)論 0 0
  • 圖文/飽粒兒 NO.4 小伙兒圍棋學(xué)得好,在班里所向披靡,孩子就是這樣,越讓他有自信的事物,他越愿意接觸,這段時(shí)間...
    飽粒兒麥子閱讀 428評(píng)論 0 1
  • 這是我們畢業(yè)的第四個(gè)年頭,愿“我們不老,青春不朽!??!”的你們?nèi)绱喝瞻愕年?yáng)光,充滿生機(jī)和希望。 壹——回憶起來(lái),那...
    瑩火達(dá)歌閱讀 631評(píng)論 10 10

友情鏈接更多精彩內(nèi)容