D3.js 動畫 過渡效果 (V3版本)

来源:https://www.cnblogs.com/littleSpill/archive/2019/05/20/10896253.html
-Advertisement-
Play Games

一 、 過渡的啟動 啟動過渡效果,與以下四個方法相關: d3.transition([selection],[name]) //創建一個過渡對象。但是由於每個選擇集中都有transition()方法,可用d3.select("rect").transition()的方式來創建過渡,因此一般不直接用d ...


一 、 過渡的啟動   啟動過渡效果,與以下四個方法相關:   d3.transition([selection],[name]) //創建一個過渡對象。但是由於每個選擇集中都有transition()方法,可用d3.select("rect").transition()的方式來創建過渡,因此一般不直接用d3.transition()。   transition.delay([delay]) //設定延遲的時間。過渡會經過一定時間後才開始發生。單位是毫秒。   transition.duration([duration]) //設定過渡的持續時間(不包括延遲時間),單位是毫秒。如:duration(2000),是持續2000ms。   transition.ease(vlaue[,arguments]) //設定過渡樣式,例如線性過渡、在目標處彈跳幾次等方式。   接下來製作一個過渡效果:  
 1      var width = 600;
 2         var height = 400;
 3 
 4         var svg = d3.select("#body")
 5                     .append("svg")
 6                     .attr("width",width)
 7                     .attr("height",height)
 8         
 9         svg.append("rect")
10             .attr("fill","yellow")
11             .attr("x",100)
12             .attr("y",100)
13             .attr("width",100)
14             .attr("height",30)
15             .transition()
16             .attr("width",300)
  上述代碼只使用了transition()。預設情況下,延遲(delay)為0ms,持續時長(duration)為250ms。請註意過渡前後的狀態: 過渡前,矩形的寬度(width)為100。 過渡後,矩形的寬度為300。     過渡的前後狀態必須是不同的,才能看到變化。不同狀態。可以是形狀、顏色、位置、透明度等。展示的是矩形在0ms時刻的寬度漸變到250ms時刻的寬度。   如果沒有調用transition()append()返回該元素的選擇集對象。如果調用了transition(),返回的就不是選擇集對象,而是一個過渡對象。選擇集對象和過渡對象是完全不同的概念,其成員變數和方法有所不同。關於區別,請看代碼:  
 1   var rect = svg.append("rect")
 2                     .attr("fill","yellow")
 3                     .attr("x",100)
 4                     .attr("y",100)
 5                     .attr("width",100)
 6                     .attr("height",30)
 7         
 8         //列印rect
 9         console.log(rect)       //rect是選擇集
10 
11         //啟動過渡效果
12         var rectTran = rect.transition()
13 
14         //列印rectTran
15         console.log(rectTran)   //rectTran是一個過渡對象

 

rect是一個選擇集對象rectTran是一個過渡對象。控制台輸出結果如圖:可以看到,它們是不同的兩種對象。         如下圖所示:左圖為選擇集對象的方法列表。可以找到data()sort()append()等之前介紹過得方法。右圖是過渡對象的方法列表,沒有data()datum()等方法。因此,過渡對象是不能綁定數據的。     調用transition(),得到過渡對象。之後,一般會跟著delay()、duration()、ease(),用於設置延遲、過渡時間、過渡樣式。舉個例子:  
 1      var rect = svg.append("rect")
 2                     .attr("fill","yellow")
 3                     .attr("x",100)
 4                     .attr("y",100)
 5                     .attr("width",100)
 6                     .attr("height",30)
 7         var rectTran = rect.transition()
 8                         .delay(500)         //延遲500ms再開始
 9                         .duration(1000)     //過渡時長為1000ms
10                         .ease("blunce")     //過渡樣式
11                         .attr("width",300)  //目標屬性

 

這段代碼的過渡效果總時長為1500ms(延遲500ms+過渡時長1000ms),在目標屬性處會彈跳幾次,這是由於過渡樣式被設置為blunce   另外,transition()可多次調用。每一次都會產生一個新的過渡,可以連續使用。請看代碼:  
 1     var rect = svg.append("rect")
 2                     .attr("fill","yellow")
 3                     .attr("x",100)
 4                     .attr("y",100)
 5                     .attr("width",100)
 6                     .attr("height",30)
 7 
 8 
 9         var rectTran = rect.transition()        //開始一個過渡
10                         .attr("width",300)      //目標寬度為300
11                         .transition()           //開始一個過渡
12                         .attr("height",300)     //目標高度為300
13                         .transition()           //開始一個過渡
14                         .attr("width",100)      //目標寬度為100
15                         .transition()           //開始一個過渡
16                         .attr("height",100)     //目標高度為100

 

這段代碼中,第一個過渡是將矩形的寬度轉變到300,第二個是將高度轉變成300,第三個是將寬度轉變到100,第四個是將高度轉變到100.由於沒有設定延遲和過渡時間,都使用預設值。  

 

二 、 過渡的屬性   過渡的屬性,是指元素的狀態。由於過渡的前後狀態不同,因此需要指定過渡前後元素的不同屬性。   transition.attr(name,value) //將屬性name過渡到目標值value。value可以是一個函數。   transition.attrTeeen(name,tween) //將屬性name使用插值函數tween()進行過渡。
transition.style(name,value[,priority]) //將css樣式的name屬性過渡到目標值value。priority是可選參數,表示css樣式的優先順序,只有null和important兩個值。   transition.styleTween(name,tween[,priority]) //將css樣式的屬性name使用函數tween進行過渡。與attrTween()類似。
transition.text(value) //過渡開始時,將文本設置為value值   transition.tween(name,factory) //將屬性name按照函數factory進行過渡。attrTween()和StyleTween()都是用此函數實現的。
transition.remove() //過渡結束後,刪除被選擇的元素。   transition.attr(name,value) transition.attrTeeen(name,tween)操作的是x、y、width、height這樣的屬性。
transition.attr(name,value) 的使用很好理解,例如:  
1 .attr("width",100)
2 .transition()
3 .attr("width",300)
  初始寬度為100,目標寬度為300,過渡會在250ms(預設時間)內將寬度屬性從100變為300,屬性變化的中間值是由預設的插值函數計算的。   如果要手動設置插值函數,要使用transition.attrTeeen(name,tween),舉個例子:  
 1     var rect = svg.append("rect")
 2                     .attr("fill","yellow")
 3                     .attr("x",100)
 4                     .attr("y",100)
 5                     .attr("width",100)
 6                     .attr("height",30)
 7 
 8         var rectTran = rect.transition()
 9                         .duration(2000)
10                         .attrTween("width",function(d,i,a){
11                             return function(t){
12                                 return Number(a) + t * 300
13                             }
14                         })
  attrTween()的第一個參數是屬性名,第二個參數是一個無名函數function(d,i,a)d是被綁定數據,i是索引號,a是屬性width的初始值。該函數返回的function(t),就是插值函數。其參數t的範圍是[0,1]0表示變化的起始,1表示變化的結束。此處,初始值a等於100,當t等於0時,function(t)返回100。當t等於1時,function(t)返回400.此時,該過渡屬性將width屬性從100過渡到400,所用時間為2000ms(2s)。   transition.style(name,value[,priority]) transition.styleTween(name,tween[,priority])操作的是style里的樣式。舉個例子:   
1    svg.append("rect")
2             .attr("fill","yellow")
3             .attr("x",100)
4             .attr("y",100)
5             .attr("width",100)
6             .attr("height",30)
7             .transition()
8             .duration(2000)
9             .attr("fill",'red')
  這段代碼會將style里的fill的值從yellow變成red,過度時間為預設的2000ms。   對文字進行過渡要用到tween()。前面在介紹attrTween()的時候對矩形的寬度實現了過渡,先添加如下要求: 矩形上添加文字,用來標識矩形的寬度。同時,矩形的寬度在變化的時候,文字也要跟著變化。代碼:  
 1   svg.append("rect")
 2             .attr("fill","yellow")
 3             .attr("x",100)
 4             .attr("y",100)
 5             .attr("width",100)
 6             .attr("height",30)
 7             .transition()
 8             .duration(2000)
 9             .attr("width",300)
10 
11         var text = svg.append("text")
12                     .attr("fill","white")
13                     .attr("x",150)
14                     .attr("y",100)
15                     .attr("dy","1.2em")
16                     .attr("text-anchor","end")
17                     .text(100)
18 
19 
20         var initx = text.attr("x")
21         var initText = text.text()
22         
23         var textTran = text.transition()
24                         .duration(2000)
25                         .tween("text",function(){
26                             return function(t){
27                                 d3.select(this)
28                                     .attr("x",Number(initx) + t * 250 )
29                                     .text(Math.floor(Number(initText) + t * 300 ))
30                             }
31                         })

  

tween()的第二個參數返回的是function(t),t的範圍也是[0,1]  
1         //當t為0時,函數體力的操作是:
2         d3.select(this)
3             .attr("x",150 + 0 * 250)
4             .text(Math.floor(100 + 0 * 300))
5 
6         //當t為1時,函數體里的操作是:
7         d3.select(this)
8             .attr("x",150 + 1 * 250 )
9             .text(Math.floor(100 + 1 * 300))    

 

過渡的效果圖為:隨著時間的推移,文字的內容和文字的位置都是變化的。       transition.remove() 當元素淡出的時候需要用到。舉個例子:    
 1   var rect = svg.append("rect")
 2                     .attr("fill","yellow")
 3                     .attr("x",100)
 4                     .attr("y",100)
 5                     .attr("width",100)
 6                     .attr("height",30)
 7 
 8         rect.transition()
 9             .attr("width",0)
10             .remove()

 

當矩形過渡的目標完成,即width變為0的時候。就刪除該元素。此外,還可以據此做成元素顏色慢慢變淡,最後刪除。  

 

 


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

-Advertisement-
Play Games
更多相關文章
  • 一、手機界面UI渲染顯示流程 二、16ms原則 三、造成卡頓的原因 四、過度繪製介紹、檢測工具、如何避免造成過度繪製造成的卡頓 ...
  • 一 :Bluetooth 的設置應用 packages\apps\Settings\src\com\android\settings\bluetooth\ 藍牙設置應用及設置參數,藍牙狀態,藍牙設備等。 BluetoothDevicePreference.java 顧名思義,藍牙設備首選項,也就是藍 ...
  • 一 : Android.mk文件概述 主要向編譯系統指定相應的編譯規則。會被解析一次或多次。因此儘量減少源碼中聲明變數,因為這些變數可能會被多次定義從而影響到後面的解析。這個文件的語法會把源代碼組織成模塊,每個模塊屬於下列類型之一: 二 : 系統變數 三 : mk文件模板 編譯C/C++應用程式的模 ...
  • 如何做一個跨平臺的游戲App? iOS和安卓系統上的應用程式,根據提供的內容不同,按照開發方式和用戶體驗不同,可區分為app和游戲; 首先從開發方式不同來說明,app開發一般是用操作系統官方提供的開發套件來做對應的開發; 這裡的開發套件就系統不同可做以下區別: iOS: Xcode, Objecti ...
  • call apply ...
  • bootstrap支持的js插件 概覽 bootstrap中的JavaScript插件: | 插件名稱 | 定義文件 | | | : | | 動畫過濾 | transition.js | | 模態框 | modal.js | | 下拉菜單 | dropdown.js | | 滾動偵測 | scrol ...
  • 報錯: Method "watch" has type "object" in the component definition. Did you reference the function Method "watch" has type "object" in the component def ...
  • Maptalks 項目是一個 HTML5 的地圖引擎, 基於原生 ES6 Javascript 開發: - 二三維一體化地圖, 通過二維地圖的旋轉 /傾斜增加三維視角 - 插件化設計, 能與其他圖形庫結合, 開發各種二三維效果, 例如 echarts/d3/THREE 等 - 很認真的優化了繪製性能 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...