Build an Amazing Etch-a-Sketch with HTML, CSS, and JavaScript!

Build an Amazing Etch-a-Sketch with HTML, CSS, and JavaScript!

Have you ever wanted to bring the nostalgia of the classic Etch-a-Sketch toy to life on a digital platform? Well, you’re in luck! In this article, we will guide you through the process of creating an interactive Etch-a-Sketch using HTML, CSS, and JavaScript. Strap in, and let’s embark on this creative journey together!

Understanding the Etch-a-Sketch Concept

The Etch-a-Sketch is a mechanical drawing toy that allows users to create images by turning two knobs, one for horizontal movements and the other for vertical movements. To replicate this concept digitally, we will utilize the power of HTML, CSS, and JavaScript to build a virtual Etch-a-Sketch.

Setting Up the HTML Structure

To begin, let’s set up the HTML structure of our Etch-a-Sketch. We will create a container div that holds a grid of individual cells representing the drawing area. Each cell will be an HTML element where the user can interact and create their masterpieces.

Styling the Etch-a-Sketch with CSS

Now that we have the basic structure in place, it’s time to add some style to our Etch-a-Sketch. We can use CSS to define the appearance of the drawing area, knobs, and other elements. Feel free to unleash your creativity here and make it visually appealing.

Implementing JavaScript Functionality

The real magic happens when we implement the JavaScript functionality. We will capture the user’s knob movements and translate them into corresponding actions on the drawing area. By tracking the mouse events and manipulating the CSS properties of the cells, we can create a responsive and interactive experience.

Enhancing the Etch-a-Sketch

Once we have the core functionality working, we can explore additional features to enhance the Etch-a-Sketch experience. For example, we can add options to change the color of the drawing tool, implement an eraser functionality, or even allow users to save and share their artwork.

Conclusion

Congratulations on successfully building your very own Etch-a-Sketch using HTML, CSS, and JavaScript! You’ve learned how to replicate the nostalgic drawing toy on a digital platform and explored various ways to enhance the user experience. Now, it’s time to unleash your creativity and create amazing artworks with your virtual Etch-a-Sketch!

FAQs

  1. Q1. Can I use this Etch-a-Sketch on my website? A1. Absolutely! You can embed the Etch-a-Sketch code into your website and let your visitors enjoy the interactive drawing experience.

    Q2. Is it possible to resize the Etch-a-Sketch drawing area? A2. Yes, you can adjust the size of the drawing area by modifying the CSS properties of the container div.

    Q3. Can I add additional features to the Etch-a-Sketch? A3. Certainly! The basic implementation serves as a starting point, and you can customize it further by adding new functionalities according to your requirements.

    Q4. How can I clear the drawing on the Etch-a-Sketch? A4. You can implement a clear button or shake gesture functionality that resets the drawing area to its initial state.

    Q5. Is it compatible with mobile devices? A5. Yes, with some additional adjustments to make it responsive, you can make the Etch-a-Sketch work seamlessly on mobile devices.

In this article, we explored how to create an Etch-a-Sketch using HTML, CSS, and JavaScript. By following the step-by-step instructions, you now have the knowledge to build your own interactive drawing tool. So, grab your digital knobs and let your imagination run wild with your very own virtual Etch-a-Sketch!

Index.html

				
					<!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">
   <link rel="apple-touch-icon" sizes="180x180" href="/favicon_io/apple-touch-icon.png">
   <link rel="icon" type="image/png" sizes="32x32" href="/favicon_io/favicon-32x32.png">
   <link rel="icon" type="image/png" sizes="16x16" href="/favicon_io/favicon-16x16.png">
   <link rel="manifest" href="/favicon_io/site.webmanifest">
   <!-- Global site tag (gtag.js) - Google Analytics -->
   <script async src="https://www.googletagmanager.com/gtag/js?id=UA-87755577-3"></script>
   <script>
      window.dataLayer = window.dataLayer || [];
      function gtag(){dataLayer.push(arguments);}
      gtag('js', new Date());

      gtag('config', 'UA-87755577-3');
   </script>      
   <title>Etch a Sketch App </title>
   <link rel="stylesheet" href="style.css">
</head>
<body>
   <div id="app">
      <center>
         <div class="container">
            <h1>Simple Etch a Sketch</h1>
            <div id="canvasSize">
               <div class="grid-container">
               </div>
            </div>
            <div class="button-container">
               <button class="btn btn-blue" id="reset">Reset</button>
               <button class="btn btn-blue" id="black">black</button>
               <button class="btn btn-blue" id="rainbow">rainbow</button>
               <input class="btn btn-blue" id="colorPicker" type="color" name="favcolor" value="#ff0000">
               <button class="btn btn-blue" id="eraseBtn">erase</button>
            </div>
         </div>
         </center>
   </div>
   <script src="script.js"></script>
</body>
</html>
				
			

style.css

				
					@font-face{
   font-family: 'pixel-twist';
   src: url('PixelTwist.ttf'); /* IE9 Compat Modes */
   src: url('PixelTwist.ttf') format('embedded-opentype'), /* IE6-IE8 */
         url('PixelTwist.ttf') format('woff'), /* Modern Browsers */
         url('PixelTwist.ttf')  format('truetype'), /* Safari, Android, iOS */
}

h1 {
   font-family: 'pixel-twist', cursive;
   color: red;
   background-color: white;
   width: 512px;
   height: 45px;
   margin-bottom: 5px;
   border-radius: 5px;
   /* text-shadow: 0 0 1px #fff; */
   /* -webkit-text-shadow: 0 0 2px #000; */
}

.grid-container {
   display: grid;
   background-color: #ffffff;
   border-radius: 5px;
   /* grid-template-columns: auto auto auto auto auto auto auto auto auto auto auto auto auto auto auto auto; */
   /* grid-template-rows: auto auto auto auto auto auto auto auto auto auto auto auto auto auto auto auto; */
   /*/
   /* grid-gap: 10px; */
   /* background-color: #2196F3; */
   /* padding: 10px; */
   /* margin: 10px; */
}

.container {
   /* height: 720px; */
   width: 100%;
}

.btn {
   background-color: #2196F3; /* Green */
   border: none;
   color: white;
   /* padding: 16px 32px; */
   padding: auto;
   text-align: center;
   text-decoration: none;
   display: inline-block;
   font-size: 16px;
   margin: 4px 2px;
   -webkit-transition-duration: 0.4s; /* Safari */
   transition-duration: 0.4s;
   cursor: pointer;
   border-radius: 3px;
}

.btn-blue {
   background-color: white; 
   color: black; 
   /* border: 5px solid #2196F3; */
}

.btn-blue:hover {
   /* background-color: #2196F3; */
   color: white;
}

#colorPicker {
   width: 40px;
   height: 18px;
}

/* .grid-container > div { */
   /* display: block;
   height: 5.02px; */
   /* background-color: #ffffff; */
   /* text-align: center;
   width: 32px;
   height: 32px;
   padding: 0;
   margin: 0; */
   /* padding: 20px 0; */
   /* font-size: 30px; */
/* } */

body {
   -webkit-touch-callout: none;
   -webkit-user-select: none;
   -khtml-user-select: none;
   -moz-user-select: none;
   -ms-user-select: none;
   user-select: none;
}

#app { 
   height: 100%;
   width: 100%;
   left:0;
   right: 0;
   top: 0;
   bottom: 0;
   position: absolute;
   background: linear-gradient(124deg, #ff2400, #e81d1d, #e8b71d, #e3e81d, #1de840, #1ddde8, #2b1de8, #dd00f3, #dd00f3);
   background-size: 1800% 1800%;
   -webkit-animation: rainbow 18s ease infinite;
   -z-animation: rainbow 18s ease infinite;
   -o-animation: rainbow 18s ease infinite;
   animation: rainbow 18s ease infinite;}

@-webkit-keyframes rainbow {
   0%{background-position:0% 82%}
   50%{background-position:100% 19%}
   100%{background-position:0% 82%}
}
@-moz-keyframes rainbow {
   0%{background-position:0% 82%}
   50%{background-position:100% 19%}
   100%{background-position:0% 82%}
}
@-o-keyframes rainbow {
   0%{background-position:0% 82%}
   50%{background-position:100% 19%}
   100%{background-position:0% 82%}
}
@keyframes rainbow { 
   0%{background-position:0% 82%}
   50%{background-position:100% 19%}
   100%{background-position:0% 82%}
}

				
			

main.js

				
					let dimension = prompt('Masukkan ukuran grid(ex .16) :', 16);

/* NOTE creating grid element */
let grid_container = document.querySelector('.grid-container');

let gridHeight = 502/dimension;
grid_container.setAttribute('style', `display: grid;grid-template-columns: repeat(${dimension}, 1fr);grid-template-rows: repeat(${dimension}, 1fr);`)

/* NOTE Creating canvas with dimention */
for (let i = 0; i < Math.pow(dimension, 2); i++) {
   let grid = document.createElement('div');
   grid.setAttribute('style', `display: block; height: ${gridHeight}px; opacity: 0;`)
   grid_container.appendChild(grid);
}

let color = '#000000';
let type = 'single';
let opacity_first = 0.1;

document.querySelector('#eraseBtn').addEventListener('click', function (e) {
   type = 'single'
   color = 'ffffff'
   opacity_first = 0;
})

let colorPicker = document.querySelector('#colorPicker');

colorPicker.addEventListener('focusout', (e) => {
   type = 'single';
   color = colorPicker.value;
   opacity_first = 0.1;
})

document.querySelector('#black').addEventListener('click', (e) => {
   type = 'single';
   color = 'black';
   opacity_first = 0.1;
})

document.querySelector('#rainbow').addEventListener('click', (e) => {
   type = 'rainbow';
   color = 'black';
   opacity_first = 0.1;
})

/* NOTE Create canvas */
document.querySelector('#canvasSize').setAttribute('style', 'width: 512px; height: 512px;')

/* NOTE Function reset */
document.querySelector('#reset').addEventListener('click', function(e){
   return confirm('Sure reset?') ? location.reload() : '';
})

/* NOTE get all grids in html */
let grids = document.querySelectorAll('.grid-container > div');

/* NOTE adding event to all selected */
grids.forEach(function(grid) {         

   // let color = getRandomColor();
   
   /* NOTE Event when mouse click */
   grid.addEventListener('click', function (e) {
      paintGrid(grid, color, type, opacity_first);
   });

   /* NOTE Event mouseover like hover */
   grid.addEventListener('mouseover', function(e) {
      /* NOTE if button using left click */
      if (e.buttons === 1) {
         paintGrid(grid, color, type, opacity_first);
      }
   });
})

/* NOTE Create function for change grid color */
function changeGrid(grid, color = '#000000', opacity){
   if (opacity === 0) {
      let style = getComputedStyle(grid);
      let opacity = parseFloat(style.opacity);
      // let display = style.
      opacity = parseFloat(0);
      grid.setAttribute('style', `display: block; background-color: ${color}; height: ${gridHeight}px; opacity: ` + opacity);
      // element.style.cssText = "background-color: black";
   } else {
      let style = getComputedStyle(grid);
      let opacity = parseFloat(style.opacity);
      // let display = style.
      opacity += parseFloat(0.1);
      grid.setAttribute('style', `display: block; background-color: ${color}; height: ${gridHeight}px; opacity: ` + opacity);
      // element.style.cssText = "background-color: black";
   }
}

function getRandomColor(){
   let latters = '0123456789ABCDEF';
   let color = '#';
   for (let i = 0; i < 6; i++){
      color += latters[Math.floor(Math.random() * 16)]
   }
   return color;
}

function paintGrid(grid, color, type, opacity){

   if (type == 'rainbow') {
      let warna = getRandomColor();
      changeGrid(grid, warna, opacity);
   } else {
      changeGrid(grid, color, opacity);
   }

}
				
			

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top