Реализация рисования мышью на HTML5 Canvas с JS

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для создания рисунков с помощью мыши непосредственно на "холсте" (canvas) необходимо ввести несколько строчек JavaScript кода. Вначале подготовьте сам элемент канваса:

HTML
Скопировать код
<canvas id="drawCanvas" width="300" height="300"></canvas>

Затем задайте обработчики событий для мыши:

JS
Скопировать код
const canvas = document.getElementById('drawCanvas');
const ctx = canvas.getContext('2d');
let isDrawing = false;

canvas.onmousedown = ({offsetX, offsetY}) => {
    isDrawing = true;
    ctx.beginPath();
    ctx.moveTo(offsetX, offsetY);
};

canvas.onmousemove = ({offsetX, offsetY}) => {
    if (isDrawing) {
        ctx.lineTo(offsetX, offsetY);
        ctx.stroke();
    }
};

canvas.onmouseup = () => {
    isDrawing = false;
};

Нажмите и перемещайте мышь по канвасу, наблюдая за тем, как рисунок преобразуется. Чтобы сделать рисунок еще более детализированным, настройте свойства ctx.lineWidth и ctx.strokeStyle.

Кинга Идем в IT: пошаговый план для смены профессии

Улучшаем инструменты для рисования

Совершенствуйте инструмент для рисования, дополняя его новыми возможностями и улучшениями.

Добавляем настройки по выбору

Вставьте выбор цвета и регулировку толщины линии:

HTML
Скопировать код
<label>Выберите цвет: <input type="color" id="colorPicker" value="#000000"></label>
<label>Настройте ширину линии: <input type="number" id="lineWidth" min="1" value="1"></label>

Синхронизируйте цвет и толщину линии с выбранными параметрами:

JS
Скопировать код
const colorPicker = document.getElementById('colorPicker');
const lineWidth = document.getElementById('lineWidth');
ctx.strokeStyle = colorPicker.value;
ctx.lineWidth = lineWidth.value;

colorPicker.addEventListener('change', () => ctx.strokeStyle = colorPicker.value);
lineWidth.addEventListener('change', () => ctx.lineWidth = lineWidth.value);

Сохраняем результат

Добавим кнопку для сохранения созданного рисунка:

HTML
Скопировать код
<button id="saveBtn">Сохранить свой шедевр 🏛️</button>

Инициируйте сохранение при нажатии на созданную кнопку:

JS
Скопировать код
document.getElementById('saveBtn').addEventListener('click', () => {
    const dataURL = canvas.toDataURL('image/png');
    const a = document.createElement('a');
    a.href = dataURL;
    a.download = 'canvas-masterpiece.png';
    a.click();
});

Вносим исправления и корректировки

Добавим функцию исправления ошибок с помощью стирки:

HTML
Скопировать код
<button id="eraserBtn">Забудем, что это было 🧽</button>

При включении режима стирания переключайтесь на прозрачный цвет или на цвет фона:

JS
Скопировать код
document.getElementById('eraserBtn').addEventListener('click', () => {
    ctx.globalCompositeOperation = 'destination-out';
    ctx.lineWidth = 10;
});

Не забывайте возвращать стандартные настройки после работы стирки:

JS
Скопировать код
colorPicker.addEventListener('change', () => {
    ctx.globalCompositeOperation = 'source-over';
    ctx.strokeStyle = colorPicker.value;
});

Визуализация

Представим наглядно процесс рисования на HTML5 Canvas с помощью символики Emoji:

Markdown
Скопировать код
Холст ➡️ [🎨]
Движение мыши ➡️ [🐭🖌️]
Активность рисования  ➡️ [👨‍🎨]

Воспринимайте мышь как свой цифровой кистью:

Markdown
Скопировать код
Нажатие кнопки [🐭🖌️]: Начинаем рисование 
Перемещение [🖌️➡️🖼️]: Продолжаем набросок  
Отпускание кнопки [✋]: Завершаем процесс рисования

Наслаждайтесь процессом создания искусства:

Markdown
Скопировать код
Перед началом: [Чистый лист 🕳️]
Во время рисования: [Наносим рисунок 🌈🖌️]
После завершения: [Готовое произведение 🖼️✨]

Основы объектно-ориентированного программирования: Упакуем ваш код в класс

Каждое действие — это роль, а исполнителем становится класс SignTool:

JS
Скопировать код
class SignTool {
    constructor(canvasId, options) {
        this.canvas = document.getElementById(canvasId);
        this.ctx = this.canvas.getContext('2d');
        this.setOptions(options);
        this.attachEventListeners();
    }
    // ...дальнейшие разработки
}

Создавайте масштабируемые приложения, которые умеют подстраиваться под любые экраны:

JS
Скопировать код
resizeCanvas() {
    this.canvas.width = window.innerWidth;
    this.canvas.height = window.innerHeight;
    this.ctx.strokeStyle = this.options.color;
    this.ctx.lineWidth = this.options.lineWidth;
}

Овладейте ctx.lineJoin и ctx.lineCap для создания более плавных линий. Пробуйте ctx.createPattern() и ctx.createLinearGradient(), чтобы придать изображению атмосферу. Если вы готовы к большему, воспользуйтесь pressure.js, чтобы имитировать давление кисти при рисовании.

Полезные материалы

  1. MouseEvent – Веб-API | MDN – документация по работе с мышью.
  2. Руководство по работе с линиями в HTML5 Canvas – создание уникальных линий на канвасе.
  3. CanvasRenderingContext2D – Веб-API | MDN – справочник API для рисования в 2D.
  4. Сенсорные события – Веб-API | MDN – руководство по сенсорным событиям для мобильных устройств.
  5. Руководство по работе с HTML5 Canvas: Введение — SitePoint – основы работы с Canvas для начинающих.