CSS 애니메이션 레벨 1

W3C 워킹 드래프트,

이 문서에 대한 자세한 정보
이 버전:
https://www.w3.org/TR/2023/WD-css-animations-1-20230302/
최신 공개 버전:
https://www.w3.org/TR/css-animations-1/
에디터스 드래프트:
https://drafts.csswg.org/css-animations/
이전 버전:
히스토리:
https://www.w3.org/standards/history/css-animations-1
테스트 스위트:
http://test.csswg.org/suites/css-animations-1_dev/nightly-unstable/
피드백:
CSSWG 이슈 저장소
명세 내 인라인
에디터:
(Apple Inc.)
L. David Baron (Google)
Tab Atkins Jr. (Google)
(초청 전문가)
이전 에디터:
David Hyatt (Apple Inc.)
Chris Marrin (Apple Inc.)
(Adobe)
명세 수정 제안:
GitHub 에디터
이슈 목록:
https://github.com/w3c/csswg-drafts/labels/css-animations-1

요약

이 CSS 모듈은 작성자가 keyframe을 사용하여 CSS 속성 값들을 시간에 따라 애니메이션하는 방법을 설명합니다. 이러한 keyframe 애니메이션의 동작은 지속 시간, 반복 횟수, 반복 동작을 지정하여 제어할 수 있습니다.

CSS는 구조화된 문서(HTML 및 XML 등)의 렌더링을 화면이나 종이 등에서 설명하기 위한 언어입니다.

이 문서의 상태

이 섹션은 문서가 발행된 시점의 상태를 설명합니다. 현재 W3C 발행물 목록과 이 기술 보고서의 최신 개정판은 W3C 기술 보고서 인덱스 https://www.w3.org/TR/에서 확인할 수 있습니다.

이 문서는 CSS 작업 그룹에서 작업 초안으로, 권고 트랙을 사용하여 발행되었습니다. 작업 초안으로 발행되었다고 해서 W3C 및 그 회원의 승인이나 지지를 의미하지는 않습니다.

이 문서는 초안 문서로, 언제든지 다른 문서로 업데이트, 교체 또는 폐기될 수 있습니다. 진행 중인 작업 외의 용도로 인용하는 것은 적절하지 않습니다.

피드백은 GitHub에서 이슈 등록(권장)에 의해 보내주시고, 제목에 명세 코드 “css-animations”를 포함하여 다음과 같이 작성해 주세요: “[css-animations] …의견 요약…”. 모든 이슈와 의견은 아카이브됩니다. 또는 피드백은 (아카이브됨) 공개 메일링 리스트 www-style@w3.org로 보낼 수 있습니다.

이 문서는 2021년 11월 2일 W3C 프로세스 문서에 따라 관리됩니다.

이 문서는 W3C 특허 정책에 따라 운영되는 그룹에 의해 제작되었습니다. W3C는 해당 그룹의 산출물과 관련하여 이루어진 공개 특허 공개 목록을 유지하고 있습니다; 해당 페이지에는 특허 공개 방법도 포함되어 있습니다. 특정 특허가 필수 청구항을 포함한다고 생각하는 경우, W3C 특허 정책 6조에 따라 정보를 공개해야 합니다.

1. 소개

이 섹션은 규범적인 내용이 아닙니다

CSS 트랜지션 [CSS3-TRANSITIONS]은 CSS 속성 값이 변경될 때 그 값을 보간하는 방법을 제공합니다. 이를 통해 간단한 애니메이션을 쉽게 만들 수 있지만, 애니메이션의 시작 및 종료 상태는 기존 속성 값에 의해 제어되며, 트랜지션은 애니메이션이 진행되는 방식에 대해 작성자가 제어할 수 있는 부분이 적습니다.

이 제안은 작성자가 시간에 따라 CSS 속성의 변화를 키프레임 세트로 지정할 수 있는 정의된 애니메이션을 도입합니다. 애니메이션은 트랜지션처럼 시간에 따라 CSS 속성의 표현 값을 변경한다는 점에서 비슷합니다. 주된 차이점은 트랜지션은 속성 값이 변경될 때 암묵적으로 트리거되는 반면, 애니메이션은 애니메이션 속성이 적용될 때 명시적으로 실행된다는 것입니다. 이러한 이유로, 애니메이션은 애니메이션되는 속성의 명시적인 값이 필요합니다. 이러한 값은 아래에서 설명하는 애니메이션 키프레임을 사용해 지정됩니다.

애니메이션의 반복 횟수, 시작 및 종료 값 사이의 교대 여부, 애니메이션의 실행 또는 일시정지 상태, 시작 지연 등 애니메이션의 다양한 측면을 제어할 수 있습니다.

1.1. 값 정의

이 명세는 CSS 속성 정의 규칙[CSS2]에서 따르며, 값 정의 문법[CSS-VALUES-3]에서 사용합니다. 이 명세에서 정의되지 않은 값 유형은 CSS Values & Units [CSS-VALUES-3]에서 정의됩니다. 다른 CSS 모듈과의 결합으로 값 유형의 정의가 확장될 수 있습니다.

각 속성 정의에 명시된 속성별 값 외에도, 이 명세에서 정의된 모든 속성은 CSS 전체 키워드를 속성 값으로 사용할 수 있습니다. 가독성을 위해 명시적으로 반복하지 않았습니다.

2. 애니메이션

CSS 애니메이션은 계산된 속성 값에 영향을 미칩니다. 이 효과는 CSS cascade ([CSS3CASCADE]) 내에서 (CSS 애니메이션 수준에서) 지정된 값을 추가하여 애니메이션의 현재 상태에 맞는 올바른 계산값을 생성함으로써 발생합니다. [CSS3CASCADE]에서 정의된 바와 같이, 애니메이션은 모든 일반 규칙을 오버라이드하지만, !important 규칙에 의해 오버라이드됩니다.

일정 시점에 여러 애니메이션이 동일한 속성에 대해 동작을 지정하는 경우, animation-name 값에서 마지막에 나타나는 애니메이션이 해당 시점에서 다른 애니메이션을 오버라이드합니다.

애니메이션은 적용되기 전에는 계산된 값에 영향을 주지 않으며 (즉, animation-name 속성이 요소에 설정될 때), 또는 제거된 후에도 영향을 주지 않습니다. 또한 일반적으로 애니메이션 지연이 끝나기 전이나 애니메이션이 끝난 후에는 계산값에 영향을 주지 않지만, animation-fill-mode 속성에 따라 달라질 수 있습니다.

실행 중일 때, 애니메이션은 애니메이션된 속성의 값을 계산합니다. 다른 값은 CSS cascade ([CSS3CASCADE])에 따라 애니메이션 값보다 우선될 수 있습니다.

애니메이션이 적용되어 있지만 끝나지 않았거나, 끝났지만 animation-fill-modeforwards 또는 both인 경우, 사용자 에이전트는 요소의 will-change 속성 ([css-will-change-1])이 해당 애니메이션이 애니메이션하는 모든 속성을 추가로 포함하는 것처럼 동작해야 합니다.

애니메이션의 시작 시간은 애니메이션을 적용하는 스타일과 해당하는 @keyframes 규칙이 모두 해석되는 시간입니다. 요소에 애니메이션이 지정되어 있지만 해당하는 @keyframes 규칙이 아직 존재하지 않으면, 애니메이션은 시작할 수 없습니다. 일치하는 @keyframes 규칙이 해석될 수 있게 되면 애니메이션은 처음부터 시작합니다. 요소의 스타일을 동적으로 수정하여 지정된 애니메이션은 해당 스타일이 해석될 때 시작되며, hover와 같은 의사 스타일 규칙의 경우 즉시 시작될 수 있고, 스크립트에 의해 스타일이 적용된 경우 브라우저로 스크립팅 엔진이 제어를 반환할 때 시작될 수 있습니다. 키프레임 스타일 규칙을 동적으로 업데이트해도 애니메이션이 시작되거나 재시작되지는 않습니다.

애니메이션은 그 이름이 animation-name 속성의 계산된 값 중 하나의 식별자로 나타나고, 애니메이션이 유효한 @keyframes 규칙을 사용할 때 요소에 적용됩니다. 애니메이션이 시작되면 종료되거나 animation-name이 제거될 때까지 계속됩니다. 애니메이션 속성의 값이 애니메이션 실행 중에 변경되면, 애니메이션이 시작했을 때 해당 값이 적용된 것처럼 동작합니다. 예를 들어, animation-delay를 짧게 하면, 애니메이션이 앞으로 점프하거나 즉시 끝나 animationend 이벤트가 발생할 수 있습니다. 반대로, animation-delay를 늘리면 애니메이션이 다시 시작되고 animationstart 이벤트가 발생할 수 있습니다.

동일한 @keyframes 규칙 이름은 animation-name 내에서 반복될 수 있습니다. animation-name을 변경하면, 새로운 애니메이션 목록을 마지막부터 처음까지 반복하여, 각 애니메이션에 대해 기존 애니메이션 목록에서 마지막으로 일치하는 애니메이션을 찾습니다. 일치 항목이 있으면, 기존 애니메이션은 새로운 애니메이션 목록에서 해당 위치의 애니메이션 속성으로 갱신되며, 현재 재생 시간은 위에서 설명한 대로 유지됩니다. 일치한 애니메이션은 기존 애니메이션 목록에서 제거되어 두 번 일치하지 않습니다. 일치 항목이 없으면 새 애니메이션이 생성됩니다. 결과적으로 animation-name을 ‘a’에서 ‘a, a’로 변경하면 기존 ‘a’ 애니메이션이 목록의 두 번째 애니메이션이 되고, 첫 번째 항목에 대해 새 애니메이션이 생성됩니다.

div {
  animation-name: diagonal-slide;
  animation-duration: 5s;
  animation-iteration-count: 10;
}

@keyframes diagonal-slide {

  from {
    left: 0;
    top: 0;
  }

  to {
    left: 100px;
    top: 100px;
  }

}

이 코드는 요소를 (0, 0)에서 (100px, 100px)로 5초 동안 이동시키며, 9번 반복되어 총 10회 반복됩니다.

display 속성을 none으로 설정하면 해당 요소 및 그 자손에 적용된 실행 중인 애니메이션이 종료됩니다. 요소의 displaynone인 경우, displaynone이 아닌 값으로 변경하면, animation-name 속성으로 요소에 적용된 모든 애니메이션과, displaynone이 아닌 자손에 적용된 모든 애니메이션이 시작됩니다.

작성자는 애니메이션을 이용해 동적으로 변화하는 콘텐츠를 만들 수 있지만, 동적으로 변화하는 콘텐츠는 일부 사용자에게 발작을 유발할 수 있습니다. 발작을 유발할 수 있는 콘텐츠를 피하는 방법은 Guideline 2.3: Seizures: 발작을 유발하는 것으로 알려진 방식으로 콘텐츠를 설계하지 마십시오 ([WCAG20])을 참조하세요.

구현체는 렌더링 미디어가 상호작용적이지 않을 때(예: 인쇄 시) 애니메이션을 무시할 수 있습니다. 향후 버전의 이 명세에서는 이러한 미디어에 대한 애니메이션 렌더링 방법을 정의할 수 있습니다.

3. 키프레임

키프레임은 애니메이션이 진행되는 동안 애니메이션되는 속성의 값을 다양한 시점에 지정하는 데 사용됩니다. 키프레임은 애니메이션의 한 사이클의 동작을 지정하며, 애니메이션은 0회 이상 반복될 수 있습니다.

키프레임은 다음과 같이 정의된 @keyframes at-규칙을 사용하여 지정합니다:

@keyframes = @keyframes <keyframes-name> { <rule-list> }

<keyframes-name> = <custom-ident> | <string>

<keyframe-block> = <keyframe-selector># { <declaration-list> }

<keyframe-selector> = from | to | <percentage [0,100]>

<rule-list>@keyframes 내부에서 <keyframe-block> 규칙만 포함할 수 있습니다.

<declaration-list><keyframe-block> 내부에서 이 명세에서 정의된 속성을 제외한 모든 CSS 속성을 허용하지만, animation-timing-function 속성은 허용되며 특별하게 해석됩니다. 모든 속성은 cascade와 상호작용하지 않으므로 !important를 사용하면 무효이며, 해당 속성은 무시됩니다.

@keyframes 블록은 프렐루드에 있는 <custom-ident> 또는 <string> 값으로 이름이 지정됩니다. 두 문법은 기능적으로 동등하며, 이름은 ident 또는 string의 값입니다. <custom-ident><string>은 일반적으로 완전히 대소문자 구분되며, 두 이름이 코드포인트별로 동일할 때만 같다고 봅니다. <custom-ident>none 키워드를 추가로 제외합니다.

예를 들어, 다음 두 @keyframes 규칙은 이름이 동일하므로, 첫 번째 규칙은 무시됩니다:
@keyframes foo { /* ... */ }
@keyframes "foo" { /* ... */ }

반면, 다음 @keyframes 규칙의 이름은 이전 두 규칙과 다릅니다:

@keyframes FOO { /* ... */ }

다음 @keyframes 규칙은 허용되지 않는 <custom-ident> 값을 사용하므로 무효입니다:

@keyframes initial { /* ... */ }
@keyframes None { /* ... */ }

하지만, 이러한 이름은 <string>으로 지정하면 유효합니다:

@keyframes "initial" { /* ... */ }
@keyframes "None" { /* ... */ }

<keyframe-selector><keyframe-block>에 대해 쉼표로 구분된 백분율 값 또는 from 또는 to 키워드로 구성됩니다. 선택자는 키프레임이 애니메이션의 전체 지속 시간 중 어느 시점에 해당하는지 백분율로 지정합니다. 키프레임은 선택자에 선언된 속성 값 블록으로 지정됩니다. from 키워드는 0% 값과 동일하며, to 키워드는 100% 값과 동일합니다. 0% 미만이나 100% 초과 값은 무효이며, 해당 <keyframe-block>은 무시됩니다.

백분율 값에는 반드시 단위(%)가 포함되어야 합니다. 따라서 0은 유효한 키프레임 선택자가 아닙니다.

0% 또는 from 키프레임이 지정되지 않으면, 사용자 에이전트가 애니메이션될 속성의 계산된 값으로 0% 키프레임을 생성합니다. 100% 또는 to 키프레임이 지정되지 않으면, 사용자 에이전트가 애니메이션될 속성의 계산된 값으로 100% 키프레임을 생성합니다.

<keyframe-block>에는 속성과 값이 포함됩니다. 이 명세에서 정의된 속성은 animation-timing-function을 제외하고 무시됩니다. 또한 !important가 붙은 속성은 무효이며 무시됩니다.

동일한 이름의 @keyframes 규칙이 여러 개 정의된 경우, 문서 순서상 마지막 규칙만 적용되며, 그 이전 규칙들은 모두 무시됩니다.

div {
  animation-name: slide-right;
  animation-duration: 2s;
}

@keyframes slide-right {

  from {
    margin-left: 0px;
  }

  50% {
    margin-left: 110px;
    opacity: 1;
  }

  50% {
    opacity: 0.9;
  }

  to {
    margin-left: 200px;
  }

}

위의 두 50% 규칙은 아래와 같이 하나의 규칙으로 합쳐서 동일하게 만들 수 있습니다:

@keyframes slide-right {

  from {
    margin-left: 0px;
  }

  50% {
    margin-left: 110px;
    opacity: 0.9;
  }

  to {
    margin-left: 200px;
  }

}

키프레임 집합을 결정할 때, 선택자에 있는 모든 값은 시간 기준으로 오름차순 정렬됩니다. @keyframes 규칙 내의 규칙은 cascade되며, 동일한 선택자 값에 대해 여러 @keyframes 규칙의 속성이 적용될 수 있습니다.

특정 키프레임에 대해 속성이 지정되지 않았거나, 지정되었지만 무효인 경우 해당 속성의 애니메이션은 해당 키프레임이 존재하지 않는 것처럼 진행됩니다. 개념적으로, 모든 키프레임에 등장하는 각 속성에 대해 키프레임 집합이 만들어지고, 각 속성마다 독립적으로 애니메이션이 실행되는 것과 같습니다.

@keyframes wobble {
  0% {
    left: 100px;
  }

  40% {
    left: 150px;
  }

  60% {
    left: 75px;
  }

  100% {
    left: 100px;
  }
}

"wobble"라는 이름의 애니메이션에 대해 네 개의 키프레임이 지정되어 있습니다. 첫 번째 키프레임(애니메이션 사이클의 시작)에서는 애니메이션되는 left 속성 값이 100px입니다. 애니메이션 기간의 40% 시점에서 left150px로 애니메이션됩니다. 60% 시점에서는 left가 다시 75px로 이동합니다. 사이클의 마지막에는 left 값이 100px으로 돌아옵니다. 아래 다이어그램은 애니메이션 기간이 10s일 때의 상태를 보여줍니다.

키프레임으로 지정된 애니메이션 상태

이 명세는 CSS 트랜지션의 트랜지션 적용 섹션처럼, 키프레임에서 값이 어떻게 결정되는지 정의되어야 합니다.

3.1. 키프레임의 타이밍 함수

키프레임 스타일 규칙에서는 애니메이션이 다음 키프레임으로 이동할 때 사용할 타이밍 함수를 선언할 수도 있습니다.

@keyframes bounce {

  from {
    top: 100px;
    animation-timing-function: ease-out;
  }

  25% {
    top: 50px;
    animation-timing-function: ease-in;
  }

  50% {
    top: 100px;
    animation-timing-function: ease-out;
  }

  75% {
    top: 75px;
    animation-timing-function: ease-in;
  }

  to {
    top: 100px;
  }

}

"bounce" 이름의 애니메이션에 대해 다섯 개의 키프레임이 지정되어 있습니다. 첫 번째와 두 번째 키프레임(0%와 25% 사이)에서는 ease-out 타이밍 함수가 사용됩니다. 두 번째와 세 번째 키프레임(25%와 50% 사이)에서는 ease-in 타이밍 함수가 사용됩니다. 이와 같이 반복됩니다. 효과는 요소가 페이지 위로 50px 이동하며, 최고점에 도달할 때는 느려지고 다시 100px로 떨어질 때는 빨라지는 것처럼 보입니다. 애니메이션의 후반부도 유사하게 동작하지만, 요소가 25px만 위로 이동합니다.

to 또는 100% 키프레임에 지정된 타이밍 함수는 무시됩니다.

자세한 내용은 animation-timing-function 속성을 참조하세요.

3.2. animation-name 속성

animation-name 속성은 적용할 애니메이션 목록을 정의합니다. 각 이름은 애니메이션에 대한 속성 값을 제공하는 키프레임 at-규칙을 선택하는 데 사용됩니다. 이름이 어떠한 키프레임 at-규칙과도 일치하지 않으면 애니메이션되는 속성이 없으므로 애니메이션이 실행되지 않습니다. 또한, 애니메이션 이름이 none이면 애니메이션이 없습니다. 이는 cascade로부터 오는 애니메이션을 덮어쓰는 데 사용할 수 있습니다. 여러 애니메이션이 동일한 속성을 수정하려고 할 경우, 이름 목록의 끝에 가까운 애니메이션이 우선합니다.

이름으로 나열된 각 애니메이션은 아래에 나열된 다른 애니메이션 속성에 대해 해당하는 값을 가져야 합니다. 다른 애니메이션 속성의 값 목록 길이가 같지 않으면, animation-name 목록의 길이가 애니메이션 시작 시 각 목록에서 검사할 항목 수를 결정합니다. 목록은 첫 번째 값부터 맞춰집니다. 끝에 초과된 값은 사용되지 않습니다. 다른 속성 중 값이 부족하면, UA는 목록 값을 반복해서 충분히 채웁니다. 이 잘림 또는 반복은 계산된 값에는 영향을 주지 않습니다.

참고: 이는 background-* 속성의 동작과 유사하며, background-imageanimation-name과 유사하게 동작합니다.

Name: animation-name
Value: [ none | <keyframes-name> ]#
Initial: none
Applies to: 모든 요소
Inherited: 아님
Percentages: N/A
Computed value: 목록, 각 항목은 대소문자 구분 css 식별자이거나 none 키워드임
Canonical order: 문법 순서대로
Animation type: 애니메이션 불가

animation-name 값의 의미는 다음과 같습니다:

none
키프레임이 전혀 지정되지 않으므로 애니메이션이 없습니다. 이 애니메이션에 대해 지정된 다른 애니메이션 속성은 아무 효과가 없습니다.
<keyframes-name>
애니메이션은 지정된 <keyframes-name> 이름의 키프레임을 사용합니다(존재하는 경우). 해당 이름의 @keyframes 규칙이 없으면 애니메이션이 없습니다.

3.3. animation-duration 속성

animation-duration 속성은 단일 애니메이션 사이클의 지속 시간을 정의합니다.

Name: animation-duration
Value: <time [0s,∞]>#
Initial: 0s
Applies to: 모든 요소
Inherited: 아님
Percentages: N/A
Computed value: 목록, 각 항목은 duration 값
Canonical order: 문법 순서대로
Animation type: 애니메이션 불가
<time [0s,∞]>
<time>은 애니메이션이 한 사이클을 완료하는 데 걸리는 시간을 지정합니다. 음수 <time> 값은 무효입니다.

<time>0s일 때(초기값과 같음), 애니메이션의 키프레임은 효과가 없지만 애니메이션 자체는 즉시 발생합니다. 구체적으로 시작 및 종료 이벤트가 발생합니다. 만약 animation-fill-modebackwards 또는 both로 설정되어 있다면, animation-direction에 의해 정의된 애니메이션의 첫 프레임이 animation-delay 동안 표시됩니다. animation-delay 이후에는 animation-direction에 의해 정의된 애니메이션의 마지막 프레임이 animation-fill-modeforwards 또는 both일 때 표시됩니다. animation-fill-modenone이면, 애니메이션은 시각적 효과가 없습니다.

3.4. animation-timing-function 속성

animation-timing-function 속성은 애니메이션이 각 키프레임 쌍 사이에서 어떻게 진행될지 기술합니다. 타이밍 함수는 별도의 CSS Easing Functions 모듈 [css-easing-1]에서 정의됩니다.

사용되는 input progress valueanimation-direction 속성의 효과가 적용된 후, 현재 키프레임과 다음 키프레임 사이에 경과한 시간의 백분율입니다.

animation-delay 동안에는 animation-timing-function이 적용되지 않습니다.

참고: 이 정의가 필요한 이유는, 그렇지 않으면 step easing functionstep positionstart일 때, 함수의 첫 단계 꼭대기와 동일한 backwards fill이 생성되기 때문입니다.

output progress value는 현재 키프레임과 다음 키프레임 사이의 속성 값을 보간할 때 p 값으로 사용됩니다.

Name: animation-timing-function
Value: <easing-function>#
Initial: ease
Applies to: 모든 요소
Inherited: 아님
Percentages: N/A
Computed value: 목록, 각 항목은 계산된 <easing-function>
Canonical order: 문법 순서대로
Animation type: 애니메이션 불가

키프레임에서 지정된 경우, animation-timing-function은 애니메이션되는 속성에 대해 현재 키프레임과 다음 키프레임(정렬된 키프레임 선택자 순서, 암시적 100% 키프레임일 수 있음) 사이의 애니메이션 진행을 정의합니다.

3.5. animation-iteration-count 속성

animation-iteration-count 속성은 애니메이션 사이클이 재생되는 횟수를 지정합니다. 초기값은 1로, 애니메이션이 처음부터 끝까지 한 번만 재생됨을 의미합니다. 이 속성은 종종 animation-direction 값이 alternate일 때 함께 사용되며, 이 경우 애니메이션이 번갈아 역방향으로 재생됩니다.

애니메이션이 활성화되는 시간 창 (duration x iteration-count) 을 active duration이라고 합니다.

Name: animation-iteration-count
Value: <single-animation-iteration-count>#
Initial: 1
Applies to: 모든 요소
Inherited: 아님
Percentages: N/A
Computed value: 목록, 각 항목은 숫자 또는 infinite 키워드
Canonical order: 문법 순서대로
Animation type: 애니메이션 불가

<single-animation-iteration-count> = infinite | <number [0,∞]>

infinite
애니메이션이 무한 반복됩니다.
<number [0,∞]>

애니메이션은 지정한 횟수만큼 반복됩니다. 숫자가 정수가 아니면, 애니메이션은 마지막 사이클 중간에 종료됩니다. 음수 숫자는 무효입니다.

0 값도 유효하며, animation-duration0s일 때와 마찬가지로, 애니메이션이 즉시 발생합니다.

애니메이션의 지속 시간이 0s이면, animation-iteration-count의 모든 유효 값(예: infinite)에 대해 즉시 애니메이션이 발생합니다.

3.6. animation-direction 속성

animation-direction 속성은 애니메이션이 일부 또는 모든 사이클에서 역방향으로 재생되어야 하는지 정의합니다. 애니메이션이 역방향으로 재생될 때는 타이밍 함수도 역방향으로 적용됩니다. 예를 들어, 역방향으로 재생할 때 ease-in 애니메이션은 ease-out 애니메이션처럼 보입니다.

Name: animation-direction
Value: <single-animation-direction>#
Initial: normal
Applies to: 모든 요소
Inherited: 아님
Percentages: N/A
Computed value: 목록, 각 항목은 명시된 키워드
Canonical order: 문법 순서대로
Animation type: 애니메이션 불가

<single-animation-direction> = normal | reverse | alternate | alternate-reverse

normal
애니메이션의 모든 반복이 지정된 대로 재생됩니다.
reverse
애니메이션의 모든 반복이 지정된 방식과 반대 방향으로 재생됩니다.
alternate
애니메이션 사이클의 홀수 번째 반복은 정상 방향으로, 짝수 번째 반복은 역방향으로 재생됩니다.
alternate-reverse
애니메이션 사이클의 홀수 번째 반복은 역방향으로, 짝수 번째 반복은 정상 방향으로 재생됩니다.

참고: 반복이 홀수인지 짝수인지 판단할 때 반복은 1부터 셉니다.

3.7. animation-play-state 속성

animation-play-state 속성은 애니메이션이 실행 중인지 일시정지 상태인지를 정의합니다.

Name: animation-play-state
Value: <single-animation-play-state>#
Initial: running
적용 대상: 모든 요소
상속: 아님
퍼센트: N/A
계산된 값: 목록, 각 항목은 명시된 키워드
정식 순서: 문법 순서대로
애니메이션 타입: 애니메이션 불가

<single-animation-play-state> = running | paused

running
이 속성이 running으로 설정되어 있으면, 애니메이션은 정상적으로 진행됩니다.
paused
이 속성이 paused로 설정되어 있으면, 애니메이션이 일시정지됩니다. 애니메이션은 일시정지되기 전까지의 진행 상태로 요소에 계속 적용됩니다. 다시 running으로 변경하면, 중단된 시점부터 다시 시작합니다. 즉, 애니메이션을 제어하는 "시계"가 멈췄다가 다시 시작된 것처럼 동작합니다.

애니메이션 지연 단계에서 paused로 설정되면, 지연 타이머도 일시정지되며, animation-play-state가 다시 running으로 바뀌는 순간 다시 시작됩니다.

3.8. animation-delay 속성

animation-delay 속성은 애니메이션이 언제 시작할지를 정의합니다. 이 속성을 사용하면 애니메이션이 적용된 후 일정 시간 후에 실행을 시작하거나, 적용되기 이전에 이미 실행이 시작된 것처럼 보이게 할 수 있습니다.

Name: animation-delay
Value: <time>#
Initial: 0s
적용 대상: 모든 요소
상속: 아님
퍼센트: N/A
계산된 값: 목록, 각 항목은 duration 값
정식 순서: 문법 순서대로
애니메이션 타입: 애니메이션 불가
<time>
<time>은 애니메이션이 시작되는 시점(이 속성들을 통해 요소에 애니메이션이 적용된 시점)과 실제 실행이 시작되는 시점 사이의 지연 시간을 정의합니다. 0s (초기값)이면 애니메이션은 적용되는 즉시 실행됩니다.

음수 지연 값도 유효합니다. 0s 지연과 유사하게, 애니메이션이 즉시 실행되지만, 지연의 절대값만큼 자동으로 진행된 것처럼 처리되어, 애니메이션이 지정된 시간 전에 시작된 것처럼 보입니다. 따라서 active duration의 중간에서 시작하는 것처럼 나타납니다. 만약 애니메이션의 키프레임에 암시적 시작값이 있으면, 애니메이션이 시작되는 시점의 값을 사용하며, 과거의 값을 사용하지 않습니다.

3.9. animation-fill-mode 속성

animation-fill-mode 속성은 애니메이션이 실행되지 않는 시간에 어떤 값이 적용될지 정의합니다. 기본적으로 애니메이션은 적용된 시점(animation-name 속성이 요소에 설정된 시점)과 실제 실행되는 시점(animation-delay 속성에 의해 결정됨) 사이에는 속성 값에 영향을 주지 않습니다. 또한, 애니메이션이 끝난 후(animation-durationanimation-iteration-count 속성에 의해 결정됨)에는 영향이 없습니다. animation-fill-mode 속성은 이러한 동작을 변경할 수 있습니다. 속성의 동적 업데이트는 필요에 따라 애니메이션 지연 중이나 애니메이션 종료 후에도 속성 값에 반영됩니다.

Name: animation-fill-mode
Value: <single-animation-fill-mode>#
Initial: none
적용 대상: 모든 요소
상속: 아님
퍼센트: N/A
계산된 값: 목록, 각 항목은 명시된 키워드
정식 순서: 문법 순서대로
애니메이션 타입: 애니메이션 불가

<single-animation-fill-mode> = none | forwards | backwards | both

none
애니메이션이 적용되어 있지만 실행 중이 아닐 때는 아무런 효과가 없습니다.
forwards
애니메이션이 끝난 후(animation-iteration-count에 의해 결정됨), 애니메이션은 종료 시점의 속성 값을 적용합니다. animation-iteration-count가 0보다 큰 정수인 경우, 마지막으로 완료된 반복의 종료값이 적용됩니다(다음 반복의 시작값이 아니라). animation-iteration-count가 0이면, 첫 번째 반복의 시작값이 적용됩니다(animation-fill-modebackwards인 경우와 동일).
backwards
animation-delay로 정의된 기간 동안, 애니메이션은 첫 번째 반복이 시작될 때의 키프레임 값(즉, from 키프레임, animation-directionnormal 또는 alternate인 경우) 또는 to 키프레임 값(animation-directionreverse 또는 alternate-reverse인 경우)을 적용합니다.
both
forwardsbackwards fill의 효과가 모두 적용됩니다.

3.10. animation 단축 속성

animation 단축 속성은 애니메이션 정의의 쉼표로 구분된 목록입니다. 목록의 각 항목은 단축 속성의 모든 하위 속성(즉, 애니메이션 속성)의 값을 제공합니다. (다른 애니메이션 속성의 값 목록 길이가 다를 때 어떻게 처리되는지는 animation-name 정의를 참고하세요. animation 단축 속성만 사용할 때는 이 문제가 발생하지 않습니다.)

Name: animation
Value: <single-animation>#
Initial: 개별 속성 참조
적용 대상: 모든 요소
상속: 아님
퍼센트: N/A
계산된 값: 개별 속성 참조
정식 순서: 문법 순서대로
애니메이션 타입: 애니메이션 불가

<single-animation> = <time> || <easing-function> || <time> || <single-animation-iteration-count> || <single-animation-direction> || <single-animation-fill-mode> || <single-animation-play-state> || [ none | <keyframes-name> ]

각 애니메이션 정의 내에서 값의 순서가 중요합니다: 각 <single-animation>에서 <time>로 해석될 수 있는 첫 번째 값은 animation-duration에, 두 번째 <single-animation>에서 <time>로 해석될 수 있는 값은 animation-delay에 할당됩니다.

각 애니메이션 정의 내에서 <keyframes-name> 값을 다른 키워드와 구분하는 데에도 순서가 중요합니다. 파싱 시, 단축 속성에서 이전에 찾지 못한 다른 속성에 유효한 키워드는 animation-name이 아닌 다른 속성에 적용되어야 합니다. 또한, 직렬화 시에는 animation-name이 다른 속성 값이 될 수 있음을 구분하기 위해 최소한의 경우에 다른 속성의 기본값을 출력해야 하며, 추가로 출력할 수도 있습니다.

예를 들어, animation: 3s none backwards에서 (animation-fill-modenone이고 animation-namebackwards인 경우) animation: 3s backwards로 직렬화되어서는 안 됩니다 (animation-fill-modebackwards이고 animation-namenone인 경우).

4. 애니메이션 이벤트

여러 애니메이션 관련 이벤트가 DOM Event 시스템을 통해 제공됩니다. 애니메이션의 시작 및 종료, 그리고 각 반복의 종료 시 DOM 이벤트가 발생합니다. 하나의 요소에서 여러 속성이 동시에 애니메이션될 수 있습니다. 이는 하나의 animation-name 값이 여러 속성을 포함한 키프레임을 가지거나, 복수의 animation-name 값을 가질 때 발생할 수 있습니다. 이벤트 측면에서 각 animation-name은 하나의 애니메이션을 지정하므로, 이벤트는 각 animation-name 값마다 발생하며, 애니메이션되는 각 속성마다 발생하는 것은 아닙니다.

유효한 키프레임 규칙이 정의된 모든 애니메이션은 실행되고 이벤트를 발생시킵니다. 이는 키프레임 규칙이 비어 있어도 해당됩니다.

애니메이션이 실행된 시간은 각 이벤트와 함께 제공됩니다. 이를 통해 이벤트 핸들러는 반복 애니메이션의 현재 반복 또는 교대 애니메이션의 현재 위치를 알 수 있습니다. 이 시간에는 paused 상태에서의 시간은 포함되지 않습니다.

4.1. AnimationEvent 인터페이스

AnimationEvent 인터페이스는 애니메이션 이벤트에 연결된 특정 컨텍스트 정보를 제공합니다.

4.1.1. IDL 정의

[Exposed=Window]
interface AnimationEvent : Event {
  constructor(CSSOMString type, optional AnimationEventInit animationEventInitDict = {});
  readonly attribute CSSOMString animationName;
  readonly attribute double elapsedTime;
  readonly attribute CSSOMString pseudoElement;
};
dictionary AnimationEventInit : EventInit {
  CSSOMString animationName = "";
  double elapsedTime = 0.0;
  CSSOMString pseudoElement = "";
};

4.1.2. 속성

animationName, 타입 CSSOMString, 읽기 전용
이벤트가 발생한 애니메이션의 animation-name 속성 값입니다.
elapsedTime, 타입 double, 읽기 전용
이벤트가 발생했을 때 애니메이션이 실행된 시간(초 단위, 일시정지된 시간 제외)입니다. 이 멤버의 정확한 계산은 각 이벤트 타입에 따라 정의되어 있습니다.
pseudoElement, 타입 CSSOMString, 읽기 전용
애니메이션이 실행되는 CSS 의사 요소의 이름(::으로 시작, 이 경우 이벤트 대상은 해당 의사 요소의 연결된 요소), 또는 애니메이션이 요소에서 실행되는 경우 빈 문자열(이 경우 이벤트 대상은 해당 요소)입니다.

AnimationEvent(type, animationEventInitDict)이벤트 생성자입니다.

4.2. AnimationEvent의 종류

발생할 수 있는 애니메이션 이벤트의 유형은 다음과 같습니다:

animationstart
animationstart 이벤트는 애니메이션이 시작될 때 발생합니다. animation-delay가 있으면 지연 기간이 끝난 후 이벤트가 발생합니다.

음수 delay가 있으면, elapsedTime 값이 delay의 절대값(최대 active duration 까지)으로 설정되어 발생합니다. min(max(-animation-delay, 0), active duration); 이 경우 이벤트는 animation-play-staterunning이든 paused이든 발생합니다.

  • 버블링: 예
  • 취소 가능: 아니오
  • 컨텍스트 정보: animationName, elapsedTime, pseudoElement
animationend
animationend 이벤트는 애니메이션이 완료될 때 발생합니다. 이때 이벤트의 elapsedTime 값은 active duration과 같습니다.
  • 버블링: 예
  • 취소 가능: 아니오
  • 컨텍스트 정보: animationName, elapsedTime, pseudoElement
animationiteration
animationiteration 이벤트는 애니메이션의 각 반복이 끝날 때 발생합니다(단, 동일한 시점에 animationend 이벤트가 발생하는 경우 제외). 즉, 반복 횟수가 1 이하인 애니메이션에는 이 이벤트가 발생하지 않습니다.

이때 elapsedTime 값은 현재 반복 × animation-duration 입니다. 현재 반복은 0부터 시작하는 인덱스입니다. 예를 들어, 음수 animation-delay가 없는 경우, 첫 번째 반복이 끝나면 현재 반복 값은 1입니다.

  • 버블링: 예
  • 취소 가능: 아니오
  • 컨텍스트 정보: animationName, elapsedTime, pseudoElement
animationcancel
animationcancel 이벤트는 animationend 이벤트가 발생하지 않는 방식으로 애니메이션 실행이 중단될 때 발생합니다(예: animation-name 변경으로 애니메이션이 제거되거나, 애니메이션 요소 또는 그 상위 요소가 display:none이 된 경우).

이 이벤트의 elapsedTime 값은 애니메이션이 취소된 시점까지 경과된 초 단위 시간입니다. 일시정지된 시간은 제외됩니다. 만약 애니메이션에 음수 animation-delay가 있으면, 애니메이션 시작 시점은 실제 트리거된 시점보다 animation-delay 초만큼 이전입니다. 반대로 양수 animation-delay가 있고, 애니메이션 지연이 끝나기 전에 이벤트가 발생하면 elapsedTime 값은 0입니다.

  • 버블링: 예
  • 취소 가능: 아니오
  • 컨텍스트 정보: animationName, elapsedTime, pseudoElement

4.3. 요소, Document 객체, Window 객체의 이벤트 핸들러

다음은 모든 HTML 요소이벤트 핸들러 콘텐츠 속성이벤트 핸들러 IDL 속성 모두로 지원해야 하는 이벤트 핸들러와 이벤트 타입입니다. 또한, 모든 DocumentWindow 객체는 이벤트 핸들러 IDL 속성으로 지원해야 합니다:

이벤트 핸들러 이벤트 핸들러 이벤트 타입
onanimationstart animationstart
onanimationiteration animationiteration
onanimationend animationend
onanimationcancel animationcancel

5. DOM 인터페이스

CSS 애니메이션은 keyframes를 설명하는 새로운 인터페이스 쌍을 통해 CSSOM에 노출됩니다.

참고: 아래 정의된 인터페이스는 이 명세 레벨에서 상호운용 가능한 API를 반영합니다. 향후 레벨에서는 API 일부가 더 이상 사용되지 않거나 확장될 수 있습니다.

5.1. CSSRule 인터페이스

다음 두 규칙 타입이 CSSRule 인터페이스에 추가됩니다. 이들은 새로운 keyframe 및 keyframes 규칙을 식별합니다.

5.1.1. IDL 정의

partial interface CSSRule {
    const unsigned short KEYFRAMES_RULE = 7;
    const unsigned short KEYFRAME_RULE = 8;
};

5.2. CSSKeyframeRule 인터페이스

CSSKeyframeRule 인터페이스는 단일 key에 대한 스타일 규칙을 나타냅니다.

5.2.1. IDL 정의

[Exposed=Window]
interface CSSKeyframeRule : CSSRule {
  attribute CSSOMString keyText;
  [SameObject, PutForwards=cssText] readonly attribute CSSStyleDeclaration style;
};

5.2.2. 속성

keyText, 타입 CSSOMString
이 속성은 키프레임 선택자를 퍼센트 값의 쉼표 구분 목록 형태로 나타냅니다. fromto 키워드는 각각 0%와 100%에 대응됩니다.

keyText를 잘못된 키프레임 선택자로 갱신하면 SyntaxError 예외가 발생하며, keyText 값은 변경되지 않습니다.

style, 타입 CSSStyleDeclaration, 읽기 전용
해당 키프레임 규칙에 대한 CSSStyleDeclaration 객체를 반환해야 하며, 다음 속성을 가집니다:
읽기 전용 플래그
설정하지 않음.
선언
규칙에 선언된 선언들, 지정된 순서대로.
상위 CSS 규칙
context object(즉, 이 CSSKeyframeRule).
소유 노드
null.

5.3. CSSKeyframesRule 인터페이스

CSSKeyframesRule 인터페이스는 하나의 애니메이션에 대한 전체 keyframes 집합을 나타냅니다.

5.3.1. IDL 정의

[Exposed=Window]
interface CSSKeyframesRule : CSSRule {
           attribute CSSOMString name;
  readonly attribute CSSRuleList cssRules;
  readonly attribute unsigned long length;

  getter CSSKeyframeRule (unsigned long index);
  undefined        appendRule(CSSOMString rule);
  undefined        deleteRule(CSSOMString select);
  CSSKeyframeRule? findRule(CSSOMString select);
};

5.3.2. 속성

name, 타입 CSSOMString
이 속성은 animation-name 속성에서 사용되는 keyframes의 이름입니다.
cssRules, 타입 CSSRuleList, 읽기 전용
이 속성을 통해 목록의 keyframes에 접근할 수 있습니다.
length, 타입 unsigned long, 읽기 전용
목록에 있는 keyframe의 개수입니다.

5.3.3. 인덱스 속성 getter

indexed property getter는 keyframes 목록에서 지정된 위치의 CSSKeyframeRule 을 반환합니다.

파라미터:

index 타입 unsigned long
반환할 규칙의 0 기반 인덱스입니다.

반환값:

CSSKeyframeRule
찾은 규칙 또는 지정된 인덱스에 규칙이 없으면 undefined 입니다.

예외 없음

5.3.4. appendRule 메서드

appendRule 메서드는 전달된 CSSKeyframeRule을 keyframes 규칙의 마지막에 추가합니다.

매개변수:

rule 타입 CSSOMString
추가될 규칙으로, @keyframes 규칙 내 항목과 같은 문법으로 표현됩니다. 유효한 규칙은 항상 추가됩니다(키가 이미 존재하더라도).

반환값 없음

예외 없음

5.3.5. deleteRule 메서드

deleteRule 메서드는 지정된 keyframe selector와 일치하는 마지막으로 선언된 CSSKeyframeRule을 삭제합니다. 일치하는 규칙이 없으면 아무 동작도 하지 않습니다.

매개변수:

select 타입 CSSOMString
삭제할 규칙의 keyframe selector: 0%~100% 사이의 퍼센트 값 쉼표 구분 목록 또는 from 또는 to 키워드(각각 0%, 100%로 해석됨).

지정된 keyframe selector의 값 개수와 순서는 대상 keyframe 규칙과 일치해야 합니다. 값 목록의 공백은 매칭에 영향을 주지 않습니다.

반환값 없음

예외 없음

5.3.6. findRule 메서드

findRule 메서드는 지정된 keyframe selector와 일치하는 마지막으로 선언된 CSSKeyframeRule을 반환합니다. 일치하는 규칙이 없으면 아무 동작도 하지 않습니다.

매개변수:

select 타입 CSSOMString
찾을 규칙의 keyframe selector: 0%~100% 사이의 퍼센트 값 쉼표 구분 목록 또는 from 또는 to 키워드(각각 0%, 100%로 해석됨).

지정된 keyframe selector의 값 개수와 순서는 대상 keyframe 규칙과 일치해야 합니다. 값 목록의 공백은 매칭에 영향을 주지 않습니다.

반환값:

CSSKeyframeRule
찾은 규칙.

예외 없음

예를 들어, 다음 애니메이션이 있다고 할 때:
@keyframes colorful-diagonal-slide {

  from {
    left: 0;
    top: 0;
  }

  10% {
    background-color: blue;
  }

  10% {
    background-color: green;
  }

  25%, 75% {
    background-color: red;
  }

  100% {
    left: 100px;
    top: 100px;
  }

}

변수 anim이 이 애니메이션의 CSSKeyframesRule 객체를 참조한다고 가정하면:

anim.deleteRule('10%');
var tenPercent = anim.findRule('10%');

위 코드는 먼저 마지막 10% 규칙(즉, 초록색 배경 규칙)을 삭제하고, 남은 파란색 배경 규칙을 찾아 tenPercent에 반환합니다.

다음 코드는:

var red = anim.findRule('75%');

rednull로 설정합니다. 빨간색 배경 규칙을 찾으려면 전체 선택자를 사용해야 합니다:

var red = anim.findRule('25%,75%');

from이 0%, to 가 100%로 매핑되므로, 아래처럼 두 값 모두로 규칙을 찾을 수 있습니다:

var from = anim.findRule('0%'); // from { left: 0; top: 0; } 규칙 반환
var to = anim.findRule('to');   // 100% { left: 100px; top: 100px; } 규칙 반환

5.4. GlobalEventHandlers 인터페이스 믹스인 확장

이 명세는 HTML의 GlobalEventHandlers 인터페이스 믹스인을 확장하여 이벤트 핸들러 IDL 속성애니메이션 이벤트용으로 추가합니다(§ 4.3 요소, Document, Window 객체의 이벤트 핸들러 참조).

5.4.1. IDL 정의

partial interface mixin GlobalEventHandlers {
  attribute EventHandler onanimationstart;
  attribute EventHandler onanimationiteration;
  attribute EventHandler onanimationend;
  attribute EventHandler onanimationcancel;
};

6. 개인정보 보호 고려사항

이 명세에 대해 보고된 개인정보 보호 우려 사항은 없습니다.

7. 보안 고려사항

이 명세에 대해 보고된 보안 우려 사항은 없습니다.

8. 변경사항

8.1. 2018년 10월 11일 작업 초안 이후 변경사항

다음과 같은 실질적 변경이 있었습니다:

9. 감사의 글

특히 Tab Atkins, Brian Birtles, Shane Stephens, Carine Bournez, Christian Budde, Anne van Kesteren, Øyvind Stenhaug, Estelle Weyl, 그리고 www-style 커뮤니티의 모든 분들께 감사드립니다.

10. 기타 미해결 이슈

키프레임 상호작용 방식을 명세로 지정해야 함.

11. 작업 그룹 결의(편집 대기 중)

이 섹션은 설명 용도로 임시로 제공됩니다.

에디터들이 현재 명세 편집이 지연되고 있습니다. 다음 작업 그룹 결의 사항은 아직 반영되지 않았습니다:

적합성

문서 규칙

적합성 요구사항은 설명적 단언과 RFC 2119 용어의 조합으로 표현됩니다. 규범적 부분에서 “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, “OPTIONAL” 등의 주요 용어는 RFC 2119에서 설명된 대로 해석해야 합니다. 하지만 가독성을 위해 이 명세에서는 이러한 단어들이 모두 대문자로 나타나지 않습니다.

이 명세의 모든 텍스트는 명시적으로 비규범적임을 표시한 섹션, 예시, 참고를 제외하고 규범적입니다. [RFC2119]

이 명세의 예시는 “예를 들어”라는 말로 소개하거나, class="example"로 규범적 텍스트와 구분됩니다. 예:

이것은 정보 제공용 예시입니다.

정보성 참고는 “참고”라는 단어로 시작하며, class="note"로 규범적 텍스트와 구분됩니다. 예:

참고, 이것은 정보 제공용 참고입니다.

권고사항은 특별히 주의를 환기하도록 스타일링된 규범적 섹션이며, <strong class="advisement">으로 다른 규범적 텍스트와 구분됩니다. 예: UA는 반드시 접근 가능한 대안을 제공해야 합니다.

적합성 클래스

이 명세에 대한 적합성은 세 가지 적합성 클래스로 정의됩니다:

스타일 시트
CSS 스타일 시트.
렌더러
UA는 스타일 시트의 의미를 해석하고 이를 사용하는 문서를 렌더링하는 사용자 에이전트입니다.
저작 도구
UA는 스타일 시트를 작성하는 저작 도구입니다.

스타일 시트가 이 명세에 적합하려면, 이 모듈에서 정의한 문법을 사용하는 모든 구문이 일반 CSS 문법과 이 모듈에서 정의하는 각 기능의 개별 문법에 따라 유효해야 합니다.

렌더러가 이 명세에 적합하려면, 스타일 시트를 적합한 명세대로 해석하는 것 외에도 이 명세에서 정의한 모든 기능을 올바르게 파싱하고 문서를 적절히 렌더링해야 합니다. 하지만 UA가 디바이스의 한계로 인해 문서를 올바르게 렌더링할 수 없는 경우, UA가 비적합한 것으로 간주되지 않습니다. (예: UA가 단색 모니터에서 색상을 렌더링할 필요는 없음)

저작 도구가 이 명세에 적합하려면, 이 모듈의 일반 CSS 문법과 각 기능의 개별 문법에 따라 구문적으로 올바른 스타일 시트를 작성하고, 이 모듈에서 설명된 스타일 시트의 모든 다른 적합성 요구사항을 충족해야 합니다.

부분 구현

작성자가 미래 호환 파싱 규칙을 활용하여 폴백 값을 지정할 수 있도록, CSS 렌더러는 지원하지 않는 at-규칙, 속성, 속성 값, 키워드, 기타 구문 구조를 모두 무효로 처리하고 적절히 무시해야 합니다. 특히 사용자 에이전트는 지원하지 않는 구성 값만 선택적으로 무시하고, 지원하는 값만 적용해서는 안 됩니다. 즉, 다중 값 속성 선언에서 무효 값이 하나라도 있으면(지원하지 않는 값 포함) CSS는 전체 선언을 무시해야 합니다.

불안정 및 독점 기능 구현

향후 안정적인 CSS 기능과의 충돌을 피하기 위해, CSSWG는 최선의 구현 관행을 따라 불안정 기능과 독점 확장을 구현할 것을 권장합니다.

비실험적 구현

명세가 Candidate Recommendation 단계에 도달하면 비실험적 구현이 가능하며, 구현자는 명세에 따라 올바르게 구현된 CR 단계 기능에 대해 접두사 없는 구현을 배포해야 합니다.

CSS의 구현 간 상호운용성을 확립·유지하기 위해, CSS 작업 그룹은 비실험적 CSS 렌더러가 CSS 기능의 접두사 없는 구현을 배포하기 전에 구현 보고서(필요한 경우 해당 테스트케이스 포함)를 W3C에 제출할 것을 요청합니다. W3C에 제출된 테스트케이스는 CSS 작업 그룹의 검토 및 수정 대상이 될 수 있습니다.

테스트케이스 및 구현 보고서 제출에 대한 자세한 내용은 CSS 작업 그룹 웹사이트 https://www.w3.org/Style/CSS/Test/에서 확인할 수 있습니다. 문의는 public-css-testsuite@w3.org 메일링 리스트로 보내주세요.

색인

이 명세에서 정의한 용어

참조로 정의된 용어

참고문헌

규범적 참고문헌

[CSS-DISPLAY-3]
Tab Atkins Jr.; Elika Etemad. CSS Display Module Level 3. 2022년 11월 18일. CR. URL: https://www.w3.org/TR/css-display-3/
[CSS-EASING-1]
Brian Birtles; Dean Jackson; Matt Rakow. CSS Easing Functions Level 1. 2023년 2월 13일. CR. URL: https://www.w3.org/TR/css-easing-1/
[CSS-SHAPES-2]
CSS Shapes Module Level 2 URL: https://drafts.csswg.org/css-shapes-2/
[CSS-SYNTAX-3]
Tab Atkins Jr.; Simon Sapin. CSS Syntax Module Level 3. 2021년 12월 24일. CR. URL: https://www.w3.org/TR/css-syntax-3/
[CSS-VALUES-3]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 3. 2022년 12월 1일. CR. URL: https://www.w3.org/TR/css-values-3/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 4. 2022년 10월 19일. WD. URL: https://www.w3.org/TR/css-values-4/
[CSS-WILL-CHANGE-1]
Tab Atkins Jr.. CSS Will Change Module Level 1. 2022년 5월 5일. CR. URL: https://www.w3.org/TR/css-will-change-1/
[CSS2]
Bert Bos; et al. Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification. 2011년 6월 7일. REC. URL: https://www.w3.org/TR/CSS21/
[CSS22]
Bert Bos. Cascading Style Sheets Level 2 Revision 2 (CSS 2.2) Specification. 2016년 4월 12일. WD. URL: https://www.w3.org/TR/CSS22/
[CSS3CASCADE]
Elika Etemad; Tab Atkins Jr.. CSS Cascading and Inheritance Level 3. 2021년 2월 11일. REC. URL: https://www.w3.org/TR/css-cascade-3/
[CSSOM-1]
Daniel Glazman; Emilio Cobos Álvarez. CSS Object Model (CSSOM). 2021년 8월 26일. WD. URL: https://www.w3.org/TR/cssom-1/
[DOM]
Anne van Kesteren. DOM Standard. Living Standard. URL: https://dom.spec.whatwg.org/
[HTML]
Anne van Kesteren; et al. HTML Standard. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. 1997년 3월. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[WCAG20]
Ben Caldwell; et al. Web Content Accessibility Guidelines (WCAG) 2.0. 2008년 12월 11일. REC. URL: https://www.w3.org/TR/WCAG20/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. Living Standard. URL: https://webidl.spec.whatwg.org/

참고문헌

[CSS-BACKGROUNDS-3]
Bert Bos; Elika Etemad; Brad Kemper. CSS Backgrounds and Borders Module Level 3. 2023년 2월 14일. CR. URL: https://www.w3.org/TR/css-backgrounds-3/
[CSS-POSITION-3]
Elika Etemad; Tab Atkins Jr.. CSS Positioned Layout Module Level 3. 2023년 2월 17일. WD. URL: https://www.w3.org/TR/css-position-3/
[CSS3-TRANSITIONS]
David Baron; et al. CSS Transitions. 2018년 10월 11일. WD. URL: https://www.w3.org/TR/css-transitions-1/

속성 색인

이름 초기값 적용 대상 상속 % 단위 애니메이션 타입 정식 순서 계산된 값
animation <single-animation># 개별 속성 참조 모든 요소 아님 N/A 애니메이션 불가 문법 순서대로 개별 속성 참조
animation-delay <time># 0s 모든 요소 아님 N/A 애니메이션 불가 문법 순서대로 목록, 각 항목은 duration 값
animation-direction <single-animation-direction># normal 모든 요소 아님 N/A 애니메이션 불가 문법 순서대로 목록, 각 항목은 명시된 키워드
animation-duration <time [0s,∞]># 0s 모든 요소 아님 N/A 애니메이션 불가 문법 순서대로 목록, 각 항목은 duration 값
animation-fill-mode <single-animation-fill-mode># none 모든 요소 아님 N/A 애니메이션 불가 문법 순서대로 목록, 각 항목은 명시된 키워드
animation-iteration-count <single-animation-iteration-count># 1 모든 요소 아님 N/A 애니메이션 불가 문법 순서대로 목록, 각 항목은 숫자 또는 infinite 키워드
animation-name [ none | <keyframes-name> ]# none 모든 요소 아님 N/A 애니메이션 불가 문법 순서대로 목록, 각 항목은 대소문자 구분 css 식별자 또는 none 키워드
animation-play-state <single-animation-play-state># running 모든 요소 아님 N/A 애니메이션 불가 문법 순서대로 목록, 각 항목은 명시된 키워드
animation-timing-function <easing-function># ease 모든 요소 아님 N/A 애니메이션 불가 문법 순서대로 목록, 각 항목은 계산된 <easing-function>

IDL 색인

[Exposed=Window]
interface AnimationEvent : Event {
  constructor(CSSOMString type, optional AnimationEventInit animationEventInitDict = {});
  readonly attribute CSSOMString animationName;
  readonly attribute double elapsedTime;
  readonly attribute CSSOMString pseudoElement;
};
dictionary AnimationEventInit : EventInit {
  CSSOMString animationName = "";
  double elapsedTime = 0.0;
  CSSOMString pseudoElement = "";
};

partial interface CSSRule {
    const unsigned short KEYFRAMES_RULE = 7;
    const unsigned short KEYFRAME_RULE = 8;
};

[Exposed=Window]
interface CSSKeyframeRule : CSSRule {
  attribute CSSOMString keyText;
  [SameObject, PutForwards=cssText] readonly attribute CSSStyleDeclaration style;
};

[Exposed=Window]
interface CSSKeyframesRule : CSSRule {
           attribute CSSOMString name;
  readonly attribute CSSRuleList cssRules;
  readonly attribute unsigned long length;

  getter CSSKeyframeRule (unsigned long index);
  undefined        appendRule(CSSOMString rule);
  undefined        deleteRule(CSSOMString select);
  CSSKeyframeRule? findRule(CSSOMString select);
};

partial interface mixin GlobalEventHandlers {
  attribute EventHandler onanimationstart;
  attribute EventHandler onanimationiteration;
  attribute EventHandler onanimationend;
  attribute EventHandler onanimationcancel;
};

이슈 색인

이 명세는 키프레임에서 값이 어떻게 결정되는지 정의해야 합니다. 예를 들어 CSS 트랜지션 적용 섹션처럼.
키프레임의 상호작용 방식을 명세로 지정해야 함.