HTML5는 웹 애니메이션을 구현하는 여러 가지 방법을 제공합니다. 이 글에서는 이동하는 자동차를 예제로 사용하여 세 가지 다른 기술을 통해 애니메이션을 구현하는 방법을 설명합니다. 각 방법에는 고유한 장단점이 있으며, 프로젝트 요구사항에 따라 적합한 방법을 선택할 수 있습니다.
1. Canvas와 JavaScript를 이용한 애니메이션
Canvas 요소는 HTML5에서 가장 강력한 그래픽 기능 중 하나로, JavaScript와 결합하여 복잡한 애니메이션을 구현할 수 있습니다.
HTML 구조:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Canvas를 이용한 HTML5 애니메이션</title>
</head>
<body onload="initialize();">
<canvas id="animationCanvas" width="1000" height="600">브라우저가 canvas 요소를 지원하지 않습니다. 업데이트를 고려해주세요!</canvas>
<div id="controlPanel">
<button type="button" onclick="adjustSpeed(-0.1);">감속</button>
<button type="button" onclick="toggleAnimation(this);">시작</button>
<button type="button" onclick="adjustSpeed(0.1)">가속</button>
</div>
</body>
</html>
JavaScript 구현:
먼저 필요한 변수들을 정의합니다:
// 애니메이션 변수 선언
var velocity = 5, // 현재 속도
speedFactor = 1, // 현재 배속
animationFrame, // 애니메이션 프레임
mainContext, // 메인 캔버스 컨텍스트
vehicleCanvas, // 자동차 캔버스 컨텍스트
groundHeight = 130, // 배경 높이
wheelRotation = 0, // 바퀴 회전 각도
vehiclePositionX = -400, // 자동차 X 위치
vehiclePositionY = 300, // 자동차 Y 위치
vehicleWidth = 400, // 자동차 너비
vehicleHeight = 130, // 자동차 높이
wheelOffset = 15, // 바퀴와 차체 간 거리
axleOffset = 20, // 차축과 바퀴 간 거리
wheelRadius = 60; // 바퀴 반지름
자동차를 그리기 위한 캔버스를 생성합니다:
// 자동차 캔버스 초기화
(function() {
var carElement = document.createElement('canvas');
carElement.height = vehicleHeight + axleOffset + wheelRadius;
carElement.width = vehicleWidth;
vehicleCanvas = carElement.getContext('2d');
})();
애니메이션 제어 함수를 구현합니다:
// 애니메이션 재생/정지
function toggleAnimation(controlButton) {
if (animationFrame) {
cancelAnimationFrame(animationFrame);
animationFrame = null;
controlButton.textContent = '시작';
} else {
animationFrame = requestAnimationFrame(animateScene);
controlButton.textContent = '정지';
}
}
// 속도 조절
function adjustSpeed(delta) {
var newSpeedFactor = Math.max(speedFactor + delta, 0.1);
velocity = newSpeedFactor / speedFactor * velocity;
speedFactor = newSpeedFactor;
}
// 초기화 함수
function initialize() {
mainContext = document.getElementById('animationCanvas').getContext('2d');
animateScene();
}
메인 애니메이션 함수를 구현합니다:
// 메인 애니메이션 루프
function animateScene() {
// 캔버스 초기화
mainContext.clearRect(0, 0, mainContext.canvas.width, mainContext.canvas.height);
mainContext.save();
// 배경 그리기
renderBackground();
// 자동차 위치 이동
mainContext.translate(vehiclePositionX, 0);
// 자동차 그리기
renderVehicle();
mainContext.drawImage(vehicleCanvas.canvas, 0, vehiclePositionY);
mainContext.restore();
// 위치 및 회전 업데이트
vehiclePositionX += velocity;
wheelRotation += velocity / wheelRadius;
// 화면 경계 체크
if (vehiclePositionX > mainContext.canvas.width) {
vehiclePositionX = -vehicleWidth - 10;
}
// 다음 프레임 요청
if (animationFrame) {
animationFrame = requestAnimationFrame(animateScene);
}
}
배경을 그리는 함수:
// 배경 렌더링
function renderBackground() {
var gradient = mainContext.createLinearGradient(0, mainContext.canvas.height - groundHeight, 0, mainContext.canvas.height);
gradient.addColorStop(0, '#33CC00');
gradient.addColorStop(1, '#66FF22');
mainContext.fillStyle = gradient;
mainContext.fillRect(0, mainContext.canvas.height - groundHeight, mainContext.canvas.width, groundHeight);
}
자동차를 그리는 함수:
// 자동차 렌더링
function renderVehicle() {
vehicleCanvas.clearRect(0, 0, vehicleCanvas.canvas.width, vehicleCanvas.canvas.height);
vehicleCanvas.strokeStyle = '#FF6600';
vehicleCanvas.lineWidth = 2;
vehicleCanvas.fillStyle = '#FF9900';
// 차체 그리기
vehicleCanvas.beginPath();
vehicleCanvas.rect(0, 0, vehicleWidth, vehicleHeight);
vehicleCanvas.stroke();
vehicleCanvas.fill();
vehicleCanvas.closePath();
// 바퀴 그리기
renderWheel(wheelOffset + wheelRadius, vehicleHeight + axleOffset);
renderWheel(vehicleWidth - wheelOffset - wheelRadius, vehicleHeight + axleOffset);
}
// 바퀴 렌더링
function renderWheel(x, y) {
vehicleCanvas.save();
vehicleCanvas.translate(x, y);
vehicleCanvas.rotate(wheelRotation);
vehicleCanvas.strokeStyle = '#3300FF';
vehicleCanvas.lineWidth = 1;
vehicleCanvas.fillStyle = '#0099FF';
// 바퀴 외곽선
vehicleCanvas.beginPath();
vehicleCanvas.arc(0, 0, wheelRadius, 0, 2 * Math.PI, false);
vehicleCanvas.fill();
vehicleCanvas.closePath();
// 바퀴 내부 수평선
vehicleCanvas.beginPath();
vehicleCanvas.moveTo(wheelRadius, 0);
vehicleCanvas.lineTo(-wheelRadius, 0);
vehicleCanvas.stroke();
vehicleCanvas.closePath();
// 바퀴 내부 수직선
vehicleCanvas.beginPath();
vehicleCanvas.moveTo(0, wheelRadius);
vehicleCanvas.lineTo(0, -wheelRadius);
vehicleCanvas.stroke();
vehicleCanvas.closePath();
vehicleCanvas.restore();
}
2. 순수 CSS3 애니메이션
CSS3를 사용하면 JavaScript 없이도 애니메이션을 구현할 수 있습니다. 이 방법은 성능이 우수하지만 일부 구형 브라우저에서는 지원되지 않을 수 있습니다.
HTML 구조:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>CSS3 애니메이션</title>
</head>
<body>
<div id="scene">
<div id="automobile">
<div id="body"></div>
<div id="rearWheel" class="wheel">
<div class="horizontalLine"></div>
<div class="verticalLine"></div>
</div>
<div id="frontWheel" class="wheel">
<div class="horizontalLine"></div>
<div class="verticalLine"></div>
</div>
</div>
<div id="ground"></div>
</div>
</body>
</html>
CSS 구현:
/* 기본 스타일 */
body {
padding: 0;
margin: 0;
}
/* 자동차 이동 애니메이션 정의 */
@keyframes moveCar {
0% { left: -400px; }
100% { left: 1600px; }
}
/* 웹킷 브라우저용 */
@-webkit-keyframes moveCar {
0% { left: -400px; }
100% { left: 1600px; }
}
/* 파이어폭스용 */
@-moz-keyframes moveCar {
0% { left: -400px; }
100% { left: 1600px; }
}
/* IE용 */
@-ms-keyframes moveCar {
0% { left: -400px; }
100% { left: 1600px; }
}
/* 바퀴 회전 애니메이션 정의 */
@keyframes rotateWheels {
0% { transform: rotate(0deg); }
100% { transform: rotate(1800deg); }
}
@-webkit-keyframes rotateWheels {
0% { -webkit-transform: rotate(0deg); }
100% { -webkit-transform: rotate(1800deg); }
}
@-moz-keyframes rotateWheels {
0% { -moz-transform: rotate(0deg); }
100% { -moz-transform: rotate(1800deg); }
}
@-ms-keyframes rotateWheels {
0% { -ms-transform: rotate(0deg); }
100% { -ms-transform: rotate(1800deg); }
}
/* 씬 컨테이너 */
#scene {
position: relative;
width: 100%;
height: 600px;
overflow: hidden;
}
/* 자동차 스타일 */
#automobile {
position: absolute;
width: 400px;
height: 210px;
z-index: 1;
top: 300px;
left: 50px;
/* 애니메이션 적용 */
-webkit-animation: moveCar 10s linear infinite;
-moz-animation: moveCar 10s linear infinite;
-ms-animation: moveCar 10s linear infinite;
animation: moveCar 10s linear infinite;
}
/* 차체 스타일 */
#body {
position: absolute;
width: 400px;
height: 130px;
background: #FF9900;
border: 2px solid #FF6600;
}
/* 바퀴 공통 스타일 */
.wheel {
position: absolute;
bottom: 0;
border-radius: 60px;
height: 120px;
width: 120px;
background: #0099FF;
border: 1px solid #3300FF;
z-index: 1;
/* 바퀴 회전 애니메이션 적용 */
-webkit-animation: rotateWheels 10s linear infinite;
-moz-animation: rotateWheels 10s linear infinite;
-ms-animation: rotateWheels 10s linear infinite;
animation: rotateWheels 10s linear infinite;
}
/* 앞바퀴 위치 */
#frontWheel {
right: 20px;
}
/* 뒷바퀴 위치 */
#rearWheel {
left: 20px;
}
/* 지면 스타일 */
#ground {
position: absolute;
width: 100%;
height: 130px;
bottom: 0;
background: linear-gradient(bottom, #33CC00, #66FF22);
background: -webkit-linear-gradient(bottom, #33CC00, #66FF22);
background: -moz-linear-gradient(bottom, #33CC00, #66FF22);
background: -ms-linear-gradient(bottom, #33CC00, #66FF22);
}
/* 바퀴 내부 선 스타일 */
.horizontalLine, .verticalLine {
position: absolute;
background: #3300FF;
}
.horizontalLine {
height: 1px;
width: 100%;
left: 0;
top: 60px;
}
.verticalLine {
width: 1px;
height: 100%;
left: 60px;
top: 0;
}
3. jQuery와 CSS3를 결합한 애니메이션
jQuery와 CSS3를 결합하면 브라우저 호환성이 향상되고 더 유연한 애니메이션 제어가 가능합니다.
HTML 구조:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>jQuery와 CSS3 애니메이션</title>
</head>
<body>
<div id="scene">
<div id="automobile">
<div id="body"></div>
<div id="rearWheel" class="wheel">
<div class="horizontalLine"></div>
<div class="verticalLine"></div>
</div>
<div id="frontWheel" class="wheel">
<div class="horizontalLine"></div>
<div class="verticalLine"></div>
</div>
</div>
<div id="ground"></div>
</div>
</body>
</html>
CSS 구현:
/* 기본 스타일 */
body {
padding: 0;
margin: 0;
}
/* 씬 컨테이너 */
#scene {
position: relative;
width: 100%;
height: 600px;
overflow: hidden;
}
/* 자동차 스타일 */
#automobile {
position: absolute;
width: 400px;
height: 210px;
z-index: 1;
top: 300px;
left: 50px;
}
/* 차체 스타일 */
#body {
position: absolute;
width: 400px;
height: 130px;
background: #FF9900;
border: 2px solid #FF6600;
}
/* 바퀴 공통 스타일 */
.wheel {
position: absolute;
bottom: 0;
border-radius: 60px;
height: 120px;
width: 120px;
background: #0099FF;
border: 1px solid #3300FF;
z-index: 1;
-o-transform: rotate(0deg);
-ms-transform: rotate(0deg);
-webkit-transform: rotate(0deg);
-moz-transform: rotate(0deg);
}
/* 앞바퀴 위치 */
#frontWheel {
right: 20px;
}
/* 뒷바퀴 위치 */
#rearWheel {
left: 20px;
}
/* 지면 스타일 */
#ground {
position: absolute;
width: 100%;
height: 130px;
bottom: 0;
background: linear-gradient(bottom, #33CC00, #66FF22);
background: -webkit-linear-gradient(bottom, #33CC00, #66FF22);
background: -moz-linear-gradient(bottom, #33CC00, #66FF22);
background: -ms-linear-gradient(bottom, #33CC00, #66FF22);
}
/* 바퀴 내부 선 스타일 */
.horizontalLine, .verticalLine {
position: absolute;
background: #3300FF;
}
.horizontalLine {
height: 1px;
width: 100%;
left: 0;
top: 60px;
}
.verticalLine {
width: 1px;
height: 100%;
left: 60px;
top: 0;
}
JavaScript 구현:
먼저 jQuery 라이브러리를 포함합니다:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
애니메이션을 제어하는 JavaScript 코드:
$(function() {
var rotation = 0;
// 브라우저에 맞는 CSS 프리픽스 결정
var cssPrefix = $('.wheel').css('-o-transform') ? '-o-transform' :
$('.wheel').css('-ms-transform') ? '-ms-transform' :
$('.wheel').css('-moz-transform') ? '-moz-transform' :
$('.wheel').css('-webkit-transform') ? '-webkit-transform' : 'transform';
// 시작 위치 설정
var startPosition = {
left: -400
};
// 종료 위치 설정
var endPosition = {
left: 1600
};
// 바퀴 회전 함수
var spinWheels = function() {
rotation += 2;
$('.wheel').css(cssPrefix, 'rotate(' + rotation + 'deg)');
};
// 애니메이션 설정
var animationSettings = {
easing: 'linear',
duration: 10000,
complete: function() {
$('#automobile').css(startPosition).animate(endPosition, animationSettings);
},
step: spinWheels
};
// 애니메이션 시작
$('#automobile').animate(endPosition, animationSettings);
});
이 세 가지 방법은 각각 장단점이 있습니다. Canvas와 JavaScript는 가장 유연하지만 코드가 복잡합니다. 순수 CSS3는 성능이 우수하지만 브라우저 호환성 문제가 있을 수 있습니다. jQuery와 CSS3를 결합한 방법은 호환성과 유연성 사이의 좋은 절충안을 제공합니다. 프로젝트의 요구사항과 대상 브라우저를 고려하여 적합한 방법을 선택하십시오.