Я пытаюсь позволить пользователю нарисовать прямоугольник на изображении, которое находится внутри холста, используя событие mousemove. Это работает просто отлично с этим кодом:
HTML:
<canvas id="canvas"></canvas>
JavaScript:
window.onload = drawCanvas('http://www.therebeldandy.com/wp-content/uploads/2016/09/Menswear-Dog-4.jpg');
var context = canvas.getContext('2d');
function drawCanvas(src) {
var rect = {};
var drag = false;
var img = new Image();
var canvas = document.getElementById('canvas');
img.src = src;
img.addEventListener('load', function () {
canvas.width = img.naturalWidth;
canvas.height = img.naturalHeight;
context.drawImage(img, 0, 0);
}, false);
// Draw user selection
canvas.addEventListener('mousedown', mouseDown, false);
canvas.addEventListener('mouseup', mouseUp, false);
canvas.addEventListener('mousemove', mouseMove, false);
function mouseDown(e) {
rect.startX = e.pageX - this.offsetLeft;
rect.startY = e.pageY - this.offsetTop;
drag = true;
}
function mouseUp() {
drag = false;
}
function mouseMove(e) {
if (drag) {
context.clearRect(0, 0, 500, 500);
context.drawImage(img, 0, 0);
rect.w = (e.pageX - this.offsetLeft) - rect.startX;
rect.h = (e.pageY - this.offsetTop) - rect.startY;
context.lineWidth = 3;
context.strokeStyle = '#df4b26';
context.fillStyle = "rgba(255, 255, 255, .25)";
context.strokeRect(rect.startX, rect.startY, rect.w, rect.h);
context.fillRect(rect.startX, rect.startY, rect.w, rect.h);
console.log(rect.startX, rect.startY, rect.w, rect.h);
}
}
}
Проблема в том, что мне нужно убедиться, что изображение имеет фиксированную ширину, поэтому я использую этот HTML вместо:
<canvas id="canvas" style="max-width: 300px; height: auto;"></canvas>
Простое добавление этого стиля ломает все: я не могу выбрать ту часть изображения, которую хочу больше.
Вот скрипка, которая даст вам лучшее понимание того, чего я пытаюсь достичь: JSFiddle
Есть ли способ заставить эту работу? Я боролся в течение нескольких часов, поэтому любая помощь будет принята с благодарностью.