亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > JavaScript > 正文

Javascript動畫的實現原理淺析

2024-05-06 16:15:37
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了Javascript動畫的實現原理淺析,本文用兩個實例來解釋Javascript動畫的實現原理,需要的朋友可以參考下
 

假設有這樣一個動畫功能需求:把一個div的寬度從100px變化到200px。寫出來的代碼可能是這樣的:

復制代碼代碼如下:

<div id="test1" style="width: 100px; height: 100px; background: blue; color: white;"></div>
function animate1(element, endValue, duration) {
    var startTime = new Date(),
        startValue = parseInt(element.style.width),
        step = 1;
    
    var timerId = setInterval(function() {
        var nextValue = parseInt(element.style.width) + step;
        element.style.width = nextValue + 'px';
        if (nextValue >= endValue) {
            clearInterval(timerId);
            // 顯示動畫耗時
            element.innerHTML = new Date - startTime;
        }
    }, duration / (endValue - startValue) * step);
}

 

animate1(document.getElementById('test1'), 200, 1000);


原理是每隔一定時間增加1px,一直到200px為止。然而,動畫結束后顯示的耗時卻不止1s(一般是1.5s左右)。究其原因,是因為setInterval并不能嚴格保證執行間隔。

 

有沒有更好的做法呢?下面先來看一道小學數學題:

復制代碼代碼如下:

A樓和B樓相距100米,一個人勻速從A樓走到B樓,走了5分鐘到達目的地,問第3分鐘時他距離A樓多遠?

勻速運動中計算某個時刻路程的計算公式為:路程 * 當前時間 / 時間 。所以答案應為 100 * 3 / 5 = 60 。

 

這道題帶來的啟發是,某個時刻的路程是可以通過特定公式計算出來的。同理,動畫過程中某個時刻的值也可以通過公式計算出來,而不是累加得出:

 

復制代碼代碼如下:

<div id="test2" style="width: 100px; height: 100px; background: red; color: white;"></div>
function animate2(element, endValue, duration) {
    var startTime = new Date(),
        startValue = parseInt(element.style.width);

 

    var timerId = setInterval(function() {
        var percentage = (new Date - startTime) / duration;

        var stepValue = startValue + (endValue - startValue) * percentage;
        element.style.width = stepValue + 'px';

        if (percentage >= 1) {
            clearInterval(timerId);
            element.innerHTML = new Date - startTime;
        }
    }, 13);
}

animate2(document.getElementById('test2'), 200, 1000);

 

這樣改良之后,可以看到動畫執行耗時最多只會有10幾ms的誤差。但是問題還沒完全解決,在瀏覽器開發工具中檢查test2元素可以發現,test2的最終寬度可能不止200px。仔細檢查animate2函數的代碼可以發現:

1.percentage的值可能大于1,可以通過Math.min限制最大值解決。
2.即使保證了percentage的值不大于1,只要endValue或startValue為小數,(endValue - startValue) * percentage的值也可能產生誤差,因為Javascript小數運算的精度不夠。其實我們要保證的只是最終值的準確性,所以在percentage為1的時候,直接使用endValue即可。

于是,animate2函數的代碼修改為:

復制代碼代碼如下:

function animate2(element, endValue, duration) {
    var startTime = new Date(),
        startValue = parseInt(element.style.width);

 

    var timerId = setInterval(function() {
        // 保證百分率不大于1
        var percentage = Math.min(1, (new Date - startTime) / duration);

        var stepValue;
        if (percentage >= 1) {
            // 保證最終值的準確性
            stepValue = endValue;
        } else {
            stepValue = startValue + (endValue - startValue) * percentage;
        }
        element.style.width = stepValue + 'px';

        if (percentage >= 1) {
            clearInterval(timerId);
            element.innerHTML = new Date - startTime;
        }
    }, 13);
}

 

還有最后一個疑問:setInterval的間隔為何設為13ms?原因是當下顯示器的刷新率一般不超過75Hz(即每秒刷新75次,也就是每隔約13ms刷新一次),把間隔跟刷新率同步效果更好。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美国产va在线影院| 亚洲小视频在线| 91久久嫩草影院一区二区| 日韩美女中文字幕| 国产精品欧美日韩一区二区| 日韩精品电影网| 日韩一区视频在线| 国产精国产精品| 色婷婷av一区二区三区久久| 日韩av大片免费看| 亚洲一区二区在线播放| 97香蕉超级碰碰久久免费软件| 日韩欧美中文第一页| 亚洲精品一区中文字幕乱码| 欧美成人午夜激情在线| 亚洲国产精品va在线看黑人| 国产福利精品av综合导导航| 国产99在线|中文| 97视频在线观看免费高清完整版在线观看| 久久久精品免费视频| 国产一区二区三区在线观看网站| 国产日韩欧美综合| 久久夜色精品国产| 伊人久久男人天堂| 久久久之久亚州精品露出| 日韩精品一区二区三区第95| 久久韩国免费视频| 精品久久在线播放| 日韩中文字幕免费看| 国产美女91呻吟求| 97超级碰碰碰| 久久久之久亚州精品露出| 91免费国产网站| 伊人一区二区三区久久精品| 中文字幕综合一区| 57pao精品| 91久热免费在线视频| 国产欧美一区二区三区久久| 国产免费一区二区三区在线能观看| www.午夜精品| 91久久久久久久久久久| 欧美疯狂xxxx大交乱88av| 2019中文字幕免费视频| 欧洲成人在线视频| 亚洲久久久久久久久久久| 亚洲免费中文字幕| 国产精品视频免费观看www| 91在线观看免费高清| 国产精品免费看久久久香蕉| 亚洲国产精品va在看黑人| 日韩精品高清在线| 8050国产精品久久久久久| 国产成人午夜视频网址| 亚洲欧美国产精品va在线观看| 中文字幕自拍vr一区二区三区| 国产在线日韩在线| 欧美日韩激情小视频| 日本伊人精品一区二区三区介绍| 国产精品69久久| 国产免费一区视频观看免费| 久久久www成人免费精品张筱雨| 欧美理论在线观看| 亚洲欧美国产精品va在线观看| 欧美一区二粉嫩精品国产一线天| www.欧美精品一二三区| 日韩美女视频免费在线观看| 成人动漫网站在线观看| 欧美成人精品在线播放| 97在线免费观看| 庆余年2免费日韩剧观看大牛| 国模精品视频一区二区| 欧美高清性猛交| 久久精品国产欧美亚洲人人爽| 日本久久久久久久久| 欧美午夜视频在线观看| 97国产精品视频人人做人人爱| 精品亚洲夜色av98在线观看| 欧美激情网友自拍| 精品美女永久免费视频| 久久精视频免费在线久久完整在线看| 亚洲精品免费av| 日韩av中文字幕在线| 国产97色在线|日韩| 91av视频在线播放| 国产一区二区三区在线| 精品动漫一区二区三区| 91精品国产自产在线| 久久久久久网站| 热久久美女精品天天吊色| 亚洲国产欧美一区二区丝袜黑人| 国产成人精品视| 亚洲情综合五月天| 亚洲成人黄色在线观看| 日韩欧美国产成人| 国产精品入口免费视| 亚洲成人av片在线观看| www国产亚洲精品久久网站| 国产精品久久77777| 17婷婷久久www| 欧美日韩国产精品一区| 久久深夜福利免费观看| 性欧美激情精品| 亚洲成avwww人| 欧美在线视频观看免费网站| 中文字幕一区二区精品| 日韩欧美亚洲一二三区| 日韩中文在线中文网在线观看| 欧美大荫蒂xxx| 一区二区欧美激情| 色妞一区二区三区| 久久综合色影院| 日韩欧美大尺度| 中文字幕九色91在线| 亚洲人午夜精品| 伊人亚洲福利一区二区三区| 国产午夜精品全部视频播放| 亚洲第一色在线| 国产精品www色诱视频| 精品亚洲va在线va天堂资源站| 亚洲欧美精品伊人久久| 欧美人成在线视频| 国产亚洲精品久久| 曰本色欧美视频在线| 亚洲精品永久免费精品| 日韩毛片中文字幕| 亚洲视频在线观看网站| 欧美高清无遮挡| 国内精品小视频| 久久久www成人免费精品| 精品国内产的精品视频在线观看| 亚洲一区二区三区xxx视频| 操日韩av在线电影| 精品国产乱码久久久久久婷婷| 欧美国产在线视频| 亚洲精品综合久久中文字幕| 国产精品精品国产| 日韩av在线影院| 欧美一级大片在线观看| 欧美成人国产va精品日本一级| 精品久久久一区二区| 国产精品女主播视频| 精品一区二区三区电影| 91精品在线国产| 亚洲精品大尺度| 欧美在线视频a| 欧美高清在线视频观看不卡| 亚洲欧美日韩国产中文专区| 亚洲精品v欧美精品v日韩精品| 午夜精品久久久久久久男人的天堂| 国产suv精品一区二区三区88区| 国产成人高潮免费观看精品| 精品国产一区av| 色综久久综合桃花网| 欧美午夜精品久久久久久久| 91精品国产自产在线老师啪| 国产精品精品一区二区三区午夜版| 深夜福利一区二区| 亚洲精品久久久久中文字幕欢迎你| 91精品国产91久久久| 久久亚洲影音av资源网| 亚洲精品成a人在线观看| 国产精品福利久久久| 精品丝袜一区二区三区| 国产精品视频网址|