JS裡面的兩種運動函數

来源:http://www.cnblogs.com/liudongpei/archive/2016/11/06/6036848.html
-Advertisement-
Play Games

最新學了一個新的運動函數,與最初學習的有所不同,第一個運動是根據運動速度完成運動 ,第二個則是根據運動的時間來完成運動,而且把之前的函數都進行了一些相容處理,在這裡列出了看一下: 第一種animate1 第二種animate2 總結: animate1中各種運動完成的時間是不一致的,而animate ...


最新學了一個新的運動函數,與最初學習的有所不同,第一個運動是根據運動速度完成運動 ,第二個則是根據運動的時間來完成運動,而且把之前的函數都進行了一些相容處理,在這裡列出了看一下:

第一種animate1

 1 function animate1(obj,data,rate,fn){//運動對象,運動數據,[運動速度],[回調函數]
 2     //遍歷獲取樣式屬性
 3     for(var key in data){ 
 4         //通過閉包將key私有化
 5         (function(k){
 6             /*  
 7                 獲得樣式寬高等會帶有單位px需要處理掉,
 8                 如果使用parseInt,當傳入opacity為小數時會變為0,所以使用parseFloat
 9             */
10             var cur = parseFloat( (obj.currentStyle || getComputedStyle(obj,null) )[k]);
11             
12             //對特殊值進行處理
13             if(k == "opacity"){
14                 //透明度當前值和目標值放大100倍,防止小數被捨去
15                 cur *= 100;
16                 data[k] *= 100;
17             }
18             
19             //當前值和目標值相等,直接返回
20             if(cur == data[k]){ return; }
21             
22             //通過自身名字定義定時器,解決每個運動共用一個定時器,造成清除其他運動定時器的問題
23             clearInterval(obj[k +'timer']);
24             
25             obj[k+'timer'] = setInterval(function(){
26                 
27                 //當前 += (目標-當前)*比率  比率不傳則預設0.2
28                 cur += (data[k] - cur) * (rate || 0.2);
29                 
30                 if(Math.round(cur) == data[k]){ 
31                     //如果到達目標值清除定時器,同步數據
32                     clearInterval(obj[k+'timer']);
33                     cur=data[k];
34                     
35                     //回調,將定時器賦值為0,遍歷每個定時器的值相加,如果所有定時器相加都為0,說明運動已經全部完成,執行回調函數
36                     obj[k + "timer"] = 0;
37                     var bl = 0;
38                     for(var key in data){
39                         bl += obj[key + "timer"];
40                     }
41                     if(bl == 0){
42                         //判斷是否傳入回調函數
43                         fn && fn.call(obj);
44                     }
45                 }
46                 
47                 //使用數據時判斷特殊值
48                 if(k == "opacity"){
49                     //opacity具有相容問題,ie8以下使用filter:alpha(opacity:100)
50                     obj.style.opacity = cur / 100;
51                     obj.style.filter = "alpha(opacity="+ cur +")";
52                 }else{  
53                     obj.style[k] = cur + "px";
54                 }
55             },30)
56         })(key);
57     }
58 }

 

第二種animate2

function animate2(obj,data,time,fn){//運動對象,運動數據,[運動時間],[回調函數]
    //保存初始值和變化值
    var start = {};
    var dis = {};
    
    for(var name in data){
        //獲取樣式,根據屬性名保存在json中,{width:200,height:200}
        start[name] = parseFloat( (obj.currentStyle || getComputedStyle(obj,null) )[name]);
        //變化值 = 目標值 - 初始值  ----> {width:500,height:300}
        dis[name] = json[name] - start[name];
    } 
    
    //根據完成的時間獲得運動次數,30為定時器頻率
    var count = Math.round((time || 700)/30);
    
    //記錄已經運動次數
    var n = 0;
    //將定時器綁定在對象身上,如果不同對象調用不會清除之前的運動
    clearInterval(obj.timer);
    obj.timer = setInterval(function(){
        
        n++;        
        for(var name in data){
            //位置:起點 + 距離/次數*n        
            var cur = start[name] + dis[name] / count * n;
            
            //對特殊屬性進行判斷
            if(name == "opacity"){
                obj.style.opacity = cur;
                obj.style.filter = "alpha(opacity:"+cur*100+")";
            } else {
                obj.style[name] = cur + "px";
            }
        }
            
        //如果已經運動次數和總次數相等,則完成運動,清除定時器,執行回調函數
        if(n == count){
            clearInterval(obj.timer);
            fn && fn.call(obj);
        }
        
    },30);  
}

總結:

  animate1中各種運動完成的時間是不一致的,而animate2都是在同一時間內完成,

  因此,在調用回調函數的時候animate1需要判斷對象中的所有的運動都已經完成,而animate2只要到達運動次數就可以了。

  兩個運動函數都能解決正常的動畫效果,並不能說哪個就一定比較好,而且都還有改善的地方,以後學到再繼續完善吧


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.1概述 定義了一個操作中演算法的骨架,而將一些步驟延遲到子類中。模板方法使子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟。這就是模板方法的定義。 類中的方法用以表明該類的實例所具有的行為,一個類可以有許多方法,而且類中的實例方法也可以調用該類中的其他若幹個方法。在編寫類的時候,可能需要 ...
  • 對於一個對設計模式一無所知的程式員來說,維護成本,無疑是一個致命的問題,所以從今開始,我要開始努力學習,設計模式,在這裡,記錄自己的學習成果 生產類 。 。 。 ...
  • 1.1概述 允許一個對象在其內部狀態改變時改變它的行為,對象看起來似乎修改了它的類。這就是狀態模式的定義。 一個對象的狀態依賴於它的變數的取值情況,對象在不同的運行環境中,可能具有不同的狀態。在許多情況下,對象調用方法所產生的行為效果依賴於它當時的狀態。 例如,一個溫度計(Thermometer)類 ...
  • 例如:The prefix "context" for element "context:annotation-config" is not bound. 這種情況是因為沒有申明該標簽,然後就使用了。解決方發是,在配置文件頭部加入相應的信息即可( 即xmlns:context="http://www ...
  • React框架已經火了好長一段時間了,再不學就out了! 對React還沒有瞭解的同學可以看看我之前的一篇文章,可以快速簡單的認識一下React。 "React入門最好的實例-TodoList" 自己從開始接觸react一竅不通,到慢慢的似懂非懂,通過各種途徑學習也有一陣了。學習過程中還會接觸到很多 ...
  • 效果預覽 實例代碼 <!DOCTYPE html> <html lang="zh" class="no-js"> <head> <meta charset="UTF-8" /> <title>catslider簡單的多商品分類滑動</title> <meta http-equiv="X-UA-Com ...
  • http://www.jxedt.com/wen/kaoshi/3174963987168886819.html http://www.jxedt.com/wen/kaoshi/3174963988918370327.html http://www.jxedt.com/wen/kaoshi/3174 ...
  • 如果運行後界面上不彈出“沒有jquery”的提示以及段落被點擊後消失,則導入成功;否則說明沒有成功,那麼就檢測代碼吧,一般將jQuery放入項目文件下應該是可以用的,不成功的話多數情況是代碼有問題,如某些拼寫錯誤等。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...