当前位置:首页 > JavaScript

js实现白版

2026-02-01 03:51:28JavaScript

实现白板的基本思路

使用HTML5的Canvas元素结合JavaScript可以轻松实现一个简单的白板功能。Canvas提供了丰富的绘图API,能够满足基本的绘图需求。

基础代码结构

HTML部分需要包含一个Canvas元素:

<canvas id="whiteboard" width="800" height="600"></canvas>

JavaScript部分需要获取Canvas元素并设置绘图上下文:

const canvas = document.getElementById('whiteboard');
const ctx = canvas.getContext('2d');

实现绘图功能

监听鼠标事件来实现绘图功能。需要处理mousedown、mousemove和mouseup事件:

let isDrawing = false;
let lastX = 0;
let lastY = 0;

canvas.addEventListener('mousedown', (e) => {
    isDrawing = true;
    [lastX, lastY] = [e.offsetX, e.offsetY];
});

canvas.addEventListener('mousemove', (e) => {
    if (!isDrawing) return;
    ctx.beginPath();
    ctx.moveTo(lastX, lastY);
    ctx.lineTo(e.offsetX, e.offsetY);
    ctx.stroke();
    [lastX, lastY] = [e.offsetX, e.offsetY];
});

canvas.addEventListener('mouseup', () => isDrawing = false);
canvas.addEventListener('mouseout', () => isDrawing = false);

添加绘图工具

可以扩展功能,添加不同的绘图工具如画笔、橡皮擦等:

let currentTool = 'pen';

function setTool(tool) {
    currentTool = tool;
}

canvas.addEventListener('mousemove', (e) => {
    if (!isDrawing) return;
    if (currentTool === 'pen') {
        ctx.strokeStyle = '#000000';
        ctx.lineWidth = 2;
        ctx.beginPath();
        ctx.moveTo(lastX, lastY);
        ctx.lineTo(e.offsetX, e.offsetY);
        ctx.stroke();
    } else if (currentTool === 'eraser') {
        ctx.strokeStyle = '#ffffff';
        ctx.lineWidth = 10;
        ctx.beginPath();
        ctx.moveTo(lastX, lastY);
        ctx.lineTo(e.offsetX, e.offsetY);
        ctx.stroke();
    }
    [lastX, lastY] = [e.offsetX, e.offsetY];
});

实现颜色选择

添加颜色选择功能可以让用户自定义画笔颜色:

let currentColor = '#000000';

function setColor(color) {
    currentColor = color;
    ctx.strokeStyle = currentColor;
}

// 在绘图逻辑中使用currentColor
ctx.strokeStyle = currentColor;

实现线条粗细调整

允许用户调整线条的粗细:

let lineWidth = 2;

function setLineWidth(width) {
    lineWidth = width;
    ctx.lineWidth = lineWidth;
}

// 在绘图逻辑中使用lineWidth
ctx.lineWidth = lineWidth;

实现清除画布功能

添加一个清除画布的按钮:

function clearCanvas() {
    ctx.clearRect(0, 0, canvas.width, canvas.height);
}

实现保存功能

可以将画布内容保存为图片:

function saveCanvas() {
    const link = document.createElement('a');
    link.download = 'drawing.png';
    link.href = canvas.toDataURL('image/png');
    link.click();
}

完整示例代码

将上述功能整合在一起的完整示例:

<!DOCTYPE html>
<html>
<head>
    <title>Whiteboard</title>
    <style>
        #whiteboard {
            border: 1px solid #000;
        }
        .tools {
            margin-bottom: 10px;
        }
    </style>
</head>
<body>
    <div class="tools">
        <button onclick="setTool('pen')">Pen</button>
        <button onclick="setTool('eraser')">Eraser</button>
        <input type="color" onchange="setColor(this.value)">
        <input type="range" min="1" max="20" value="2" onchange="setLineWidth(this.value)">
        <button onclick="clearCanvas()">Clear</button>
        <button onclick="saveCanvas()">Save</button>
    </div>
    <canvas id="whiteboard" width="800" height="600"></canvas>
    <script>
        const canvas = document.getElementById('whiteboard');
        const ctx = canvas.getContext('2d');
        let isDrawing = false;
        let lastX = 0;
        let lastY = 0;
        let currentTool = 'pen';
        let currentColor = '#000000';
        let lineWidth = 2;

        function setTool(tool) {
            currentTool = tool;
        }

        function setColor(color) {
            currentColor = color;
        }

        function setLineWidth(width) {
            lineWidth = width;
        }

        function clearCanvas() {
            ctx.clearRect(0, 0, canvas.width, canvas.height);
        }

        function saveCanvas() {
            const link = document.createElement('a');
            link.download = 'drawing.png';
            link.href = canvas.toDataURL('image/png');
            link.click();
        }

        canvas.addEventListener('mousedown', (e) => {
            isDrawing = true;
            [lastX, lastY] = [e.offsetX, e.offsetY];
        });

        canvas.addEventListener('mousemove', (e) => {
            if (!isDrawing) return;
            if (currentTool === 'pen') {
                ctx.strokeStyle = currentColor;
                ctx.lineWidth = lineWidth;
                ctx.beginPath();
                ctx.moveTo(lastX, lastY);
                ctx.lineTo(e.offsetX, e.offsetY);
                ctx.stroke();
            } else if (currentTool === 'eraser') {
                ctx.strokeStyle = '#ffffff';
                ctx.lineWidth = lineWidth * 2;
                ctx.beginPath();
                ctx.moveTo(lastX, lastY);
                ctx.lineTo(e.offsetX, e.offsetY);
                ctx.stroke();
            }
            [lastX, lastY] = [e.offsetX, e.offsetY];
        });

        canvas.addEventListener('mouseup', () => isDrawing = false);
        canvas.addEventListener('mouseout', () => isDrawing = false);
    </script>
</body>
</html>

进阶功能建议

对于更复杂的白板应用,可以考虑添加以下功能:

  • 撤销/重做功能
  • 多用户协作
  • 图形绘制(矩形、圆形等)
  • 文字输入
  • 画布缩放和平移

这些功能需要更复杂的实现,但基于上述基础代码可以逐步扩展。

js实现白版

标签: 白版js
分享给朋友:

相关文章

css3结合js制作

css3结合js制作

CSS3 结合 JavaScript 制作动态效果 CSS3 和 JavaScript 结合可以实现丰富的动态效果,包括动画、交互和响应式设计。以下是几种常见的实现方式: CSS3 动画与 Jav…

js实现vue

js实现vue

Vue.js 简介 Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。其核心库专注于视图层,易于与其他库或现有项目整合。 实现 Vue.js 的基本步骤 安装 Vue.…

js实现计算器

js实现计算器

实现基础计算器功能 使用JavaScript创建一个基础计算器需要处理数字输入、运算符逻辑和结果显示。以下是一个简单的实现示例: let currentInput = '0'; let previ…

js实现图片轮播

js实现图片轮播

实现基础图片轮播 使用HTML、CSS和JavaScript创建一个简单的图片轮播。HTML部分定义轮播容器和图片,CSS设置样式和动画效果,JavaScript处理轮播逻辑。 <div c…

js如何实现继承

js如何实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例能够访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Paren…

js 实现分页

js 实现分页

实现分页的基本逻辑 分页功能通常需要后端返回数据总量或总页数,前端根据当前页码和每页条数截取对应数据。以下是一个基于JavaScript的简单分页实现方案: 前端分页实现 假设已有从后端获取的完整数…