思維導(dǎo)圖控件開發(fā)-技術(shù)選擇-七種武器(1)之SVG

技術(shù)選型

在開發(fā)思維導(dǎo)圖庫blink-mind-react過程中,實現(xiàn)思維導(dǎo)圖中節(jié)點(NodeWidget)之間的連接線(Link)的技術(shù)選擇挣惰,有兩種:

  1. 使用canvas api繪制
  2. 使用SVG元素

因為思維導(dǎo)圖的布局方式我選用的是Flex 布局兄一,SVG元素可以像操作普通DOM 節(jié)點一樣進行操作,使用SVG 方案的話弥臼,可以把每兩個NodeWidget之間Link單獨用一個SVG元素來表示,一個NodeWidget有多少個子元素凰棉,這個NodeWidget的children中就包含多少個用SVG表示的Link供屉。將一條連接線封裝成一個組件叫做LinkWidget。這樣在布局Link的過程中呵萨,只需要關(guān)注和這個LinkWidget有關(guān)聯(lián)的兩個NodeWidget的位置以及位置的變化奏属。

而如果選用canvas方案的話,

  1. 將整個思維導(dǎo)圖中所有的Link 繪制到同一個canvas上
  2. 亦或者是把一個節(jié)點和其所有子節(jié)點的Link繪制在同一個canvas上

這兩種方法都會導(dǎo)致繪制Link時要關(guān)注的NodeWidget位置變化多于兩個潮峦,布局算法的復(fù)雜程度要高于SVG 方案囱皿。

基于以上考慮,在我的開發(fā)過程中忱嘹,使用SVG方案嘱腥。

需求分析

具體的需求如下:

思維導(dǎo)圖的布局方式可以進行配置,要能夠支持單側(cè)布局拘悦,雙側(cè)布局齿兔。思維導(dǎo)圖的布局方向需要支持上下左右四個方向,其中單側(cè)布局础米,這四個方向都要支持分苇。 而雙側(cè)布局,需要支持左右方向屁桑,和上下方向医寿。

舉個栗子,下圖是市面上一個軟件里面支持的幾種布局方式蘑斧,它的單向布局只支持三個方向糟红,朝左,朝右乌叶,朝下盆偿,雙向布局只支持左右。

image

實現(xiàn)思路

具體的代碼詳見LinkWidget.tsx

簡單實現(xiàn)的思路

首先將問題簡單化一點准浴,實現(xiàn)單向布局中朝右布局

如圖所示:

image

DOM 結(jié)構(gòu)如下

image

用于繪制Link的SVG元素放置在class='bm-link'的div元素下事扭,而對于同一個節(jié)點下的bm-link元素,其position都設(shè)置為absolute,left 和 top 都設(shè)置為0乐横。通俗來講求橄,就是bm-link和bm-children的BoundingRect是相同的今野。

image

單個link的SVG 內(nèi)容:

image

SVG 里面的path 元素是可以通過計算算出的。怎么算呢罐农?假設(shè)這個Link的From NodeWidget的key 是fromNodeKey,
To NodeWidget的key 是 toNodeKey, 通過這兩個key 就可以通過DOM的api 拿到這兩個NodeWidget的BoundingRect条霜,
根據(jù)這兩個BoundingRect還有SVG 元素本身的坐標系,即可算出Link的路徑涵亏。具體的計算過程可以參見這個庫里面的LinkWidget組件的代碼宰睡。在這里就不貼具體代碼了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末气筋,一起剝皮案震驚了整個濱河市拆内,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌宠默,老刑警劉巖麸恍,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異搀矫,居然都是意外死亡抹沪,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門瓤球,熙熙樓的掌柜王于貴愁眉苦臉地迎上來采够,“玉大人,你說我怎么就攤上這事冰垄〉虐” “怎么了?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵虹茶,是天一觀的道長逝薪。 經(jīng)常有香客問我,道長蝴罪,這世上最難降的妖魔是什么董济? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮要门,結(jié)果婚禮上虏肾,老公的妹妹穿的比我還像新娘。我一直安慰自己欢搜,他們只是感情好封豪,可當我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著炒瘟,像睡著了一般吹埠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天缘琅,我揣著相機與錄音粘都,去河邊找鬼。 笑死刷袍,一個胖子當著我的面吹牛翩隧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播呻纹,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼堆生,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了居暖?” 一聲冷哼從身側(cè)響起顽频,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤藤肢,失蹤者是張志新(化名)和其女友劉穎太闺,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嘁圈,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡省骂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了最住。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钞澳。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖涨缚,靈堂內(nèi)的尸體忽然破棺而出轧粟,到底是詐尸還是另有隱情,我是刑警寧澤脓魏,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布兰吟,位于F島的核電站,受9級特大地震影響茂翔,放射性物質(zhì)發(fā)生泄漏混蔼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一珊燎、第九天 我趴在偏房一處隱蔽的房頂上張望惭嚣。 院中可真熱鬧,春花似錦悔政、人聲如沸晚吞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽载矿。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間闷盔,已是汗流浹背弯洗。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留逢勾,地道東北人牡整。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像溺拱,于是被迫代替她去往敵國和親逃贝。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 問答題1 /72瀏覽器頁面有哪三層構(gòu)成迫摔,分別是什么沐扳,作用是什么?參考答案構(gòu)成:結(jié)構(gòu)層、表示層句占、行為層分別是:HTM...
    _Yfling閱讀 1,218評論 0 23
  • 前些日子在忙著面試沪摄,拿了心儀的 offer 以后閑下來整理了一些面試相關(guān)的基本概念。由于很多關(guān)于代碼細節(jié)的東西之前...
    faremax閱讀 1,401評論 0 4
  • ¥開啟¥ 【iAPP實現(xiàn)進入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程纱烘,因...
    小菜c閱讀 6,426評論 0 17
  • 第一章 HTML5 (2014年10月29日發(fā)布)新特性: 10個 (1)新的語義標簽 (2)增強型表單 (3)視...
    fastwe閱讀 961評論 0 1
  • 第一期:繪制優(yōu)秀思維導(dǎo)圖的原則 在序言中我們已經(jīng)講到了思維導(dǎo)圖的幾個基本特征: *注意的焦點清晰地集中在中央圖形上...
    全然_50bb閱讀 4,119評論 0 5