D3.js - 動畫
D3.js 通過轉換支援動畫。我們可以通過正確使用轉換來做動畫。轉換是關鍵幀動畫的有限形式,只有兩個關鍵幀 - 開始和結束。起始關鍵幀通常是 DOM 的當前狀態,而結束關鍵幀是你指定的一組屬性,樣式和其他屬性。轉換非常適合轉換到新檢視,而不需要依賴於起始檢視的複雜程式碼。
示例 - 讓我們在“transition_color.html”頁面中使用以下程式碼。
<!DOCTYPE html>
<html>
<head>
<script type = "text/javascript" src = "https://d3js.org/d3.v4.min.js"></script>
</head>
<body>
<h3>Simple transitions</h3>
<script>
d3.select("body").style("background-color", "lightblue")
// make the background-color lightblue.transition()
.style("background-color", "gray");
// make the background-color gray
</script>
</body>
</html>
這裡,文件的背景顏色從白色變為淺灰色,然後變為灰色。
duration()
方法
duration()
方法允許屬性更改在指定的持續時間內平滑發生,而不是瞬間發生。讓我們使用以下程式碼進行 5 秒的轉換。
<!DOCTYPE html>
<html>
<head>
<script type = "text/javascript" src = "https://d3js.org/d3.v4.min.js"></script>
</head>
<body>
<h3>Simple transitions</h3>
<script>
d3.selectAll("h3").transition().style("color","green").duration(5000);
</script>
</body>
</html>
在這裡,轉換平穩且均勻地發生。我們還可以使用以下方法直接指定 RGB 顏色程式碼值。
d3.selectAll("h3").transition().style("color","rgb(0,150,120)").duration(5000);
現在,每個顏色編號從 0 到 150 緩慢,平滑和均勻地進行。為了從起始幀值到結束幀值精確混合中間幀,D3.js 使用內部插值方法。語法如下 -
d3.interpolate(a, b)
D3 還支援以下插值型別 -
-
interpolateNumber - 支援數值。
-
interpolateRgb - 支援顏色。
-
interpolateString - 支援字串。
D3.js 負責使用適當的插值方法,在高階情況下,我們可以直接使用插值方法來獲得我們想要的結果。如果需要,我們甚至可以建立一個新的插值方法。
delay()
方法
delay()
方法允許在一段時間之後進行轉換。請考慮“transition_delay.html”中的以下程式碼。
<!DOCTYPE html>
<html>
<head>
<script type = "text/javascript" src = "https://d3js.org/d3.v4.min.js"></script>
</head>
<body>
<h3> Simple transitions </h3>
<script>
d3.selectAll("h3").transition()
.style("font-size","28px").delay(2000).duration(2000);
</script>
</body>
</html>
轉換的生命週期
轉換有一個四階段的生命週期 -
- 轉換計劃
- 轉換開始。
- 轉型執行。
- 轉型結束。
讓我們一一詳細地討論這些問題。
轉換計劃
建立轉換時會計劃轉換。當我們呼叫 selection.transition 時,我們是在計劃轉換。這也是當我們呼叫 attr()
,style()
和其他轉換方法來定義結束關鍵幀時。
轉換開始
轉換基於其設定的延遲開始,該延遲是在安排轉換時指定的。如果未指定延遲,則轉換將盡快開始,通常在幾毫秒之後。
如果轉換有延遲,則應僅在轉換開始時設定起始值。我們可以通過偵聽開始事件來做到這一點 -
d3.select("body")
.transition()
.delay(200)
.each("start", function() { d3.select(this).style("color", "green"); })
.style("color", "red");
轉換執行
當轉換執行時,它會以 0 到 1 的轉換值重複呼叫。除了延遲和持續時間之外,轉換還可以輕鬆控制時序。緩和會扭曲時間,例如慢進和慢進。某些緩動函式可能暫時給出 t 大於 1 或小於 0 的值。
轉型結束
轉換結束時間始終精確為 1,因此在轉換結束時準確設定結束值。轉換基於其延遲和持續時間的總和而結束。轉換結束時,將排程 end 事件。