WEBLEB
Inicio
Editora de código
Iniciar sesión
Pro
Español
English
Français
Español
Português
Deutsch
Italiano
हिंदी
dragón
1443
mambetov1237.b
Abrir en el editor
Publica tu código
Recomendado
24 September 2025
Código gráfico interactivo de dragón SVG
24 September 2025
Código gráfico interactivo de dragón SVG
HTML
Copy
CodePen - Untitled
Interactive dragon
CSS
Copy
body, html { position: absolute; margin: 0; padding: 0; width: 100%; height: 100%; overflow: hidden; background: rgb(60, 97, 153); touch-action: none; } svg { position: absolute; width: 100%; height: 100%; background: #c9c9c9; cursor: pointer; filter: sepia(20%); }<!-- Replace with your HTML Code (Leave empty if not needed) -->
JS
Copy
"use strict"; const screen = document.getElementById("screen"); const xmlns = "http://www.w3.org/2000/svg"; const xlinkns = "http://www.w3.org/1999/xlink"; window.addEventListener( "pointermove", (e) => { pointer.x = e.clientX; pointer.y = e.clientY; rad = 0; }, false ); const resize = () => { width = window.innerWidth; height = window.innerHeight; }; let width, height; window.addEventListener("resize", () => resize(), false); resize(); const prepend = (use, i) => { const elem = document.createElementNS(xmlns, "use"); elems[i].use = elem; elem.setAttributeNS(xlinkns, "xlink:href", "#" + use); screen.prepend(elem); }; const N = 40; const elems = []; for (let i = 0; i < N; i++) elems[i] = { use: null, x: width / 2, y: 0 }; const pointer = { x: width / 2, y: height / 2 }; const radm = Math.min(pointer.x, pointer.y) - 20; let frm = Math.random(); let rad = 0; for (let i = 1; i < N; i++) { if (i === 1) prepend("Cabeza", i); else if (i === 8 || i === 14) prepend("Aletas", i); else prepend("Espina", i); } const run = () => { requestAnimationFrame(run); let e = elems[0]; const ax = (Math.cos(3 * frm) * rad * width) / height; const ay = (Math.sin(4 * frm) * rad * height) / width; e.x += (ax + pointer.x - e.x) / 10; e.y += (ay + pointer.y - e.y) / 10; for (let i = 1; i < N; i++) { let e = elems[i]; let ep = elems[i - 1]; const a = Math.atan2(e.y - ep.y, e.x - ep.x); e.x += (ep.x - e.x + (Math.cos(a) * (100 - i)) / 5) / 4; e.y += (ep.y - e.y + (Math.sin(a) * (100 - i)) / 5) / 4; const s = (162 + 4 * (1 - i)) / 50; e.use.setAttributeNS( null, "transform", `translate(${(ep.x + e.x) / 2},${(ep.y + e.y) / 2}) rotate(${ (180 / Math.PI) * a }) translate(${0},${0}) scale(${s},${s})` ); } if (rad < radm) rad++; frm += 0.003; if (rad > 60) { pointer.x += (width / 2 - pointer.x) * 0.05; pointer.y += (height / 2 - pointer.y) * 0.05; } }; run();/* Replace with your JS Code (Leave empty if not needed) */