2013-11-28 23 views
5

我已經創建了一個實時圖表,其中新的數據點不斷被輸入和繪製。使用SVG HTML CSS的高效連續滾動圖表

目前我正在使用requestAnimationFame(),其中我每秒渲染元素的更新位置30次。

對於許多SVG元素,這可能會稍微慢一些。

用SVG動畫,CSS動畫或CSS轉換實現像這樣的連續滾動圖形的最有效方法是什麼? (沒有第三方庫)。

在此先感謝。

+0

你必須展示他們嗎? – agconti

+0

不,最近30秒的窗戶很好。 – klyngbaek

回答

2

這是一個很好的解決方案,在Fiddle

這是來自Mike Bostock和他使用D3的令人敬畏的教程。在該教程中;麥克解釋如何實現從無到有的小提琴,但對你的重要組成部分,是redraw功能:

function redraw() { 

    var rect = chart.selectAll("rect") 
     .data(data, function (d) { 
     return d.time; 
    }); 

    rect.enter().insert("rect", "line") 
     .attr("x", function (d, i) { 
     return x(i + 1) - .5; 
    }) 
     .attr("y", function (d) { 
     return h - y(d.value) - .5; 
    }) 
     .attr("width", w) 
     .attr("height", function (d) { 
     return y(d.value); 
    }) 
     .transition() 
     .duration(1000) 
     .attr("x", function (d, i) { 
     return x(i) - .5; 
    }); 

    rect.transition() 
     .duration(1000) 
     .attr("x", function (d, i) { 
     return x(i) - .5; 
    }); 

    rect.exit().transition() 
     .duration(1000) 
     .attr("x", function (d, i) { 
     return x(i - 1) - .5; 
    }) 
     .remove(); 

} 

它會根據輸入數據添加一個新的矩形和淡入淡出歷史最悠久的矩形,並因此產生所需的滾動行動。這應該很容易適應您的需求,但它確實承擔了一定數量的反應。

看起來您可能希望在您的問題的任何時間在屏幕上擁有無限制的rects,但最終這是不可取的。您可以設置顯示的最大數量的rects,這仍然可以讓您的網站高效運行。再也不會讓你和你的用戶崩潰了。一旦淡出足夠高時,淡入淡出效率比持續加載效率更高。

+0

謝謝,這是一個很好的教程,但我不想使用D3等任何第三方庫。我想知道是什麼讓這樣的動畫更有效率。他們是否使用CSS轉換? – klyngbaek

+1

爲什麼你不想使用第三方庫?這些都可以在純java腳本中完成(這就是庫的工作方式),但是它會花費額外的開發時間來完成它。我建議D3,因爲它做得很好。 – agconti

+0

您可以通過d3項目挖掘並將其用作路線圖,以便在純js中完成此任務。 – agconti