自建思維導圖的技術方案

最近突發奇想,自己去實現一個思維導圖,因此思考總結了一下基本的技術方案

一、節點

中心主題節點:全框、背景色、字體大、不可為圖片

子主題節點:全框、背景色、字體中等、可以為圖片、鏈接等

正常節點:底線、無背景色、字體中等、可以為圖片、鏈接等

。。。當然不限于這些

二、線

關聯線:每個節點都可以發起描述,虛線,線中間有兩個點,弧線的方向

關聯線:有可能會覆蓋其他的節點和線,由中間兩個調整錨點進行調整

父子線:一級級下來的都是實線鏈接,均為起點到終點的圓弧線

三、上下級描述

所有的節點均可以創建無限的子節點。

中心主題節點 - 子主題節點 - 正常節點 - 正常節點。

任意節點可以新增無數的關聯線,鏈接到任一關聯節點。

四、錨點描述

所有的錨點都在節點右側(后期可以直接切換錨點方向),可以有無數的子節點。

關聯線的錨點在對方節點的方向上。

五、行為描述

所有的節點右側有一個(減號加圈圈)可以收起子節點,收起后顯示子節點數

所有的節點雙擊可以修改內容:圖片和鏈接單擊查看、雙擊修改

直接右鍵菜單有以下選中后的所有操作

所有的節點可以單個選中,選中后:

  1. 按Tab新增子節點在最后一個節點下,并自動聚焦于新的節點內容修改
  2. 按Enter新增兄弟節點在當前節點下,自動頂開下級節點并重繪,并自動聚焦于新的節點內容修改
  3. 按Delete|Backspace 刪除節點以及所有子節點,以及相關的線
  4. 雙擊修改,單擊選中(查看圖片|鏈接)鏈接可以給出提示

節點可以拖動修改位置,拖到哪個節點上即為哪個節點的子節點,所有的子節點跟隨并放置于最后

如果拖到沒有節點的位置,那就變成一個自由主題

所有的節點位置均為計算固定,不能自由拖動,以免造成誤解

所有的關聯線都可以被選中,此時顯示關聯線中間三分之一和三分之二的兩個拖動錨點

六、基本的技術方案

界面分為兩層:

第一層:div + position:relative 定位,將所有的節點擺出來

第二層:canvas|svg,根據所有的節點及邊計算線,然后畫出來

基本數據結構:

// 單個節點數據
item: MindMapItem
    id:UUID(),
    content:String,
    type: ‘text’|‘image’|’link’  // 不僅是類型,同時也是組件,方便以后增加其他的類型進來
    level:Number // 計算值級數,用于標識 主題、子主題等
    children:[MindMapItem];

// 單個關聯線數據
relationLine: RelationLine
    from:Item1.id,
    to:item2.id,
    firstPoint:Position , // 拐彎的第一個點
    secondPoint: Position, // 拐彎的第二個點

// 整體數據
mindmap:[
    items:[MindMapItem]
    relations:[RelationLine]
]

七、難點

  1. 所有的 Item 擺到指定位置沒有什么難度,修改樣式即可
  2. 如何計算一個線的兩個錨點的位置?
  3. 如何根據兩個錨點的位置畫出弧線?
  4. 關聯線的兩個調整錨點如何進行繪制?

八、總結

以上僅為開始做這項工作之前的一些思考,并非完整技術方案,僅作交流討論用。

實際上已經有一些成熟的庫可以調用,例如阿里的 X6圖形庫等。

但不妨礙我思考,畢竟思維導圖的場景不一樣,并不需要大量的軌跡算法。

說不定我自己寫比學其他的庫更快呢??

  • 歡迎關注宮zhong號【思躍喵】與我交流
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容