This excellent graphic(由mbostock對南方週末)展示瞭如何使基於預先計算的位置DOM的靜態圖佈局。所有的代碼都在主html文檔上,所以只是「查看源代碼」。
它首先加載數據,然後調用ready
:
queue()
.defer(d3.json, "http://graphics8.nytimes.com/newsgraphics/2013/09/07/director-star-chart/ed9eaa686bc2e11f0657a78d9be292a730c0567a/graph.json")
.defer(d3.json, "http://graphics8.nytimes.com/newsgraphics/2013/09/07/director-star-chart/ed9eaa686bc2e11f0657a78d9be292a730c0567a/layout.json")
.await(ready);
如果你挖的樣子以.json文件裏面,你會得到的,他們會選擇如何捕捉圖形數據的意義。
的ready
處理程序是這樣開始的:
function ready(error, graph, positions) {
force
.nodes(graph.nodes)
.links(graph.links)
.on("tick", ticked)
.start();
if (positions) force.alpha(.0051);
....
你可以看到,它的初始化力佈局並設置其alpha()
一個非常低的數字,信號,佈局基本上解決了。因此,在佈局由於alpha值較低而停止滴答滴答之前,滴答處理程序ticked()
可能只會被調用一次。
但是,還要注意,將alpha設置爲非常低的值是有條件的,具體取決於可用的positions
。因此,如果positions
沒有預先加載,因此將是undefined
,佈局會反覆打勾一段時間,直到它安置在某個位置。這向我暗示,在導出位置的過程中,也使用了呈現此靜態佈局的相同代碼 - 可能帶有一些附加代碼,但未加載計算的positions
。他們真的很聰明(!)。
用於收集和寫入文件位置的代碼看起來並不是本頁面源代碼的一部分,這很合理,但您可以在項目環境中想出一種方法。