연휴 시즌이 다가왔습니다. JavaScript로 역동적인 크리스마스 장면을 만드는 것보다 더 좋은 방법이 있을까요? 이 튜토리얼에서는 떨어지는 눈송이, 축제 분위기의 크리스마스 마을, 썰매를 타고 날아다니는 산타클로스를 특징으로 하는 멋진 휴일 테마 애니메이션을 제작하는 과정을 안내해 드립니다.
? 라이브 데모 https://codepen.io/HanGPIIIErr/pen/LEPVwjp
? 당신이 만들 것
우아하게 떨어지는 애니메이션 눈송이.
명절 분위기가 물씬 풍기는 축제의 크리스마스 마을.
실감 나는 썰매를 타고 밤하늘을 날아다니는 산타클로스.
이 프로젝트는 HTML, CSS 및 JavaScript(Canvas API)를 사용하므로 초보자와 숙련된 개발자 모두에게 적합합니다.
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Christmas Wonderland</title> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <style> /* Add the CSS styles here */ </style> </head> <body> <canvas> <ol> <li>Styling the Scene with CSS</li> </ol> <p>We use CSS to create the visual layers of the scene:</p> <p>A gradient background to simulate the night sky.<br> A city banner showcasing a cozy Christmas town.<br> Layers for snow and Santa's animation.<br> </p> <pre class="brush:php;toolbar:false">body { margin: 0; overflow: hidden; background: linear-gradient(to bottom, #1e3b70, #29578a, #3a75b6, #a0d3e8); position: relative; height: 100vh; display: flex; flex-direction: column; align-items: center; justify-content: flex-start; } /* Canvas for the snow and Santa */ #skyCanvas { display: block; position: absolute; top: 0; left: 0; width: 100%; height: 100%; z-index: 2; } /* Section for the Christmas town */ #christmasScene { position: absolute; bottom: 0; width: 100%; height: 50%; z-index: 1; display: flex; align-items: flex-end; justify-content: center; } /* City banner */ #cityBanner { width: 100%; height: 100%; background: url('https://i.ibb.co/0p0Wzrk/DALL-E-2024-12-02-23-27.png') no-repeat center center; background-size: cover; background-position: bottom; }
Canvas API를 사용하여 다음과 같은 방법으로 장면에 생기를 불어넣습니다.
다양한 크기, 속도, 움직임으로 눈송이 애니메이션
부드러운 진동 궤적을 통해 산타클로스가 하늘을 날게 만듭니다.
const canvas = document.getElementById('skyCanvas'); const ctx = canvas.getContext('2d'); let width, height; let snowflakes = []; let santa = { x: width, y: height * 0.1, width: 150, height: 80, image: new Image(), time: 0 }; // Load Santa's image santa.image.src = 'https://i.ibb.co/rbHJDQB/DALL-E-2024-12-02-23-37-removebg-preview.png'; function init() { resize(); createSnowflakes(); animate(); } function resize() { width = canvas.width = window.innerWidth; height = canvas.height = window.innerHeight; santa.x = width; santa.y = height * 0.1; } window.addEventListener('resize', resize); function createSnowflakes() { let count = width / 8; snowflakes = []; for (let i = 0; i < count; i++) { snowflakes.push(new Snowflake()); } } function Snowflake() { this.x = Math.random() * width; this.y = Math.random() * height; this.radius = Math.random() * 4 + 1; this.speedX = Math.random() * 1 - 0.5; this.speedY = Math.random() * 3 + 1; this.opacity = Math.random() * 0.5 + 0.3; this.swing = Math.random() * 2; this.swingSpeed = Math.random() * 0.05 + 0.02; this.angle = Math.random() * Math.PI * 2; } Snowflake.prototype.update = function () { this.angle += this.swingSpeed; this.x += Math.cos(this.angle) * this.swing + this.speedX; this.y += this.speedY; if (this.y > height) { this.y = 0; this.x = Math.random() * width; } if (this.x > width) { this.x = 0; } if (this.x < 0) { this.x = width; } }; Snowflake.prototype.draw = function () { ctx.beginPath(); ctx.arc(this.x, this.y, this.radius, 0, Math.PI * 2); let gradient = ctx.createRadialGradient(this.x, this.y, 0, this.x, this.y, this.radius * 2); gradient.addColorStop(0, 'rgba(255, 255, 255,' + this.opacity + ')'); gradient.addColorStop(1, 'rgba(255, 255, 255, 0)'); ctx.fillStyle = gradient; ctx.fill(); }; function updateSanta() { santa.time += 0.05; santa.x -= 3; santa.y = height * 0.1 + Math.sin(santa.time) * 50; if (santa.x + santa.width < 0) { santa.x = width; } } function drawSanta() { ctx.drawImage(santa.image, santa.x, santa.y, santa.width, santa.height); } function animate() { ctx.clearRect(0, 0, width, height); snowflakes.forEach((flake) => { flake.update(); flake.draw(); }); updateSanta(); drawSanta(); requestAnimationFrame(animate); } init();
이 프로젝트의 라이브 버전을 확인하세요:
? https://codepen.io/HanGPIIIErr/pen/LEPVwjp
결론
이 축제 프로젝트는 대화형 애니메이션 제작을 위한 Canvas API의 강력한 기능을 보여줍니다. 휴일을 축하하든 애니메이션 기술을 배우든 이 프로젝트는 코딩 기술을 연습하고 향상시킬 수 있는 재미있는 방법입니다.
CodePen을 자유롭게 포크하고 장면을 추가로 사용자 정의하여 자신만의 것으로 만드세요. 즐거운 휴일 보내세요! ?✨
위 내용은 JavaScript로 애니메이션 눈송이와 산타로 마법 같은 크리스마스 장면을 만드는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!