Skip to content

Instantly share code, notes, and snippets.

@Heroges
Created August 28, 2021 11:13
Show Gist options
  • Save Heroges/ebde19caa021b682921ec96505d3ef7e to your computer and use it in GitHub Desktop.
Save Heroges/ebde19caa021b682921ec96505d3ef7e to your computer and use it in GitHub Desktop.
interact.js rainbow pixel canvas
<canvas class="rainbow-pixel-canvas"></canvas>
Double tap to clear the canvas
var pixelSize = 16;
interact(".rainbow-pixel-canvas")
.origin("self")
.draggable({
max: Infinity,
maxPerElement: Infinity,
modifiers: [
interact.modifiers.snap({
// snap to the corners of a grid
targets: [
interact.snappers.grid({ x: pixelSize, y: pixelSize })
],
})
],
listeners: {
// draw colored squares on move
move: function(event) {
var context = event.target.getContext("2d"),
// calculate the angle of the drag direction
dragAngle = 180 * Math.atan2(event.dx, event.dy) / Math.PI;
// set color based on drag angle and speed
context.fillStyle =
"hsl(" +
dragAngle +
", 86%, " +
(30 + Math.min(event.speed / 1000, 1) * 50) +
"%)";
// draw squares
context.fillRect(
event.pageX - pixelSize / 2,
event.pageY - pixelSize / 2,
pixelSize,
pixelSize
);
}
}
})
// clear the canvas on doubletap
.on("doubletap", function(event) {
var context = event.target.getContext("2d");
context.clearRect(0, 0, context.canvas.width, context.canvas.height);
});
function resizeCanvases() {
[].forEach.call(document.querySelectorAll(".rainbow-pixel-canvas"), function(
canvas
) {
canvas.width = document.body.clientWidth;
canvas.height = window.innerHeight * 0.7;
});
}
// interact.js can also add DOM event listeners
interact(document).on("DOMContentLoaded", resizeCanvases);
interact(window).on("resize", resizeCanvases);
<script src="https://cdn.jsdelivr.net/npm/interactjs@latest"></script>
.rainbow-pixel-canvas {
border: solid 2px gray;
-ms-touch-action: none;
touch-action: none;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment