Skip to content

Instantly share code, notes, and snippets.

@3kh0
Created January 15, 2025 12:55
Show Gist options
  • Save 3kh0/40def90a54b7258aeeed58774815e365 to your computer and use it in GitHub Desktop.
Save 3kh0/40def90a54b7258aeeed58774815e365 to your computer and use it in GitHub Desktop.
DVD bounce in a QR Code
<html>
<head>
<style>
body {
margin: 0;
background-color: black;
}
</style>
</head>
<body>
<img
id="d"
src="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHZpZXdCb3g9IjAgMCAxMDU4LjQgNDY1Ljg0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxnPjxwYXRoIGQ9Im05MS4wNTMgMC0xMy43MTkgNTcuNzA3IDEwMi4yOCAwLjAzOTA2M2gyNGM2NS43NDcgMCAxMDUuOTEgMjYuNDQgOTQuNzQ2IDczLjQtMTIuMTQ3IDUxLjEzMy02OS42MTMgNzMuNC0xMzAuNjcgNzMuNGgtMjIuOTQ3bDI5Ljc4Ny0xMjUuNDVoLTEwMi4yN2wtNDMuNTIxIDE4My4yaDE0NS4wNWMxMDkuMDcgMCAyMTIuNzYtNTcuNTczIDIzMS4wMS0xMzEuMTUgMy4zNDY3LTEzLjUwNyAyLjg4MDYtNDcuMjUzLTUuMzU5NC02Ny4zNTktMC4yMTI5OS0wLjc4Ny0wLjQyNTk0LTEuNC0xLjE4NTUtMy0wLjI5My0wLjY1My0wLjU2MDEyLTMuNjQxMiAxLjE0NjUtNC4yODEyIDAuOTQ3LTAuMzYgMi43MDY5IDEuNDk0NCAyLjkzMzYgMi4wNDEgMC44NTMgMi4yNCAxLjUwNTkgMy45MDYyIDEuNTA1OSAzLjkwNjJsOTIuMjkzIDI2MC42IDIzNC45Ny0yNjUuMjEgOTkuNTM1LTAuMDg5ODQ0aDI0YzY1Ljc2IDAgMTA2LjI1IDI2LjQ0IDk1LjA5MiA3My40LTEyLjE0NyA1MS4xMzMtNjkuOTQ3IDczLjQtMTMxIDczLjRoLTIyLjk1OWwyOS43OTktMTI1LjQ3aC0xMDIuMjdsLTQzLjUzMyAxODMuMjFoMTQ1LjA3YzEwOS4wNSAwIDIxMy40OC01Ny40IDIzMS0xMzEuMTUgMTcuNTItNzMuNzUtNTkuMTA3LTEzMS4xNS0xNjguNjktMTMxLjE1aC0yMTYuNHMtNTcuMzE5IDY3Ljg4LTY3Ljk1OSA4MC42OTNjLTU3LjEyIDY4Ljc4Ny02Ny4yNDEgODcuMjI2LTY4Ljk2MSA5MS45ODYgMC4yNC00LjgtMS44MTM4LTIzLjQxMi0yNi4xNzQtOTIuOTU5LTYuNDgtMTguNTItMjcuMzU5LTc5LjcyMS0yNy4zNTktNzkuNzIxaC0zODkuMjV6bTQwOC43NyAzMjQuMTZjLTI3Ni4wNCAwLTQ5OS44MyAzMS43Mi00OTkuODMgNzAuODRzMjIzLjc5IDcwLjg0IDQ5OS44MyA3MC44NGMyNzYuMDQgMCA0OTkuODMtMzEuNzIgNDk5LjgzLTcwLjg0cy0yMjMuNzktNzAuODQtNDk5LjgzLTcwLjg0em0tMTguMDk0IDQ4LjYyN2M2My4wNCAwIDExNC4xMyAxMC41NzMgMTE0LjEzIDIzLjYxM3MtNTEuMDk1IDIzLjYxMy0xMTQuMTMgMjMuNjEzYy02My4wMjcgMC0xMTQuMTMtMTAuNTczLTExNC4xMy0yMy42MTNzNTEuMTA2LTIzLjYxMyAxMTQuMTMtMjMuNjEzeiIvPjxwYXRoIGQ9Im05NjMuNiA0NDUuMDUtMC43MzI0MiA1LjE3MzhoMTMuMDhsLTUuMTA3NCAzNi4zMmg1LjcyMDdsNS4xMDU1LTM2LjMyaDExLjY4bDAuNzIwNzEtNS4xNzM4aC0zMC40Njd6bTQxLjIxNSAwLTEzLjY5MyA0MS40OTRoNS40Nzg1bDEwLjIxNS0zMS43NmgwLjEzMjhsNy4xNzE4IDMxLjc2IDE2LjY2OC0zMS40NTNoMC4xMTkxdjMxLjQ1M2g1LjQ4MDV2LTQxLjQ5NGgtNS40ODA1bC0xNC45MDYgMjguMTA3LTYuNDM5NS0yOC4xMDdoLTQuNzQ2eiIgZGlzcGxheT0ibm9uZSIvPjwvZz48L3N2Zz4K"
width="200"
style="filter: invert(1); position: absolute"
/>
<script>
const img = document.getElementById("d");
let offsetX, offsetY;
const colors = [
"red",
"green",
"blue",
"yellow",
"purple",
"orange",
"pink",
"cyan",
"magenta",
];
img.style.left = window.innerWidth / 2 - img.clientWidth / 2 + "px";
img.style.top = window.innerHeight / 2 - img.clientHeight / 2 + "px";
function bounce() {
let x = parseInt(img.style.left);
let y = parseInt(img.style.top);
let dx = 2;
let dy = 2;
function animate() {
x += dx;
y += dy;
if (x <= 0 || x + img.clientWidth >= window.innerWidth) {
dx = -dx;
changeColor();
}
if (y <= 0 || y + img.clientHeight >= window.innerHeight) {
dy = -dy;
changeColor();
}
img.style.left = x + "px";
img.style.top = y + "px";
requestAnimationFrame(animate);
}
animate();
}
function changeColor() {
let newColor;
do {
newColor = colors[Math.floor(Math.random() * colors.length)];
} while (newColor === "black");
img.style.filter = `invert(1) sepia(1) saturate(10000%) hue-rotate(${
Math.random() * 360
}deg)`;
}
bounce();
changeColor();
</script>
</body>
</html>
<style>body{margin:0;background-color:#000}</style><img id="d"src="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHZpZXdCb3g9IjAgMCAxMDU4LjQgNDY1Ljg0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxnPjxwYXRoIGQ9Im05MS4wNTMgMC0xMy43MTkgNTcuNzA3IDEwMi4yOCAwLjAzOTA2M2gyNGM2NS43NDcgMCAxMDUuOTEgMjYuNDQgOTQuNzQ2IDczLjQtMTIuMTQ3IDUxLjEzMy02OS42MTMgNzMuNC0xMzAuNjcgNzMuNGgtMjIuOTQ3bDI5Ljc4Ny0xMjUuNDVoLTEwMi4yN2wtNDMuNTIxIDE4My4yaDE0NS4wNWMxMDkuMDcgMCAyMTIuNzYtNTcuNTczIDIzMS4wMS0xMzEuMTUgMy4zNDY3LTEzLjUwNyAyLjg4MDYtNDcuMjUzLTUuMzU5NC02Ny4zNTktMC4yMTI5OS0wLjc4Ny0wLjQyNTk0LTEuNC0xLjE4NTUtMy0wLjI5My0wLjY1My0wLjU2MDEyLTMuNjQxMiAxLjE0NjUtNC4yODEyIDAuOTQ3LTAuMzYgMi43MDY5IDEuNDk0NCAyLjkzMzYgMi4wNDEgMC44NTMgMi4yNCAxLjUwNTkgMy45MDYyIDEuNTA1OSAzLjkwNjJsOTIuMjkzIDI2MC42IDIzNC45Ny0yNjUuMjEgOTkuNTM1LTAuMDg5ODQ0aDI0YzY1Ljc2IDAgMTA2LjI1IDI2LjQ0IDk1LjA5MiA3My40LTEyLjE0NyA1MS4xMzMtNjkuOTQ3IDczLjQtMTMxIDczLjRoLTIyLjk1OWwyOS43OTktMTI1LjQ3aC0xMDIuMjdsLTQzLjUzMyAxODMuMjFoMTQ1LjA3YzEwOS4wNSAwIDIxMy40OC01Ny40IDIzMS0xMzEuMTUgMTcuNTItNzMuNzUtNTkuMTA3LTEzMS4xNS0xNjguNjktMTMxLjE1aC0yMTYuNHMtNTcuMzE5IDY3Ljg4LTY3Ljk1OSA4MC42OTNjLTU3LjEyIDY4Ljc4Ny02Ny4yNDEgODcuMjI2LTY4Ljk2MSA5MS45ODYgMC4yNC00LjgtMS44MTM4LTIzLjQxMi0yNi4xNzQtOTIuOTU5LTYuNDgtMTguNTItMjcuMzU5LTc5LjcyMS0yNy4zNTktNzkuNzIxaC0zODkuMjV6bTQwOC43NyAzMjQuMTZjLTI3Ni4wNCAwLTQ5OS44MyAzMS43Mi00OTkuODMgNzAuODRzMjIzLjc5IDcwLjg0IDQ5OS44MyA3MC44NGMyNzYuMDQgMCA0OTkuODMtMzEuNzIgNDk5LjgzLTcwLjg0cy0yMjMuNzktNzAuODQtNDk5LjgzLTcwLjg0em0tMTguMDk0IDQ4LjYyN2M2My4wNCAwIDExNC4xMyAxMC41NzMgMTE0LjEzIDIzLjYxM3MtNTEuMDk1IDIzLjYxMy0xMTQuMTMgMjMuNjEzYy02My4wMjcgMC0xMTQuMTMtMTAuNTczLTExNC4xMy0yMy42MTNzNTEuMTA2LTIzLjYxMyAxMTQuMTMtMjMuNjEzeiIvPjxwYXRoIGQ9Im05NjMuNiA0NDUuMDUtMC43MzI0MiA1LjE3MzhoMTMuMDhsLTUuMTA3NCAzNi4zMmg1LjcyMDdsNS4xMDU1LTM2LjMyaDExLjY4bDAuNzIwNzEtNS4xNzM4aC0zMC40Njd6bTQxLjIxNSAwLTEzLjY5MyA0MS40OTRoNS40Nzg1bDEwLjIxNS0zMS43NmgwLjEzMjhsNy4xNzE4IDMxLjc2IDE2LjY2OC0zMS40NTNoMC4xMTkxdjMxLjQ1M2g1LjQ4MDV2LTQxLjQ5NGgtNS40ODA1bC0xNC45MDYgMjguMTA3LTYuNDM5NS0yOC4xMDdoLTQuNzQ2eiIgZGlzcGxheT0ibm9uZSIvPjwvZz48L3N2Zz4K"style="filter:invert(1);position:absolute"width="200"><script>let img = document.getElementById("d");let x, y;let u = ["red","green","blue","yellow","purple","orange","pink","cyan","magenta",];img.style.left = window.innerWidth / 2 - img.clientWidth / 2 + "px";img.style.top = window.innerHeight / 2 - img.clientHeight / 2 + "px";function b() {let x = parseInt(img.style.left);let y = parseInt(img.style.top);let dx = 2;let dy = 2;function a() {x += dx;y += dy;if (x <= 0 || x + img.clientWidth >= window.innerWidth) {dx = -dx;c();}if (y <= 0 || y + img.clientHeight >= window.innerHeight) {dy = -dy;c();}img.style.left = x + "px";img.style.top = y + "px";requestAnimationFrame(a);}a();}function c() {let p;do {p = u[Math.floor(Math.random() * u.length)];} while (p === "black");img.style.filter = `invert(1) sepia(1) saturate(10000%) hue-rotate(${Math.random()*360}deg)`;}b();c()</script>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment