当前位置:首页 > VUE

vue实现白板

2026-03-07 10:39:20VUE

Vue 实现白板功能

在 Vue 中实现白板功能通常需要结合 HTML5 的 Canvas 或第三方库(如 Fabric.js、Konva.js)来实现绘图功能。以下是几种实现方法:

vue实现白板

使用原生 Canvas

通过 Vue 封装 Canvas 的绘图 API,实现基础的画线、擦除等功能。

vue实现白板

<template>
  <div>
    <canvas 
      ref="canvas"
      @mousedown="startDrawing"
      @mousemove="draw"
      @mouseup="stopDrawing"
      @mouseleave="stopDrawing"
    ></canvas>
  </div>
</template>

<script>
export default {
  data() {
    return {
      isDrawing: false,
      canvas: null,
      ctx: null
    }
  },
  mounted() {
    this.canvas = this.$refs.canvas;
    this.ctx = this.canvas.getContext('2d');
    this.resizeCanvas();
    window.addEventListener('resize', this.resizeCanvas);
  },
  methods: {
    resizeCanvas() {
      this.canvas.width = window.innerWidth;
      this.canvas.height = window.innerHeight;
    },
    startDrawing(e) {
      this.isDrawing = true;
      this.ctx.beginPath();
      this.ctx.moveTo(e.offsetX, e.offsetY);
    },
    draw(e) {
      if (!this.isDrawing) return;
      this.ctx.lineTo(e.offsetX, e.offsetY);
      this.ctx.stroke();
    },
    stopDrawing() {
      this.isDrawing = false;
    }
  },
  beforeDestroy() {
    window.removeEventListener('resize', this.resizeCanvas);
  }
}
</script>

使用 Fabric.js

Fabric.js 是一个功能强大的 Canvas 库,支持对象操作、序列化、事件处理等高级功能。

<template>
  <div>
    <canvas ref="canvas"></canvas>
    <button @click="clearCanvas">清除</button>
  </div>
</template>

<script>
import { fabric } from 'fabric';

export default {
  data() {
    return {
      canvas: null
    }
  },
  mounted() {
    this.canvas = new fabric.Canvas(this.$refs.canvas, {
      isDrawingMode: true
    });
    this.resizeCanvas();
    window.addEventListener('resize', this.resizeCanvas);
  },
  methods: {
    resizeCanvas() {
      this.canvas.setWidth(window.innerWidth);
      this.canvas.setHeight(window.innerHeight);
    },
    clearCanvas() {
      this.canvas.clear();
    }
  },
  beforeDestroy() {
    window.removeEventListener('resize', this.resizeCanvas);
  }
}
</script>

使用 Konva.js

Konva.js 是另一个流行的 2D 绘图库,适合需要复杂交互的场景。

<template>
  <div ref="container"></div>
</template>

<script>
import Konva from 'konva';

export default {
  data() {
    return {
      stage: null,
      layer: null
    }
  },
  mounted() {
    this.stage = new Konva.Stage({
      container: this.$ref.container,
      width: window.innerWidth,
      height: window.innerHeight
    });

    this.layer = new Konva.Layer();
    this.stage.add(this.layer);

    let isDrawing = false;
    let lastLine;

    this.stage.on('mousedown touchstart', (e) => {
      isDrawing = true;
      const pos = this.stage.getPointerPosition();
      lastLine = new Konva.Line({
        stroke: '#df4b26',
        strokeWidth: 5,
        globalCompositeOperation: 'source-over',
        points: [pos.x, pos.y]
      });
      this.layer.add(lastLine);
    });

    this.stage.on('mousemove touchmove', () => {
      if (!isDrawing) return;
      const pos = this.stage.getPointerPosition();
      const newPoints = lastLine.points().concat([pos.x, pos.y]);
      lastLine.points(newPoints);
      this.layer.batchDraw();
    });

    this.stage.on('mouseup touchend', () => {
      isDrawing = false;
    });

    window.addEventListener('resize', this.resizeCanvas);
  },
  methods: {
    resizeCanvas() {
      this.stage.width(window.innerWidth);
      this.stage.height(window.innerHeight);
    }
  },
  beforeDestroy() {
    window.removeEventListener('resize', this.resizeCanvas);
  }
}
</script>

功能扩展建议

  • 撤销/重做:使用数组记录绘图操作,实现历史记录功能
  • 多种工具:添加画笔、形状、文字等不同绘图工具
  • 颜色选择:集成颜色选择器支持多种颜色
  • 保存/加载:使用 canvas.toDataURL() 实现保存为图片,或序列化绘图数据
  • 多人协作:结合 WebSocket 实现实时协作白板

选择哪种方案取决于项目需求复杂度。原生 Canvas 适合简单需求,Fabric.js/Konva.js 更适合需要复杂交互和对象操作的高级白板应用。

标签: 白板vue
分享给朋友:

相关文章

vue里实现增删改查

vue里实现增删改查

在Vue中实现增删改查 数据初始化 在Vue组件的data中定义初始数据和表单绑定的变量: data() { return { items: [ { id: 1, name:…

vue实现弹窗

vue实现弹窗

Vue 实现弹窗的常见方法 使用组件化方式封装弹窗 创建一个独立的弹窗组件(如 Modal.vue),通过 v-if 或 v-show 控制显示隐藏: <template> <…

vue实现选区

vue实现选区

Vue 实现选区的基本方法 在Vue中实现选区功能通常涉及DOM操作和事件处理。以下是几种常见的方法: 使用原生JavaScript的Selection API 通过window.getSelec…

vue 实现闪烁

vue 实现闪烁

Vue 实现闪烁效果的方法 方法一:使用 CSS 动画 在 Vue 组件中定义一个闪烁的 CSS 动画,通过绑定 class 或 style 来控制元素的闪烁效果。 <template>…

vue实现盖章

vue实现盖章

Vue 实现盖章功能 在Vue中实现盖章功能通常涉及前端UI交互,通过Canvas或SVG绘制印章,并允许用户拖拽或点击放置印章。以下是具体实现方法: 使用Canvas绘制印章 通过HTML5的Ca…

vue实现建模

vue实现建模

Vue 实现建模的方法 在 Vue 中实现建模通常涉及数据绑定、组件化和状态管理。以下是几种常见的方法: 数据驱动建模 Vue 的核心是数据驱动视图。通过定义数据模型,Vue 会自动更新 DOM。例…