edyelro's picture
Crea una página web moderna y elegante para una ceremonia de graduación, con los siguientes elementos visuales y funcionales:
005c99b verified
document.addEventListener('DOMContentLoaded', () => {
const canvas = document.createElement('canvas');
const background = document.getElementById('animated-background');
background.appendChild(canvas);
canvas.style.position = 'absolute';
canvas.style.top = '0';
canvas.style.left = '0';
canvas.style.width = '100%';
canvas.style.height = '100%';
// Resize canvas to full window
function resizeCanvas() {
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
}
window.addEventListener('resize', resizeCanvas);
resizeCanvas();
const ctx = canvas.getContext('2d');
// Particle system
let particles = [];
let particleCount = 150;
let speed = 5;
let size = 5;
let effectType = 'cosmic';
// Create particles
function createParticles() {
particles = [];
for (let i = 0; i < particleCount; i++) {
particles.push({
x: Math.random() * canvas.width,
y: Math.random() * canvas.height,
size: Math.random() * size + 1,
speedX: (Math.random() - 0.5) * speed,
speedY: (Math.random() - 0.5) * speed,
color: `hsl(${Math.random() * 360}, 70%, 60%)`,
angle: Math.random() * Math.PI * 2,
angleSpeed: (Math.random() - 0.5) * 0.02
});
}
}
// Draw particles
function drawParticles() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
particles.forEach(p => {
// Update position
p.x += p.speedX;
p.y += p.speedY;
p.angle += p.angleSpeed;
// Wrap around edges
if (p.x < 0) p.x = canvas.width;
if (p.x > canvas.width) p.x = 0;
if (p.y < 0) p.y = canvas.height;
if (p.y > canvas.height) p.y = 0;
// Draw based on effect type
if (effectType === 'cosmic') {
drawCosmicParticle(p);
} else if (effectType === 'bubbles') {
drawBubbleParticle(p);
} else if (effectType === 'stars') {
drawStarParticle(p);
}
});
requestAnimationFrame(drawParticles);
}
function drawCosmicParticle(p) {
ctx.save();
ctx.translate(p.x, p.y);
ctx.rotate(p.angle);
// Glow effect
const gradient = ctx.createRadialGradient(0, 0, 0, 0, 0, p.size * 2);
gradient.addColorStop(0, p.color);
gradient.addColorStop(1, 'transparent');
ctx.fillStyle = gradient;
ctx.beginPath();
ctx.arc(0, 0, p.size * 2, 0, Math.PI * 2);
ctx.fill();
// Core
ctx.fillStyle = p.color;
ctx.beginPath();
ctx.arc(0, 0, p.size / 2, 0, Math.PI * 2);
ctx.fill();
ctx.restore();
}
function drawBubbleParticle(p) {
ctx.fillStyle = `rgba(255, 255, 255, ${p.size / 20})`;
ctx.beginPath();
ctx.arc(p.x, p.y, p.size, 0, Math.PI * 2);
ctx.fill();
ctx.strokeStyle = `rgba(255, 255, 255, 0.3)`;
ctx.stroke();
}
function drawStarParticle(p) {
const spikes = 5;
const outerRadius = p.size;
const innerRadius = p.size / 2;
ctx.save();
ctx.translate(p.x, p.y);
ctx.rotate(p.angle);
ctx.fillStyle = p.color;
ctx.beginPath();
for (let i = 0; i < spikes * 2; i++) {
const radius = i % 2 === 0 ? outerRadius : innerRadius;
const angle = (i * Math.PI) / spikes;
ctx.lineTo(Math.cos(angle) * radius, Math.sin(angle) * radius);
}
ctx.closePath();
ctx.fill();
// Glow
ctx.shadowColor = p.color;
ctx.shadowBlur = 10;
ctx.fill();
ctx.restore();
}
// Change effect type
document.getElementById('change-effect').addEventListener('click', () => {
const effects = ['cosmic', 'bubbles', 'stars'];
const currentIndex = effects.indexOf(effectType);
effectType = effects[(currentIndex + 1) % effects.length];
createParticles();
});
// Toggle controls panel
const controlsPanel = document.getElementById('controls-panel');
document.getElementById('toggle-controls').addEventListener('click', () => {
controlsPanel.style.transform = controlsPanel.style.transform === 'translateY(0px)' ?
'translateY(100%)' : 'translateY(0)';
});
// Update settings from controls
document.getElementById('particle-count').addEventListener('input', (e) => {
particleCount = parseInt(e.target.value);
createParticles();
});
document.getElementById('speed').addEventListener('input', (e) => {
speed = parseInt(e.target.value);
particles.forEach(p => {
p.speedX = (Math.random() - 0.5) * speed;
p.speedY = (Math.random() - 0.5) * speed;
});
});
document.getElementById('size').addEventListener('input', (e) => {
size = parseInt(e.target.value);
particles.forEach(p => {
p.size = Math.random() * size + 1;
});
});
// Initialize
createParticles();
drawParticles();
});