본문 바로가기
Study/CSS

CSS 기초 강의 13편: CSS와 JavaScript를 결합한 고급 애니메이션과 인터랙션

by wawManager 2024. 11. 28.
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