使用 konva 实现一个设计器交互,首先考虑实现设计器的画布。
一个基本的画布:
【展示】网格、比例尺
【交互】拖拽、缩放
“拖拽”是无尽的,“缩放”是基于鼠标焦点的。
最终效果(示例地址):
基本思路:
设计区域 HTML 由两个节点构成,内层挂载一个 Konva.stage 作为画布的开始。
<template>
<div class="page">
<header></header>
<section>
<header></header>
<section ref="boardElement">
<div ref="stageElement"></div>
</section>
<footer></footer>
</section>
<footer></footer>
</div>
</template>
Konva.stage 暂时先设计3个 Konva.Layer,分别用于绘制背景、所有素材、比例尺。
通过 ResizeObserver 使 Konva.stage 的大小与外层 boardElement 保持一致。
为了显示“比例尺” Konva.stage 默认会偏移一些距离,这里定义“比例尺”尺寸为 40px。
this.stage = new Konva.Stage({
container: stageEle,
x: this.rulerSize,
y: this.rulerSize,
width: config.width,
height: config.height
})
关于“网格背景”,是按照当前设计区域大小、缩放大小、偏移量,计算横向、纵向分别需要绘制多少条 Konva.Line(横向、纵向分别多加1条),同时根据 Konva.stage 的 x,y 进行偏移,用有限的 Konva.Line 模拟无限的网格画布。
// 格子大小
const cellSize = this