JointJS中文文件
JointJS是一款功能強大的圖形視覺化互動工具,可用來開發流程圖,思維導圖等複雜圖形互動應用
核心概念
-
paper和graph
paper即畫布,圖形將在paper上繪製
graph即圖形資料,可與paper進行繫結,對graph的修改會即時反映到paper上
一個graph可與多個paper繫結 -
cellView和cell
cellView: 檢視元素,是paper的基本元素,用來處理UI互動
cell: 圖形元素,是graph的基本元素,用來儲存圖形元素資料
cellView可以通過.model
屬性獲取它的cell
graph其實就是cell的集合 -
link和element
cell有兩種型別,link是連線,element是節點
他們的檢視元素對應為linkView和elementView -
source和target
即連線的起點和終點
-
port
埠,依附於圖形節點,可以被連線連線
-
座標系統
client – 相對於瀏覽器視窗
page – 相對於body
local – 圖形絕對座標
paper – 圖形畫布座標 (畫布是可以移動的,當畫布移動時paper座標會改變,而local座標不會改變)
The joint namespace
-
joint.dia
模型(類)庫,包含:Paper
Graph
Cell
CellView
Element
Link
等等 -
joint.shapes
圖形元素樣式庫,包含多個分組(basic
standard
custom
…)
以basic為例,其下有Circle
Ellipse
Rect
Text
等多個圖形元素
API
Paper option
例項化引數
new joint.dia.Paper(option)
el: 圖形容器
model: 圖形資料,此處可繫結graph
width: 圖形寬度
height: 圖形高度
drawGrid: 柵格參考線
gridSize: 參考線密度
background: 背景
defaultLink: 預設連線樣式
interactive: 控制元素的互動屬性(例如是否可以移動)
Paper prototype method
paper例項方法
-
findViewByModel(model)
通過model(即cell)尋找到對應的cellView
-
getContentBBox()
獲取paper內圖形實體(不包含空白)的邊界(client座標)
-
getContentArea()
獲取paper內圖形實體(不包含空白)的邊界(local座標)
-
paperToLocalPoint(point) or (x, y)
將paper座標的point轉換成local座標 類似的轉換: `localToPaperPoint` `pageToLocalPoint` 等等
-
paperToLocalRect(rect)
將paper座標的rect轉換成local座標 類似的: `localToPaperRect` `pageToLocalRect` 等等
-
scale(scale) or (sx, sy)
將paper縮放至指定倍數 如果引數為空,將返回paper當前的縮放倍數
-
translate(x, y)
將paper原點移動到指定座標(原點在左上角) 如果引數為空,將返回paper當前的位移
Graph prototype method
graph例項方法
-
addCell(cell)
新增一個元素
-
addCells(cells)
新增一組元素
-
getCell(modelId)
獲取指定id的元素
-
getCells()
獲取所有元素
-
getElements()
獲取所有節點
-
getLinks()
獲取所有連線
-
clear()
清空所有元素
-
getNeighbors(element [, opt])
獲取與某節點相連的所有連線
-
toJSON()
匯出JSON
-
fromJSON(json)
匯入JSON
Cell模型
-
Cell.prototype.define(type [, properties])
定義一個新的圖形元素,或繼承一個已有的元素
// Define a new Ellipse class in `joint.shapes.examples` namespace // Inherits from generic Element class var Ellipse = joint.dia.Element.define(`examples.Ellipse`, { // default attributes markup: [{ tagName: `ellipse`, selector: `ellipse` // not necessary but faster ], attrs: { ellipse: { fill: `white`, stroke: `black`, strokeWidth: 4, refRx: .5, refRy: .5, refCx: .5, refCy: .5 } } }); // Instantiate an element var ellipse = (new Ellipse()).position(100, 100).size(120, 50).addTo(graph); // Define a new ColoredEllipse class // Inherits from Ellipse var ColoredEllipse = Ellipse.define(`examples.ColoredEllipse`, { // overridden Ellipse default attributes // other Ellipse attributes preserved attrs: { ellipse: { fill: `lightgray` } } }, { // prototype properties // accessible on `this.(...)` - as well as, more precisely, `this.prototype.(...)` // useful for custom methods that need access to this instance // shared by all instances of the class randomizeStrokeColor: function() { var randomColor = `#` + (`000000` + Math.floor(Math.random() * 16777215).toString(16)).slice(-6); return this.attr(`ellipse/stroke`, randomColor); } }, { // static properties // accessible on `this.constructor.(...)` // useful for custom methods and constants that do not need an instance to operate // however, a new set of static properties is generated every time the constructor is called // (try to only use static properties if absolutely necessary) createRandom: function() { return (new ColoredEllipse()).randomizeStrokeColor(); } }); // Instantiate an element var coloredEllipse = ColoredEllipse.createRandom().position(300, 100).size(120, 50).addTo(graph);
-
markup
markup(標籤)是用來生成svg元素的模板,可以接收XML標籤或JSON物件
markup: `<rect class="rectangle"/>` markup: [{ tagName: `rect`, selector: `body` }]
-
attrs
attrs(屬性)用來定義svg元素的樣式,通過selector或標籤名查詢對應的元素
attrs: { ellipse: { fill: `lightgray` }, body: { fill: `white` } }
-
Cell.prototype.attr()
設定cell的attrs屬性
-
Cell.prototype.prop()
設定cell的屬性,包括自定義屬性
cell.attr(`body/fill`, `black`) cell.prop(`attrs/body/fill`, `black`) cell.prop(`attrs`, {body: {fill: `black`}}) cell.prop(`custom`, `data`)
-
Cell.prototype.isElement()
判斷元素是否是節點
-
Cell.prototype.isLink()
判斷元素是否是連線
-
Cell.prototype.addTo(graph)
新增到graph
-
Cell.prototype.remove()
移除元素
Element
圖形節點模型,繼承自Cell
-
Element模型示例
{ id: `3d90f661-fe5f-45dc-a938-bca137691eeb`,// Some randomly generated UUID. type: `basic.Rect`, attrs: { `stroke`: `#000` }, position: { x: 0, y: 50 }, angle: 90, size: { width: 100, height: 50 }, z: 2, embeds: [ `0c6bf4f1-d5db-4058-9e85-f2d6c74a7a30`, `cdbfe073-b160-4e8f-a9a0-22853f29cc06` ], parent: `31f348fe-f5c6-4438-964e-9fc9273c02cb` // ... and some other, maybe custom, data properties }
-
Geometry 幾何屬性
-
position
座標,可通過.position()
方法設定 -
angle
旋轉,可通過.rotate()
方法設定 -
size
尺寸,可通過.resize()
方法設定
-
-
Presentation 外觀
-
attrs
同Cell,通過.attr()
方法設定 -
z
層級
-
-
Nesting 巢狀
-
embeds
子節點ids -
parent
父節點id
-
-
Element prototype method
-
getBBox()
獲取節點的bounding box(邊界,rect) -
portProp(portId, path, [value])
設定埠屬性element.portProp(`port-id`, `attrs/circle/fill`, `red`); element.portProp(`port-id`, `attrs/circle/fill`); // `red` element.portProp(`port-id`, `attrs/circle`, { r: 10, stroke: `green` }); element.portProp(`port-id`, `attrs/circle`); // { r: 10, stroke: `green`, fill: `red` }
-
Ports
埠,依附於圖形節點,可以被連線連線
-
Port API on
joint.dia.Element
以下是與port相關的Element的例項方法
hasPort / hasPorts
addPort / addPorts
removePort / removePorts
getPort / getPorts
portProp
getPortPositions
-
Port示例
// Single port definition var port = { // id: `abc`, // generated if `id` value is not present group: `a`, args: {}, // extra arguments for the port layout function, see `layout.Port` section label: { position: { name: `right`, args: { y: 6 } // extra arguments for the label layout function, see `layout.PortLabel` section }, markup: `<text class="label-text" fill="blue"/>` }, attrs: { text: { text: `port1` } }, markup: `<rect width="16" height="16" x="-8" strokegit ="red" fill="gray"/>` }; // a.) add a port in constructor. var rect = new joint.shapes.standard.Rectangle({ position: { x: 50, y: 50 }, size: { width: 90, height: 90 }, ports: { groups: { `a`: {} }, items: [port] } }); // b.) or add a single port using API rect.addPort(port);
-
Port屬性
-
group
類似於css的class,定義一組port的屬性 -
args
佈局引數 -
label
文字
-
Link
圖形連線模型,繼承自Cell
-
Link示例
var link = new joint.dia.Link(); link.source({ id: sourceId }, { anchor: defaultAnchor }); link.target({ id: targetId, port: portId }); link.addTo(graph)
-
Link屬性
-
anchor
錨點,link與element的連線點 -
connectionPoint
檢視鄰接點
例如,當anchor在節點元素中心時,我們並不需要把連線真的畫到中心,而只要連到節點的邊界上即可 -
vertices
連線上的折點 -
connector
線型`normal` - 普通 `jumpover` - 連線交叉時顯示一個bridge `rounded` - 轉折處顯示為圓角 `smooth` - 貝塞爾曲線
-
router
路徑,設定router之後連線不再呈直線連線,而是通過一條設定的路線`normal` - 普通線 `orthogonal` - 基礎版的正交折線 `manhattan` - 優化版的正交折線 `metro` - 另一種正交折線 `oneSide` - 單側正交折線
-
-
Link例項方法
-
source(source [, opt])
設定起點 -
target(target [, opt])
設定終點// opt示例 link.source({ id: sourceId }, {anchor})
-
connector()
設定線型 -
router()
設定路徑 -
vertices()
設定折點
-
事件
Paper
-
pointerclick
點選事件
可以新增字首,以區分不同的點選區域(blank是空白區域):cell:pointerdblclick
link:pointerdblclick
element:pointerdblclick
blank:pointerdblclick
-
pointerdown
滑鼠按下
-
pointermove
滑鼠拖拽
-
pointerup
滑鼠鬆開
-
link:connect
連線連線時觸發
Graph
-
add
新建圖形
-
remove
移除圖形
-
change
圖形屬性改變
change可以新增字尾,以區分不同的屬性改變:change:position
節點位置改變change:vertices
連線折點改變change:custom
節點自定義屬性改變