심화 가이드
애니메이션

CSS로 애플리케이션에 애니메이션 적용하기

CSS는 애플리케이션 안에서 아름답고 매력적인 애니메이션을 만드는 데 사용할 수 있는 강력한 도구를 제공합니다.

네이티브 CSS로 애니메이션 작성하기

네이티브 CSS 애니메이션을 작성해 본 적이 없다면, 시작하는 데 도움이 되는 훌륭한 가이드가 많이 있습니다. 그중 몇 가지를 소개합니다: MDN CSS 애니메이션 가이드 W3Schools CSS3 애니메이션 가이드 CSS 애니메이션 전체 튜토리얼 초보자를 위한 CSS 애니메이션

다음 동영상도 참고할 수 있습니다: 9분 만에 배우는 CSS 애니메이션 Net Ninja CSS 애니메이션 튜토리얼 재생목록

이 가이드와 튜토리얼 중 몇 가지를 살펴본 뒤 이 문서로 돌아오세요.

재사용 가능한 애니메이션 만들기

@keyframes를 사용하면 애플리케이션 전체에서 공유할 수 있는 재사용 가능한 애니메이션을 만들 수 있습니다. 공통 CSS 파일에 키프레임 애니메이션을 정의하면 애플리케이션의 원하는 곳 어디에서나 재사용할 수 있습니다.

animations.css

@keyframes sharedAnimation {
  to {
    height: 0;
    opacity: 1;
    background-color: 'red';
  }
}

.animated-class {
  animation: sharedAnimation 1s;
}

엘리먼트에 animated-class 클래스를 추가하면 해당 엘리먼트에서 애니메이션이 실행됩니다.

전환에 애니메이션 적용하기

상태와 스타일에 애니메이션 적용하기

엘리먼트가 열리거나 닫힐 때처럼 서로 다른 두 상태 사이에 애니메이션을 적용하고 싶을 수 있습니다. CSS 클래스에 키프레임 애니메이션이나 전환 스타일을 지정하면 됩니다.

animations.css

.open {
  height: '200px';
  opacity: 1;
  background-color: 'yellow';
  transition: all 1s;
}

.closed {
  height: '100px';
  opacity: 0.8;
  background-color: 'blue';
  transition: all 1s;
}

컴포넌트에서 엘리먼트의 클래스를 전환하면 open 또는 closed 상태가 실행됩니다. 방법은 템플릿 가이드의 예제를 참고하세요.

템플릿 가이드의 스타일에 직접 애니메이션 적용하기에서도 비슷한 예제를 확인할 수 있습니다.

전환, 타이밍, 이징

애니메이션을 만들 때는 타이밍, 지연 시간, 이징 동작을 조절해야 하는 경우가 많습니다. 여러 CSS 프로퍼티나 단축 프로퍼티를 사용해서 설정할 수 있습니다.

CSS 키프레임 애니메이션에는 animation-duration, animation-delay, animation-timing-function을 지정하거나, 단축 프로퍼티인 animation을 사용하세요.

animations.css

.example-element {
  animation-duration: 1s;
  animation-delay: 500ms;
  animation-timing-function: ease-in-out;
}

.example-shorthand {
  animation: exampleAnimation 1s ease-in-out 500ms;
}

마찬가지로 @keyframes를 사용하지 않는 애니메이션에는 transition-duration, transition-delay, transition-timing-function과 단축 프로퍼티 transition을 사용할 수 있습니다.

animations.css

.example-element {
  transition-duration: 1s;
  transition-delay: 500ms;
  transition-timing-function: ease-in-out;
  transition-property: margin-right;
}

.example-shorthand {
  transition: margin-right 1s ease-in-out 500ms;
}

애니메이션 실행하기

CSS 스타일이나 클래스를 전환해서 애니메이션을 실행할 수 있습니다. 엘리먼트에 클래스가 추가되면 애니메이션이 실행됩니다. 클래스를 제거하면 엘리먼트는 원래 정의된 CSS 스타일로 돌아갑니다. 다음 예제를 참고하세요:

전환과 트리거

자동 높이에 애니메이션 적용하기

CSS Grid를 사용하면 높이가 자동으로 결정되는 상태까지 애니메이션을 적용할 수 있습니다.

모든 브라우저를 지원할 필요가 없다면, 자동 높이 애니메이션을 직접 지원하는 calc-size()도 살펴보세요. 자세한 내용은 MDN 문서와 이 튜토리얼을 참고하세요.

뷰 진입과 퇴장에 애니메이션 적용하기

항목이 뷰에 진입하거나 뷰에서 퇴장할 때 실행되는 애니메이션을 만들 수 있습니다. 먼저 엘리먼트가 뷰에 진입할 때 애니메이션을 적용하는 방법을 살펴봅시다. 엘리먼트가 뷰에 진입할 때 애니메이션 클래스를 적용하는 animate.enter를 사용하겠습니다.

엘리먼트가 뷰에서 퇴장할 때 애니메이션을 적용하는 방법도 진입할 때와 비슷합니다. animate.leave로 엘리먼트가 뷰에서 퇴장할 때 적용할 CSS 클래스를 지정하세요.

참고: 자식 animate.leave 애니메이션은 같은 컴포넌트 템플릿 안에서만 실행됩니다. 부모 엘리먼트를 제거할 때 중첩된 컴포넌트 안의 animate.leave 애니메이션은 실행되지 않습니다.

animate.enter와 animate.leave에 대한 자세한 내용은 진입 및 퇴장 애니메이션 가이드를 참고하세요.

값의 증가와 감소에 애니메이션 적용하기

값이 증가하거나 감소할 때 애니메이션을 적용하는 것은 애플리케이션에서 흔히 사용하는 패턴입니다. 다음 예제에서 이 동작을 구현하는 방법을 확인할 수 있습니다.

개별 애니메이션 또는 모든 애니메이션 비활성화하기

지정한 애니메이션을 비활성화하려면 몇 가지 방법을 사용할 수 있습니다.

  1. 애니메이션과 전환을 none으로 강제 설정하는 커스텀 클래스를 만듭니다.
.no-animation {
  animation: none !important;
  transition: none !important;
}

이 클래스를 엘리먼트에 적용하면 해당 엘리먼트에서 애니메이션이 실행되지 않습니다. DOM 전체나 특정 영역에 적용해서 같은 동작을 강제할 수도 있습니다. 하지만 이 방법은 애니메이션 이벤트도 발생하지 않게 합니다. 엘리먼트를 제거하기 위해 애니메이션 이벤트를 기다리고 있다면 이 방법은 사용할 수 없습니다. 대신 지속 시간을 1밀리초로 설정하는 방법이 있습니다.

  1. prefers-reduced-motion 미디어 쿼리를 사용해서 움직임을 줄이도록 설정한 사용자에게는 애니메이션을 실행하지 않습니다.

  2. 코드에서 애니메이션 클래스가 추가되지 않도록 처리합니다.

애니메이션 콜백

애니메이션의 특정 시점에 어떤 동작을 실행하려면 여러 이벤트를 감지할 수 있습니다. 다음은 그중 일부입니다.

OnAnimationStart
OnAnimationEnd
OnAnimationIteration
OnAnimationCancel

OnTransitionStart
OnTransitionRun
OnTransitionEnd
OnTransitionCancel

Web Animations API는 이 밖에도 많은 기능을 제공합니다. 사용할 수 있는 애니메이션 API 전체는 문서를 참고하세요.

참고: 이런 콜백에서는 버블링에 주의하세요. 자식과 부모에 애니메이션을 적용하면 이벤트가 자식에서 부모로 버블링됩니다. 이벤트 전파를 중단하거나 이벤트의 상세 정보를 확인해서, 자식 노드에서 버블링된 이벤트가 아니라 의도한 대상의 이벤트에 반응하는지 판단하세요. animationname 프로퍼티나 전환 중인 프로퍼티를 조사하면 올바른 노드인지 확인할 수 있습니다.

복잡한 시퀀스

애니메이션은 단순히 서서히 나타나거나 사라지는 것보다 복잡한 경우가 많습니다. 여러 복잡한 애니메이션 시퀀스를 실행하고 싶을 수도 있습니다. 가능한 시나리오 몇 가지를 살펴봅시다.

목록 애니메이션을 시간차로 실행하기

목록의 각 항목에 애니메이션을 시간차로 적용해서 연속적으로 퍼지는 효과를 만드는 것은 흔히 사용하는 방식입니다. animation-delay나 transition-delay를 사용하면 됩니다. 다음 예제에서 CSS를 어떻게 작성하는지 확인할 수 있습니다.

병렬 애니메이션

단축 프로퍼티 animation을 사용하면 엘리먼트 하나에 여러 애니메이션을 동시에 적용할 수 있습니다. 각 애니메이션에 서로 다른 지속 시간과 지연 시간을 지정할 수 있습니다. 이렇게 애니메이션을 조합해서 복잡한 효과를 만들 수 있습니다.

.target-element {
  animation:
    rotate 3s,
    fade-in 2s;
}

이 예제에서는 rotate와 fade-in 애니메이션이 동시에 시작하지만, 지속 시간은 서로 다릅니다.

순서가 바뀌는 목록 항목에 애니메이션 적용하기

@for 반복문의 항목은 제거된 뒤 다시 추가되며, 이때 @starting-styles를 사용하는 진입 애니메이션이 실행됩니다. 같은 동작을 구현하기 위해 animate.enter를 사용할 수도 있습니다. 아래 예제처럼 엘리먼트가 제거될 때 애니메이션을 적용하려면 animate.leave를 사용하세요.

코드에서 애니메이션 제어하기

Element.getAnimations()로 엘리먼트의 애니메이션을 직접 가져올 수 있습니다. 이 메서드는 해당 엘리먼트의 모든 Animation을 배열로 반환합니다. Animation API를 사용하면 애니메이션 패키지의 AnimationPlayer가 제공했던 것보다 훨씬 많은 작업을 할 수 있습니다. cancel(), play(), pause(), reverse() 등 다양한 메서드를 사용할 수 있습니다. 이 네이티브 API는 애니메이션을 제어하는 데 필요한 모든 기능을 제공합니다.

Angular 애니메이션 더 알아보기

다음 문서도 참고해 보세요: