跳到正文
misoto22 design

图示

DiagramCanvas 图画布

一个能让比它更大的画在里面平移和缩放的框。

来自@misoto22/design/diagrams

什么时候用它

任何超尺寸的图形——一张 SVG、一张图片、一张折不下来的表。它不知道什么是节点,这正是它能复用的原因。

示例

default

Request path4 elements and 3 relationships.EXTERNALBrowserCLOUDCloudFrontCDNSERVICEAPIFastAPIDATAPostgres

4 elements and 3 relationships.

  • Browser (external)
  • CloudFront (cloud) — CDN
  • API (backend) — FastAPI
  • Postgres (database)
  • BrowserCloudFront: HTTPS
  • CloudFrontAPI
  • APIPostgres: SQL

Drag to pan. Plus and minus zoom, zero resets, the arrow keys pan.

说明

一个能让比它更大的画在里面移动的框。

拖拽平移,用控件或者 ⌘/Ctrl 加滚轮缩放,按一个键复位。就这些——它刻意是一个视口而不是一个图编辑器:这里没有任何东西知道什么是节点,所以它对任何超尺寸的图形都成立,一张 SVG、一张图片、一张折不下来的表都行。

这里有三个不那么显然的决定。

不带修饰键的滚轮滚的是页面,不是图。一个把滚轮吞掉的画布是个滚动陷阱:读者一路往下刷文章,撞上这张图,页面就毫无理由地不动了。缩放需要修饰键——那本来也是各处平台通用的缩放手势,而且触控板的捏合发的就是它。

变换加在包裹层上,不加在内容上。子元素保留自己的坐标空间,所以里面的图仍然可以被测量、被导出、被任何遍历它的东西读取。直接缩放子元素会让它内部每一次 getBoundingClientRect 都成为谎言。

键盘优先,这个框本身是真正的 Tab 停靠点。+ / - / 0 和方向键移动视图;框会接收焦点,这些键才按得下去。一个只回应拖拽的画布,是一个有一半读者操作不了的画布。

属性

DiagramCanvas props
属性类型默认值说明
children必填ReactNode
classNamestring
controlsbooleantrue隐藏内置的缩放控件,给自带一套控件的调用方用。
heightstring'24rem'框有多高。CSS 接受的任何写法都行。
labelstring'Diagram canvas'给这个区域命名,供辅助技术使用。
onViewChange(view: CanvasView) => void每次视图变化都会被告知,供缩略图或百分比读数使用。
refRef<DiagramCanvasHandle>

键盘操作

DiagramCanvas keyboard interactions
按键作用
+=以框的中心为原点放大。
-缩小。
0同时把缩放和偏移复位。
平移。按住 Shift 每次走得更远。

无障碍

  • 这个框本身是真正的 Tab 停靠点,键盘控制才按得下去。
  • 不带修饰键的滚轮滚的是页面。缩放需要平台修饰键,所以这个画布永远不会变成文章中间的滚动陷阱。