Reactive Dot Grid - Canvas
How do I make an reactive dot grid - canvas?
Just some more canvas tomfoolery.. What is a reactive dot grid - canvas? How do you make a reactive dot grid - canvas? This script and codes were developed by Kyle Brumm on 07 January 2023, Saturday.
Reactive Dot Grid - Canvas - Script Codes HTML Codes
<!DOCTYPE html>
<html >
<head> <meta charset="UTF-8"> <title>Reactive Dot Grid - Canvas</title> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/normalize/5.0.0/normalize.min.css"> <link rel="stylesheet" href="css/style.css">
</head>
<body> <canvas id="canvas"></canvas> <script src="js/index.js"></script>
</body>
</html>
Reactive Dot Grid - Canvas - Script Codes CSS Codes
body { overflow: hidden; cursor: none;
}
Reactive Dot Grid - Canvas - Script Codes JS Codes
// Canvas
const c = document.getElementById('canvas');
const ctx = c.getContext('2d');
// Variables
let [cw, ch] = [window.innerWidth, window.innerHeight];
let [lastX, lastY] = [null, null];
let dots = [];
let resizeTimer;
// Settings
let [DOT_SMALL, DOT_LARGE] = [1, 20];
const HOVER_RADIUS = 60;
const DOT_DECAY = 0.15;
let [NUM_ROWS, NUM_COLS] = [Math.ceil(ch/DOT_LARGE), Math.ceil(cw/DOT_LARGE)];
let NUM_DOTS = NUM_ROWS*NUM_COLS;
// requestAnimationFrame fallback
window.requestAnimFrame = (function() { return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.msRequestAnimationFrame || function( callback ){ window.setTimeout(callback, 1000 / 60); };
})();
//--------------------------------------------------------------------
// Create a new dot
function Dot(radius, x, y, hue) {
this.radius = radius;
this.x = x;
this.y = y;
this.hue = hue; this.inHoverRadius = false;
}
// Update a dot
Dot.prototype.update = function() { // Draw the dot
ctx.beginPath();
ctx.arc( this.x, this.y, this.radius, 0, Math.PI * 2, false );
ctx.closePath();
// Style it up
ctx.fillStyle = `hsla(${this.hue}, 100%, 50%, 1)`;
ctx.fill(); // Check the mouses proximity this.checkProximity(); // Decay the radius this.decayRadius();
};
// Check the dots proximity
Dot.prototype.checkProximity = function() { let dist = DOT_SMALL; // Check if the mouse is on the canvas if (lastX && lastY) { // Get proximity let dX = this.x - lastX; let dY = this.y - lastY; dist = Math.sqrt(Math.pow(dX, 2) + Math.pow(dY, 2)); // Update dot radius if (dist >= HOVER_RADIUS) { this.radius = this.radius; this.inHoverRadius = false; } else { // this.radius = DOT_SMALL/2 + ((DOT_LARGE*2) - (DOT_LARGE*(dist/100))); // this.radius = DOT_SMALL/2 + (DOT_LARGE*((HOVER_RADIUS-dist)/10)); // this.radius = DOT_SMALL/2 + (DOT_LARGE - (DOT_LARGE*dist/HOVER_RADIUS)); this.radius = DOT_SMALL/2 + (DOT_LARGE*2 - (DOT_LARGE*dist/HOVER_RADIUS)); this.inHoverRadius = true; } } else { this.inHoverRadius = false; }
}
// Check the dots radius decay
Dot.prototype.decayRadius = function() { if (!this.inHoverRadius && this.radius > DOT_SMALL) { this.radius = this.radius - DOT_DECAY; }
}
// Add a new dot
function addDot(radius, x, y, hue) { radius = radius || DOT_SMALL/2; x = x; y = y;
hue = hue || Math.floor(Math.random() * (360 - 1 + 1)) + 1; // Create the new dot let dot = new Dot(radius, x, y, hue); // Add the dot to the array dots.push(dot);
}
// Add our initial dots
function init() { dots = []; // Add the dots for (let row = DOT_LARGE; row <= ch; row += DOT_LARGE*2) { for (let col = DOT_LARGE; col <= cw; col += DOT_LARGE*2) { addDot(DOT_SMALL, col, row); } } draw();
}
// Clear the canvas and draw the new frame
function draw() {
ctx.clearRect(0, 0, cw, ch); // Update the dots for (let i = 0; i < dots.length; i++) {
dots[i].update();
} // Add helper text // ctx.fillStyle = 'black'; // ctx.textAlign='center'; // ctx.font = '12px Arial'; // ctx.fillText('Move you mouse around and watch the dots change.', (cw / 2), 15); requestAnimFrame(draw);
}
// Update the size of the canvas
function resizeCanvas() { [cw, ch] = [window.innerWidth, window.innerHeight]; // Update canvas size [c.width, c.height] = [cw, ch]; // Update rows, cols, and number of dots [NUM_ROWS, NUM_COLS] = [Math.ceil(ch/(DOT_LARGE*2))+1, Math.ceil(cw/(DOT_LARGE*2))]; NUM_DOTS = NUM_ROWS*NUM_COLS; clearTimeout(resizeTimer); resizeTimer = setTimeout(function() { init(); }, 250);
}
//--------------------------------------------------------------------
// Set mouse coordinates
c.addEventListener('mousemove', (e) => { [lastX, lastY] = [e.offsetX, e.offsetY];
}, false);
c.addEventListener('mouseout', (e) => { [lastX, lastY] = [null, null];
}, false);
// Click events
c.addEventListener('click', (e) => { // Update the dots for (let i = 0; i < dots.length; i++) {
dots[i].radius = DOT_LARGE/2;
}
}, false);
// Window resize
window.addEventListener('resize', resizeCanvas, false);
//--------------------------------------------------------------------
// Initialize the fun
resizeCanvas();
init();
Developer | Kyle Brumm |
Username | kjbrum |
Uploaded | January 07, 2023 |
Rating | 4 |
Size | 3,287 Kb |
Views | 4,048 |
Find the perfect freelance services for your business! Fiverr's mission is to change how the world works together. Fiverr connects businesses with freelancers offering digital services in 500+ categories. Find Developer!
Name | Size |
Subtle Menu Animation | 2,923 Kb |
CSS3 Stylish Checkboxes | 2,624 Kb |
Simple Accordion Concept | 4,955 Kb |
SVG Hover Animations | 10,557 Kb |
Stacked Cards Hover Effects | 4,514 Kb |
Stylish Brand Buttons | 8,832 Kb |
3D Parallax Boxes | 5,031 Kb |
CSS Only Dropdown | 2,655 Kb |
Wavy Loading Animations | 12,777 Kb |
3D Orbiting Split Images | 5,806 Kb |
Jasper is the AI Content Generator that helps you and your team break through creative blocks to create amazing, original content 10X faster. Discover all the ways the Jasper AI Content Platform can help streamline your creative workflows. Start For Free!
Name | Username | Size |
Animated Logo | Shakdaniel | 2,672 Kb |
Fireworks Show | Arianalynn | 3,048 Kb |
Smoke Shader - Frame Buffer | Omarshe7ta | 2,672 Kb |
OnScreenAction | Ozgursagiroglu | 2,647 Kb |
Exploding Text | Jjmartucci | 4,749 Kb |
Local Weather App - FreeCodeCamp | TrevorWelch | 4,134 Kb |
Guidepopup | Wooljs | 3,747 Kb |
GrcJS | Vino6 | 2,047 Kb |
Css color for svg | Ademilter | 2,392 Kb |
Parallax scrolling scene | Iharosi | 2,485 Kb |
Surf anonymously, prevent hackers from acquiring your IP address, send anonymous email, and encrypt your Internet connection. High speed, ultra secure, and easy to use. Instant setup. Hide Your IP Now!