d3.js 解決——元素覆蓋

元素覆蓋最常見的應該是在氣泡圖中
然而數據的不可控+手勢交互難免會碰到A元素被B元素覆蓋使其無法觸發交互事件;
如下svg中各《circle》都被添加了事件,但因爲最大的circle在最後才生成,從而使其其他元素的交互事件被遮擋

最初遇到這樣的問題時再加上聽說svg不支持浮動之類的說法。就暫時把問題存起來了。

情況一:具有共同parent元素時

更改dom結構
array.sort()相信大家都用過。然而這個就是解決的關鍵;
1.選擇所有circle
var circle = d3.selectAll("circle")

2.circle選擇集就是個數組啦。v4版本好像是對象——circle.updata纔是數組。。記不清了。錯了請忽略
circle.sort(function(a,b){
...
})

這裏擺兩個例子針對不同數據結構的處理demo自行查看源碼

情況二:具有不同parent元素時

一般都是根據數組生成一組元素,如上例子。
然而有時候會使用相同元素表示不同數據的某一屬性;
以一個簡單的例子來說明,這裏有兩類數據。而兩類中分別又各有兩個數值,使用氣泡的形式展示會如何呢;

var data = [{
name:"A",
sizes:[8,13]
},
{
name:"B",
sizes:[24,26]
}];

生成後

而dom結構如下
這裏寫圖片描述
按第一種方法直接排序會如何呢?

貌似完美啊。。。貌似結構也變了
這裏寫圖片描述
那對g元素也排序好不?

真的完美。。。
這裏寫圖片描述
真的完美了嗎?
未知的數據纔是萬惡之源。。比如其實也沒變多少。。。

var data = [{
name:"A",
sizes:[13,24]
},
{
name:"B",
sizes:[8,26]
}];

結果就坑了

這裏寫圖片描述
坑。。。辦法也是有的。
待續

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章