I am a beginner in javascript and I have made this project as a part of The odin project. Feautres:
- Draw by hovering the mouse on grid
- Erase
- Clear the entire sketch at once
- Reset the grid size
I have created the grid using only flexbox.
Here is my code:
function createGrid(grid, rowSize, colSize) {
for (let i = 0; i < rowSize; i++) {
grid[i] = document.createElement("div");
grid[i].setAttribute("id", "container");
let pixels = [];
for (let j = 0; j < colSize; j++) {
pixels[j] = document.createElement("div");
pixels[j].setAttribute("id", "pixel");
grid[i].appendChild(pixels[j]);
}
}
return grid;
}
function appendArray(pDiv, cDiv) {
cDiv.forEach((div) => pDiv.appendChild(div));
return pDiv;
}
(() => {
const GRID_WIDTH = 16;
const GRID_HEIGHT = 16;
const sketchEl = document.querySelector("#sketch");
const eraseEl = document.querySelector("#erase");
const buttonsEl = document.querySelector(".buttons");
let gridCont = document.querySelector("#grid-container");
let grid = [];
let state;
grid = createGrid(grid, GRID_WIDTH, GRID_HEIGHT);
gridCont = appendArray(gridCont, grid);
buttonsEl.addEventListener("click", changeState);
gridCont.addEventListener("mouseover", eventHandler, false);
function changeState(event) {
state = event.target.id;
switch (state) {
case "reset":
sketchReset();
break;
case "gridSize":
sizeReset();
}
}
function sketchReset() {
const pixels = document.querySelectorAll("#pixel");
pixels.forEach((pxl) =>
pxl.setAttribute("style", "background-color:'transparent';")
);
}
function sizeReset() {
let size = parseInt(prompt("Enter grid size (MAX=100) : "));
if (size <= 100) {
grid.length = 0;
grid = createGrid(grid, size, size);
gridCont.innerHTML = "";
gridCont = appendArray(gridCont, grid);
}
}
function eventHandler(event) {
if (event.target.id !== "pixel") {
return;
}
changeColor(event);
}
function changeColor(event) {
if (state === "eraser") {
event.target.setAttribute("style", "background-color:'transparent';");
return;
}
event.target.setAttribute("style", "background-color:black;");
}
})();
body {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
#header {
font-size: 2.5em;
}
.flex-container {
display: flex;
gap: 2em;
}
.buttons {
display: flex;
flex-direction: column;
justify-content: center;
gap: 2em;
}
.button {
font-size: x-large;
}
.grid-container {
display: flex;
height: 30em;
width: 30em;
border: 1px solid black;
}
.grid-container > div {
flex: 1;
display: flex;
flex-direction: column;
}
.grid-container > div > * {
flex: 1;
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Etch-a-Sketch</title>
<link rel="stylesheet" href="style.css" />
</head>
<body>
<script src="index.js" defer></script>
<h1 id="header">Etch-a-sketch!</h1>
<div class="flex-container">
<div class="buttons">
<button class="button" id="sketch">Sketch</button>
<button class="button" id="eraser">Erase</button>
<button class="button" id="reset">Reset</button>
<button class="button" id="gridSize">Grid Size</button>
</div>
<div id="grid-container" class="grid-container"></div>
</div>
</body>
</html>