Некоторые проблемы:
- В комментарии есть новая строка, в которой
element
стоит на отдельной строке.Это вызывает ошибку draw
- локальная функция, поэтому на нее нельзя ссылаться из HTML.Это должна быть глобальная функция. - Ваши квадраты получают последний примененный цвет заливки.Вам нужно начинать каждый новый прямоугольник с
context.beginPath()
, чтобы избежать этого. - ширина и высота указываются в обратном порядке
Затем, когда вы хотите центрировать второй прямоугольник,Вы должны рассчитать, какие соответствующие координаты x и y должны быть основаны на размере обоих прямоугольников.
Вот ваш код с этими исправлениями:
function updateForm(width, height, box) {
"use strict";
var x = 50;
var y = 50;
var canvas = document.createElement("canvas"); //Create a canvas element
//Set canvas width/height
canvas.style.width = "100%";
canvas.style.height = "100%";
// Set canvas drawing area width/height
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
//Position canvas
canvas.style.position = "absolute";
canvas.style.left = 0;
canvas.style.top = 350;
canvas.style.zIndex = 100000;
canvas.style.pointerEvents = "none";
document.body.appendChild(canvas); //Append canvas to body element
var context = canvas.getContext("2d");
//Draw rectangle
context.beginPath();
context.fillStyle = "blue";
console.log('----------------');
console.log(x, y, width*50, height*50);
context.rect(x, y, width*50, height*50);
context.fill();
context.beginPath();
switch (box) {
case 'three-two':
console.log(x+(width-3)*25, y+(height-4)*25, 150, 200);
context.rect(x+(width-3)*25, y+(height-4)*25, 150, 200);
context.fillStyle = "green";
break;
case 'four-six':
context.rect(x+(width-4)*25, y+(height-6)*25, 200, 300);
context.fillStyle = "red";
break;
case 'five-four':
context.rect(x+(width-5)*25, y+(height-4)*25, 250, 200);
context.fillStyle = "orange";
break;
}
context.fill();
}
function draw() {
var width = document.getElementById("wid").value;
var height = document.getElementById("hgt").value;
var box = document.getElementById("boxSize").value;
updateForm(width, height, box);
}
<div class="container">
<form id="areaform">
<label for="wid">Width:</label>
<input id="wid" type="number">
<label for="hgt">Length:</label>
<input id="hgt" type="number">
<label for="boxSize">Box Size</label>
<select id="boxSize" name="boxSize">
<option value="three-two">3x2</option>
<option value="four-six">4x6</option>
<option value="five-four">5x4</option>
</select>
<button onclick="draw()" type="button">Draw Rectangle</button>
</form>
</div>
Я не касался механизма, который вы использовали для создания нового холста, каждый раз, когда пользователь нажимает кнопку, каждый холст перекрывает предыдущий.Имейте в виду, что фон холста прозрачен, поэтому потенциально вы все еще можете видеть части ранее сгенерированной пары прямоугольников рядом с новыми.
Если вы не хотите, чтобы это происходило, просто создайтеодин элемент canvas в статическом HTML, и не генерируйте его динамически.