前端前端
fabric
算法
jsBlock
styleBlock
svgBlock
工具其他
Vue、React相关
webgl
GitHub
fabric
算法
jsBlock
styleBlock
svgBlock
工具其他
Vue、React相关
webgl
GitHub
  • 元素操作

    • 元素分组
    • 元素定位
    • 元素层级
    • 元素禁止事件
    • 元素选中样式
  • 变换

    • 变换
  • 图片

    • 图片
    • 背景图
  • 基础图形

    • 三角形
    • 圆形
    • 多边形
    • 折线
    • 椭圆
    • 直线
    • 矩形
    • 路径
  • 序列化和反序列化

    • 反序列化
    • 输出JSON
    • 输出png
    • 输出svg
  • 文本

    • 可编辑文本
    • 多行文本
    • 文本
    • 文本省略
    • 文本边框
  • 源码

    • fabric.Canvas
    • fabric.Circle
    • fabric类的继承体系
  • 画布操作

    • 画布拖动和缩放
    • 画布框选样式
  • 示例

    • fabric-echarts-demo
    • 拓扑图一
    • 拓扑图二

画布拖动和缩放

默认鼠标点击拖动是框选canvas.selection,左右移动有两种方法

1、记录上一次鼠标移动位置, 设置 x:viewportTransform[4] y: viewportTransform[5]

2、canvas.relativePan 相对定位,设置相对上一次的距离,参考元素定位

canvas.off

canvas.on

canvas.clear()

canvas.on('mouse:down', (opt) => {
  let evt = opt.e
  canvas.isDragging = true // isDragging 是自定义的
  canvas.lastPosX = evt.clientX // lastPosX 是自定义的
  canvas.lastPosY = evt.clientY // lastPosY 是自定义的
})

canvas.on('mouse:up', () => {
  // canvas.setViewportTransform(canvas.viewportTransform) // 设置此画布实例的视口转换
  canvas.isDragging = false
})

canvas.on('mouse:move', (opt) => {
  if (canvas.isDragging) {
    let evt = opt.e
    let vpt = canvas.viewportTransform // 聚焦视图的转换
    vpt[4] += evt.clientX - canvas.lastPosX
    vpt[5] += evt.clientY - canvas.lastPosY
    canvas.requestRenderAll()
    canvas.lastPosX = evt.clientX
    canvas.lastPosY = evt.clientY
  }
})

canvas.on('mouse:wheel', (opt) => {
  const delta = opt.e.deltaY // 滚轮,向上滚一下是 -100,向下滚一下是 100
  let zoom = canvas.getZoom() // 获取画布当前缩放值
  zoom *= 0.999 ** delta
  if (zoom > 20) zoom = 20
  if (zoom < 0.01) zoom = 0.01

  // 以左上角为原点
  canvas.setZoom(zoom)

  // 以鼠标所在位置为原点缩放
  // canvas.zoomToPoint(
  //   {
  //     x: opt.e.offsetX,
  //     y: opt.e.offsetY,
  //   },
  //   zoom
  // )
  opt.e.preventDefault()
  opt.e.stopPropagation()
})
let panning = false
canvas.on('mouse:down', (opt) => {
  panning = true
  // canvas.selection = false; // 禁止元素框选
})

canvas.on('mouse:up', () => {
  panning = false
  // canvas.selection = true;
})

canvas.on('mouse:move', (opt) => {
  if (panning && opt && opt.e) {
    const delta = new fabric.Point(opt.e.movementX, opt.e.movementY)
    canvas.relativePan(delta)
  }
})
Edit this page
最近更新:: 2023/12/8 15:37
Contributors: wu.hui
Next
画布框选样式