revision:
<div>
<div class="navbar">
<button class="btn">Reset</button>
<input type="color" value="#00eeff" class="color">
<input type="number" value="30" class="size">
</div>
<div class="container"></div>
</div>
<style>
*{margin: 0; padding: 0; box-sizing: border-box;}
html, body{height: 100%;}
.navbar, .container{background-color: rgb(28, 28, 29); width: 40vw;
border-radius: 3px;
}
.navbar{margin-left: 1vw; padding: 0.5vw; margin-bottom: 0.5vw; display: flex;
justify-content: center; align-items: center;}
.btn, input{height: 2vw; padding: 0 1vw;}
.color{padding: 0 .25vw; width: 6vw; margin: 0 1vw;}
.container{margin-left: 1vw; --size: 4; height: 40vw; display: grid;
grid-template-columns: repeat(var(--size), 1fr);grid-template-rows:
repeat(var(--size), 1fr); gap: 0.15vw;padding: 0.1vw;}
.pixel{background-color: grey;border-radius: 0.1vw;}
</style>
<script>
const container = document.querySelector('.container')
const sizeEl = document.querySelector('.size')
let size = sizeEl.value
const color = document.querySelector('.color')
const resetBtn = document.querySelector('.btn')
let draw = false
function populate(size) {
container.style.setProperty('--size', size)
for (let i = 0; i < size * size; i++) {
const div = document.createElement('div')
div.classList.add('pixel')
div.addEventListener('mouseover', function(){
if(!draw) return
div.style.backgroundColor = color.value
})
div.addEventListener('mousedown', function(){
div.style.backgroundColor = color.value
})
container.appendChild(div)
}
}
window.addEventListener("mousedown", function(){
draw = true
})
window.addEventListener("mouseup", function(){
draw = false
})
function reset(){
container.innerHTML = ''
populate(size)
}
resetBtn.addEventListener('click', reset)
sizeEl.addEventListener('keyup', function(){
size = sizeEl.value
reset()
})
populate(size)
</script>
code:
<div style="margin-left: 1vw";>
<h3>choose grid size</h3>
<form id="sizePicker">
grid height:
<input type="number" id="inputHeight" name="height" min="1" value="1">
grid width:
<input type="number" id="inputWidth" name="width" min="1" value="1">
<input type="submit">
</form>
<h3>pick a color</h3>
<input type="color" id="colorPicker">
<h3>design canvas</h2>
<table id="pixelCanvas"></table>
</div>
<style>
h3 { margin: 1vw 0 0.25vw;}
h3:first-of-type {margin-top: 0.5vw;}
table, tr, td {border: 1px solid black;}
table {border-collapse: collapse; margin: 0 auto;}
tr {height: 2vw;}
td {width: 2vw;}
input[type=number]{width: 6vw;}
input[type=color]{width: 6vw;}
</style>
<script>
// Select color input, select size from height & width input, select the table element
var inputColor = document.querySelector('#colorPicker');
var inputWidth = document.querySelector('#inputWidth');
var inputHeight = document.querySelector('#inputHeight');
var pixelCanvas = document.querySelector("#pixelCanvas");
// Add a listener for when users 'submit' each form
// clearGrid function is included to reset table when 'submit' form is submitted
document.addEventListener('submit', function (event) {
event.preventDefault();
var width = inputWidth.value;
var height = inputHeight.value;
clearGrid();
makeGrid(height, width);
});
// Since cells are based off rows, remove the child until there are no rows left
// Output remove all existing children creating blank
function clearGrid(){
while (pixelCanvas.firstChild){
pixelCanvas.removeChild(pixelCanvas.firstChild);
}
}
// When size is submitted by the user, call makeGrid(); this function will create the table
given desired dimentions
// Function also allows user to color each cell given color input
function makeGrid(height, width) {
for (var a = 1; a <= height; a++) {
var tableRow = document.createElement('tr');
pixelCanvas.appendChild(tableRow);
for (var b = 1; b <= width; b++) {
var tableData = document.createElement('td');
tableRow.appendChild(tableData);
tableData.addEventListener('click', function (event) {
var color = inputColor.value;
event.target.style.backgroundColor = color;
});
}
}
}
</script>