Study/CSS
CSS 기초 강의 13편: CSS와 JavaScript를 결합한 고급 애니메이션과 인터랙션
wawManager
2024. 11. 28. 12:00
728x90
1. CSS와 JavaScript 결합의 필요성
CSS는 애니메이션과 트랜지션을 지원하지만, 사용자 상호작용에 따라 동적으로 애니메이션을 제어하기에는 한계가 있습니다. JavaScript는 특정 조건을 만족할 때 CSS 스타일을 변경하거나 클래스를 추가해, CSS 애니메이션을 동적으로 조절할 수 있도록 합니다.
2. JavaScript와 CSS를 이용한 애니메이션 제어
JavaScript로 CSS 클래스를 동적으로 추가하거나 제거하여 애니메이션을 제어하는 방식입니다.
예제: 클릭 시 카드가 뒤집히는 애니메이션
HTML에서 카드 요소를 구성하고, JavaScript로 클릭 이벤트가 발생할 때 애니메이션 클래스를 추가/제거합니다.
<!DOCTYPE html>
<html lang="ko">
<head>
<title>카드 뒤집기 애니메이션</title>
<style>
.card-container {
perspective: 1000px;
width: 200px;
height: 300px;
}
.card {
width: 100%;
height: 100%;
position: relative;
transform-style: preserve-3d;
transition: transform 0.6s;
}
.card.is-flipped {
transform: rotateY(180deg);
}
.card-side {
position: absolute;
width: 100%;
height: 100%;
backface-visibility: hidden;
}
.card-front {
background-color: #3498db;
color: white;
display: flex;
align-items: center;
justify-content: center;
font-size: 24px;
}
.card-back {
background-color: #e74c3c;
color: white;
transform: rotateY(180deg);
display: flex;
align-items: center;
justify-content: center;
font-size: 24px;
}
</style>
</head>
<body>
<div class="card-container" id="card">
<div class="card">
<div class="card-side card-front">Front</div>
<div class="card-side card-back">Back</div>
</div>
</div>
<script>
const card = document.getElementById('card');
card.addEventListener('click', () => {
card.querySelector('.card').classList.toggle('is-flipped');
});
</script>
</body>
</html>
코드 설명
- CSS: perspective와 transform-style을 사용해 3D 효과를 주었고, .is-flipped 클래스가 추가되면 Y축으로 180도 회전해 뒷면이 보이도록 설정했습니다.
- JavaScript: 카드 요소를 클릭하면 .is-flipped 클래스가 토글되도록 하여, 클릭할 때마다 카드가 뒤집히는 애니메이션을 구현했습니다.
3. 스크롤 연동 애니메이션
스크롤 위치에 따라 요소가 나타나거나 스타일이 변경되도록 JavaScript와 CSS를 결합하여 구현할 수 있습니다.
예제: 스크롤 시 요소가 페이드 인되는 애니메이션
<!DOCTYPE html>
<html lang="ko">
<head>
<title>스크롤 페이드 인 애니메이션</title>
<style>
.fade-in {
opacity: 0;
transform: translateY(20px);
transition: opacity 0.5s ease, transform 0.5s ease;
}
.fade-in.visible {
opacity: 1;
transform: translateY(0);
}
</style>
</head>
<body>
<section style="height: 100vh;">스크롤을 내려보세요</section>
<section class="fade-in" style="height: 100vh;">페이드 인 콘텐츠</section>
<script>
const observer = new IntersectionObserver(entries => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.classList.add('visible');
}
});
});
document.querySelectorAll('.fade-in').forEach(el => observer.observe(el));
</script>
</body>
</html>
코드 설명
- CSS: .fade-in 클래스에서 opacity와 transform을 초기 설정하고, visible 클래스가 추가될 때 서서히 나타나도록 트랜지션을 설정했습니다.
- JavaScript: IntersectionObserver API를 사용해 요소가 뷰포트에 들어올 때 visible 클래스를 추가하여, 스크롤 시 페이드 인 효과가 나타나도록 했습니다.
4. 마우스 따라다니는 인터랙티브 효과
사용자가 마우스를 움직일 때 해당 위치에 특정 스타일이 따라가며 반응하는 효과는 마우스 위치를 실시간으로 추적하여 CSS 스타일을 업데이트하는 방식으로 구현합니다.
예제: 마우스를 따라다니는 원 애니메이션
<!DOCTYPE html>
<html lang="ko">
<head>
<title>마우스 따라다니는 원</title>
<style>
.cursor {
width: 20px;
height: 20px;
background-color: rgba(52, 152, 219, 0.8);
border-radius: 50%;
position: absolute;
pointer-events: none;
transition: transform 0.1s ease;
transform: translate(-50%, -50%);
}
</style>
</head>
<body>
<div class="cursor" id="cursor"></div>
<script>
const cursor = document.getElementById('cursor');
document.addEventListener('mousemove', e => {
cursor.style.left = `${e.pageX}px`;
cursor.style.top = `${e.pageY}px`;
});
</script>
</body>
</html>
코드 설명
- CSS: .cursor 클래스는 원 모양의 요소를 화면에 표시하도록 설정하고, 트랜지션을 사용해 부드러운 움직임을 줍니다.
- JavaScript: mousemove 이벤트로 마우스 위치를 감지해 cursor 요소의 left와 top 값을 업데이트하여, 마우스가 움직일 때마다 원이 따라다니도록 구현했습니다.
5. 버튼 클릭 시 파티클 효과
버튼을 클릭할 때 파티클이 퍼져나가는 효과를 구현해보겠습니다. 이 효과는 JavaScript로 파티클을 생성하고 일정 시간 후 제거하는 방식으로 구현합니다.
예제: 클릭 시 파티클 퍼지는 애니메이션
<!DOCTYPE html>
<html lang="ko">
<head>
<title>파티클 퍼지는 애니메이션</title>
<style>
.button {
padding: 10px 20px;
font-size: 18px;
cursor: pointer;
position: relative;
overflow: hidden;
}
.particle {
position: absolute;
width: 5px;
height: 5px;
background-color: #f39c12;
border-radius: 50%;
animation: particleAnimation 0.6s forwards;
}
@keyframes particleAnimation {
to {
opacity: 0;
transform: translate(var(--x), var(--y)) scale(2);
}
}
</style>
</head>
<body>
<button class="button" id="button">Click Me</button>
<script>
const button = document.getElementById('button');
button.addEventListener('click', e => {
for (let i = 0; i < 20; i++) {
const particle = document.createElement('span');
particle.classList.add('particle');
particle.style.left = `${e.offsetX}px`;
particle.style.top = `${e.offsetY}px`;
particle.style.setProperty('--x', `${Math.random() * 100 - 50}px`);
particle.style.setProperty('--y', `${Math.random() * 100 - 50}px`);
button.appendChild(particle);
particle.addEventListener('animationend', () => {
particle.remove();
});
}
});
</script>
</body>
</html>
코드 설명
- CSS: .particle 클래스에 애니메이션을 설정하여 transform과 opacity가 변화하면서 퍼지는 효과를 줍니다.
- JavaScript: 버튼을 클릭할 때 여러 개의 파티클을 생성하고, 각각의 파티클에 animationend 이벤트를 추가해 애니메이션이 끝나면 자동으로 제거되도록 구현했습니다. 이를 통해 버튼을 클릭할 때마다 파티클이 퍼져나가는 효과를 만들 수 있습니다.
요약 - 이번 강의에서는 CSS와 JavaScript를 결합하여 사용자 상호작용에 따른 고급 애니메이션과 인터랙션 효과를 구현하는 방법을 배웠습니다. 클릭, 스크롤, 마우스 이동 등 다양한 이벤트에 반응하는 CSS 애니메이션을 적용하여, 보다 동적이고 흥미로운 사용자 경험을 제공할 수 있습니다. 다음 강의에서는 CSS로 구현할 수 있는 다양한 효과와 트릭을 통해 더욱 창의적인 디자인을 시도해 보겠습니다.
728x90