CSS 이징 함수 1단계

W3C 후보 권고안 초안,

이 문서에 대한 자세한 정보
이 버전:
https://www.w3.org/TR/2023/CRD-css-easing-1-20230213/
최신 공개 버전:
https://www.w3.org/TR/css-easing-1/
편집자 초안:
https://drafts.csswg.org/css-easing/
이전 버전:
히스토리:
https://www.w3.org/standards/history/css-easing-1
구현 보고서:
https://wpt.fyi/results/css/css-easing?label=master&label=experimental&aligned
피드백:
CSSWG 이슈 저장소
편집자:
(Mozilla)
(Apple Inc)
Matt Rakow (Microsoft)
이전 편집자:
(Google)
이 규격에 대해 수정 제안:
GitHub 편집자
참여:
IRC: #css (W3C의 IRC)
테스트:
web-platform-tests css/css-easing

요약

이 CSS 모듈은 작성자가 값의 변화 속도를 제어하는 변환을 정의하는 방법을 설명합니다. 애니메이션에 적용하면 이러한 변환을 통해 관성과 같은 물리적 현상을 모방하는 애니메이션을 만들거나, 애니메이션이 로봇처럼 움직이게 하는 단계별 동작을 구현할 수 있습니다.

CSS는 구조화된 문서(HTML, XML 등)의 렌더링을 화면, 종이 등에 기술하는 언어입니다.

이 문서의 상태

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

이 문서는 CSS 워킹 그룹에 의해 후보 권고안 초안으로 권고 트랙을 따라 출판되었습니다. 후보 권고안으로 출판되었다고 해서 W3C 및 회원의 승인을 의미하지는 않습니다. 후보 권고안 초안에는 워킹 그룹이 이후 후보 권고안 스냅샷에 포함할 의도가 있는 이전 후보 권고안의 변경 사항이 반영되어 있습니다.

이 문서는 초안이며 언제든지 업데이트, 대체 또는 폐기될 수 있습니다. 진행 중인 작업 외에는 인용에 적합하지 않습니다.

피드백은 GitHub 이슈 등록(권장)으로 보내주시고, 제목에 규격 코드 “css-easing”을 포함해 주세요. 예시: “[css-easing] …코멘트 요약…”. 모든 이슈 및 코멘트는 아카이브됩니다. 또는 (아카이브됨) 공개 메일링 리스트 www-style@w3.org로 보낼 수도 있습니다.

이 문서는 2021년 11월 2일 W3C 프로세스 문서의 적용을 받습니다.

이 문서는 W3C 특허 정책에 따라 운영되는 그룹에서 작성되었습니다. W3C는 해당 그룹의 산출물과 관련하여 공개된 특허 공개 목록을 유지합니다; 해당 페이지에는 특허 공개 방법도 안내되어 있습니다. 어떤 개인이 필수 청구항(Essential Claim(s))을 포함한다고 믿는 특허에 대해 실제로 알게 되면, W3C 특허 정책 섹션 6에 따라 정보를 공개해야 합니다.

1. 소개

이 섹션은 규범적이지 않습니다.

어떤 값의 변화 속도를 제어하는 것은 종종 바람직합니다. 예를 들어, 요소가 움직이는 속도를 점진적으로 증가시키면 요소가 관성을 갖는 것처럼 보이게 할 수 있습니다. 이는 직관적인 사용자 인터페이스 요소나 실제 물체처럼 동작하는 만화 소품을 구현하는 데 사용할 수 있습니다. 반대로, 애니메이션이 분할된 바퀴처럼 항상 같은 위치에 세그먼트가 나타나도록 뚜렷한 단계로 이동하는 것이 바람직할 때도 있습니다.

마찬가지로, 그라디언트 보간의 변화 속도를 제어하면 오목 또는 볼록한 표면을 암시하거나 줄무늬 효과 등 다양한 시각적 효과를 생성할 수 있습니다.

이징 함수는 입력 진행 값을 받아서 해당 변환된 출력 진행 값을 생성하는 방법을 제공합니다.

ease-in 효과를 생성하는 이징 함수 예시.
ease-in 효과를 생성하는 이징 함수 예시.
입력 진행 값이 0.7일 때, 이징 함수는 값을 스케일링하여 출력 진행 값 0.52를 생성합니다.
이 이징 함수를 애니메이션에 적용하면 처음에는 천천히 진행되고 점차 빠르게 진행됩니다.

1.1. 값 정의

이 명세서는 값 정의 구문[CSS-VALUES-3]에서 사용합니다. 이 명세서에서 정의하지 않은 값 타입은 CSS Values & Units [CSS-VALUES-3]에서 정의됩니다. 다른 CSS 모듈과의 조합에 따라 이러한 값 타입의 정의가 확장될 수 있습니다.

2. 이징 함수

이징 함수입력 진행 값을 받아 출력 진행 값을 생성합니다.

이징 함수는 반드시 순수 함수여야 하며, 동일한 입력 세트에 대해 항상 동일한 출력 진행 값을 반환해야 합니다.

입력 진행 값은 실수이며, 범위는 [-∞, ∞]입니다. 보통 입력 진행 값은 [0, 1] 범위에 있지만, 이징 함수가 연결될 때는 그렇지 않을 수 있습니다.

이징 함수가 함께 연결되는 예는 Web Animations [WEB-ANIMATIONS]에서 발생합니다. 애니메이션 효과에 지정된 이징 함수의 출력이 키프레임 효과의 키프레임에 지정된 이징 함수의 입력이 될 수 있습니다. 이 경우, 키프레임 효과에 적용되는 이징 함수의 입력이 [0, 1] 범위를 벗어날 수 있습니다.

출력 진행 값은 실수이며, 범위는 [-∞, ∞]입니다.

일부 이징 함수 타입은 추가로 boolean before flag 입력을 받으며, 이는 이후에 정의됩니다.

이 명세서는 네 가지 이징 함수 타입을 정의하며, 그 정의는 다음과 같습니다.

이징 함수를 지정하는 문법은 다음과 같습니다:

<easing-function> = linear | <cubic-bezier-easing-function> | <step-easing-function>

2.1. 선형 이징 함수: linear

선형 이징 함수는 항등 함수로, 모든 입력에 대해 출력 진행 값입력 진행 값과 같습니다.

선형 이징 함수의 문법은 linear 키워드입니다.

2.2. 큐빅 베지어 이징 함수: ease, ease-in, ease-out, ease-in-out, cubic-bezier()

큐빅 베지어 이징 함수이징 함수의 한 종류로, 네 개의 실수로 정의되며, 이는 큐빅 베지어 곡선의 두 컨트롤 포인트 P1P2를 지정합니다. 끝점 P0P3는 각각 (0, 0)과 (1, 1)로 고정됩니다. P1P2x 좌표는 [0, 1] 범위로 제한됩니다.

이징 함수로 사용되는 큐빅 베지어 곡선.
이징 함수로 사용되는 큐빅 베지어 곡선.
곡선의 형태는 컨트롤 포인트 P1P2의 위치에 따라 결정됩니다.
입력 진행 값은 곡선의 x 값으로 사용되고, y 값은 출력 진행 값이 됩니다.

큐빅 베지어 이징 함수의 문법은 다음과 같습니다 ([CSS-VALUES-3]의 표기법 사용):

<cubic-bezier-easing-function> = ease | ease-in | ease-out | ease-in-out | cubic-bezier(<number [0,1]>, <number>, <number [0,1]>, <number>)

각 값의 의미는 다음과 같습니다:

ease

cubic-bezier(0.25, 0.1, 0.25, 1)과 동일합니다.

ease-in

cubic-bezier(0.42, 0, 1, 1)과 동일합니다.

ease-out

cubic-bezier(0, 0, 0.58, 1)과 동일합니다.

ease-in-out

cubic-bezier(0.42, 0, 0.58, 1)과 동일합니다.

cubic-bezier(<number [0,1]>, <number>, <number [0,1]>, <number>)

큐빅 베지어 이징 함수를 지정합니다. 네 개의 숫자는 곡선의 P1P2를 (x1, y1, x2, y2)로 지정합니다. 두 x 값은 반드시 [0, 1] 범위여야 하며, 그렇지 않으면 정의가 유효하지 않습니다.

위에 나열된 키워드 값은 아래 그림과 같이 나타납니다.

키워드 값이 생성하는 이징 함수.
각 큐빅 베지어 이징 함수 키워드 값이 생성하는 이징 함수.

2.2.1. 큐빅 베지어 이징 함수의 출력

입력 진행 값에서 출력 진행 값으로의 매핑은 주어진 x 값(입력 진행 값)에 대응하는 y 값(출력 진행 값)을 결정하여 수행됩니다. 이 곡선의 평가는 [FUND-COMP-GRAPHICS] 등 다양한 자료에서 다룹니다.

입력 진행 값이 [0, 1] 범위를 벗어날 경우, 곡선은 가장 가까운 끝점의 접선을 따라 무한히 확장됩니다. 방법은 다음과 같습니다:

2.3. 스텝 이징 함수: step-start, step-end, steps()

스텝 이징 함수이징 함수의 한 종류로, 입력 시간을 지정된 수의 동일한 길이의 구간으로 나눕니다. stepsstep position으로 정의됩니다. 문법은 다음과 같습니다:

<step-easing-function> = step-start | step-end | steps(<integer>[, <step-position>]?)

<step-position> = jump-start | jump-end | jump-none | jump-both | start | end

각 값의 의미는 다음과 같습니다:

step-start

steps(1, start)로 계산됩니다.

step-end

steps(1, end)로 계산됩니다.

스텝 이징 키워드 예시.
스텝 이징 함수 키워드 값 예시.
steps(<integer>[, <step-position> ]?)

첫 번째 매개변수는 함수의 구간 수를 지정합니다. jump-none이 두 번째 매개변수일 경우 1보다 큰 양의 정수여야 하며, 그렇지 않으면 0보다 큰 양의 정수여야 합니다.

두 번째 매개변수(선택)는 아래 값 중 하나로 step position을 지정합니다:

jump-start

첫 번째 상승은 input progress value가 0일 때 발생합니다.

jump-end

마지막 상승은 input progress value가 1일 때 발생합니다.

jump-none

모든 상승이 (0, 1) 범위 내에서 발생합니다.

jump-both

첫 번째 상승은 input progress value가 0일 때, 마지막 상승은 input progress value가 1일 때 발생합니다.

start

jump-start와 동일하게 동작합니다.

end

jump-end와 동일하게 동작합니다.

두 번째 매개변수가 생략되면 end 값으로 간주합니다.

이 값들은 아래 그림으로 설명됩니다:

스텝 이징 함수 예시.
스텝 이징 함수 예시.

2.3.1. 스텝 이징 함수의 출력

스텝이 발생하는 정확한 지점에서 함수의 결과는 개념적으로 스텝의 상단입니다. 그러나 before flag스텝 이징 함수의 입력으로 true로 전달하면 함수 결과는 그 지점에서 스텝의 하단을 나타내게 됩니다.

before flag가 이 함수의 동작에 어떤 영향을 주는지 예로, 스텝 이징 함수step positionstart이고, 양의 지연과 backwards fill이 있을 때를 생각해봅시다.

예를 들어 CSS 애니메이션에서:

animation: moveRight 5s 1s steps(5, start);

지연 단계 동안 input progress value는 0이지만, before flag가 애니메이션이 아직 애니메이션 구간에 도달하지 않았음을 나타내면, 이징 함수는 output progress value로 0(즉, 첫 번째 스텝의 아래쪽)을 반환합니다.

애니메이션 구간이 시작되는 정확한 순간에 input progress value는 여전히 0이지만, before flag는 설정되지 않으므로 이징 함수의 결과는 첫 번째 스텝의 상단을 나타냅니다.

output progress value 계산에서는 step position startjump-start와 동일하게 취급됩니다. end 역시 jump-end와 동일하게 취급됩니다. 따라서 아래 알고리즘에서는 start 또는 end를 명시적으로 참조하지 않습니다.

참고: 사용자 에이전트는 직렬화 목적(§ 2.4 직렬화 참조)에서 jump-startstart를 구분해야 합니다.

output progress valueinput progress valuebefore flag로 다음과 같이 계산됩니다:

  1. current stepfloor(input progress value × steps)로 계산합니다.

  2. step position이 아래 중 하나일 경우:

    current step을 1 증가시킵니다.

  3. 아래 두 조건이 모두 true이면:

    current step을 1 감소시킵니다.

  4. input progress value ≥ 0이고 current step < 0이면, current step을 0으로 합니다.

  5. step position에 따라 jumps를 아래와 같이 계산합니다:

    jump-start 또는 jump-end

    steps

    jump-none

    steps - 1

    jump-both

    steps + 1

  6. input progress value ≤ 1이고 current step > jumps이면, current stepjumps로 합니다.

    이 절차의 4, 6번 단계는 input progress value가 [0, 1] 범위일 때, 스텝 이징 함수가 그 범위를 벗어나는 output progress value를 생성하지 않도록 보장합니다.

    예를 들어, 수학적으로는 step positionjump-start인 스텝 이징 함수가 input progress value가 1일 때 1을 넘어간다고 예상할 수 있지만, 실제로는 그런 이징 함수를 앞으로 채워지는 애니메이션에 적용하면 output progress value가 1이 되기를 기대합니다.

    지연 단계에서 step positionjump-end인 스텝 이징 함수도 마찬가지입니다.

  7. output progress valuecurrent step / jumps입니다.

2.4. 직렬화

이징 함수는 [CSSOM]에서 정의된 일반 직렬화 패턴을 따르며, 아래와 같은 추가 요구 사항이 있습니다:

3. 프라이버시 및 보안 고려사항

이 명세는 웹 플랫폼에 새로운 기능을 직접적으로 도입하지 않고, 다른 명세에서 참조할 수 있는 공통 정의만 제공합니다. 따라서 새로운 프라이버시 또는 보안 문제를 도입하지 않습니다.

이 명세에서 정의된 기능을 참조하는 명세는, 이징 함수가 일반적으로 input progress value로 [0, 1] 범위를 사용하고 output progress value도 [0, 1] 범위를 반환하지만, 항상 그런 것은 아님을 고려해야 합니다. 이징 함수의 활용에서는 입력 및 출력이 이 범위를 벗어날 때의 동작을 정의하여 새로운 보안 문제를 도입하지 않도록 해야 합니다.

4. 변경 사항

다음은 2019년 4월 30일 후보 권고안 이후의 변경 사항입니다:

5. 감사의 글

이 명세는 L. David Baron, Dean Jackson, David Hyatt, Chris Marrin이 편집한 CSS Transitions 명세를 기반으로 작성되었습니다. 편집자들은 Douglas Stockwell, Steve Block, Tab Atkins, Rachel Nabors, Martin Pitt, 그리고 Animation at Work 슬랙 커뮤니티의 피드백과 기여에 감사드립니다.

적합성

문서 관례

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

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

이 명세의 예제는 “예를 들어”라는 표현으로 시작하거나 class="example"와 같이 규범적 텍스트와 구분됩니다:

이것은 참고 예시입니다.

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

참고, 이것은 참고 노트입니다.

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

적합성 클래스

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

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

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

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

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

부분 구현

작성자가 미래 호환 구문 규칙을 활용해 폴백 값을 지정할 수 있도록, CSS 렌더러는 지원 수준이 부족한 at-rule, 속성, 속성 값, 키워드, 기타 구문 구조를 반드시 무효(적절하게 무시)로 처리해야 합니다. 특히 사용자 에이전트는 지원하지 않는 구성 요소 값을 선택적으로 무시하고 지원하는 값만 처리해서는 안 됩니다. 값이 무효(지원하지 않는 값은 반드시 무효)로 간주될 경우 CSS는 전체 선언을 무시해야 합니다.

불안정 및 독점 기능의 구현

향후 안정적인 CSS 기능과 충돌을 피하기 위해, CSSWG는 베스트 프랙티스를 따라 불안정 기능과 독점 확장을 구현할 것을 권장합니다.

비실험적 구현

명세가 후보 권고안 단계에 도달하면, 비실험적 구현이 가능하며, 구현자는 명세대로 올바르게 구현했음을 입증할 수 있는 CR 수준 기능에 대해 접두사 없는 구현을 공개해야 합니다.

CSS의 상호 운용성을 확립하고 유지하기 위해, CSS 워킹 그룹은 비실험적 CSS 렌더러가 구현 보고서(필요하다면 해당 구현 보고서에 사용된 테스트케이스 포함)를 W3C에 제출한 후 접두사 없는 CSS 기능 구현을 공개할 것을 요청합니다. W3C에 제출된 테스트케이스는 CSS 워킹 그룹의 검토 및 수정 대상입니다.

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

CR 종료 기준

이 명세가 제안 권고안(Proposed Recommendation)으로 진전되려면, 각 기능마다 최소 두 개의 독립적이고 상호 운용 가능한 구현이 있어야 합니다. 각 기능은 서로 다른 제품에서 구현될 수 있으며, 모든 기능을 단일 제품에서 구현할 필요는 없습니다. 이 기준을 위해 다음 용어를 정의합니다:

독립적
각 구현은 서로 다른 당사자가 개발해야 하며, 다른 적합 구현에서 사용한 코드와 공유, 재사용 또는 파생되어서는 안 됩니다. 이 명세의 구현에 영향을 주지 않는 코드 부분은 이 요구 사항에서 제외됩니다.
상호 운용
공식 CSS 테스트 스위트의 해당 테스트 케이스를 통과하거나, 구현이 웹 브라우저가 아닌 경우에는 동일한 테스트를 통과해야 합니다. 모든 관련 테스트에는 해당 UA가 상호 운용성을 주장하기 위해 동일한 방식으로 통과할 수 있는 동등한 테스트가 있어야 합니다. 동등한 테스트는 피어 리뷰를 위해 공개되어야 합니다.
구현
사용자 에이전트로서:
  1. 명세를 구현함.
  2. 일반 대중에게 공개됨. 구현은 정식 출시 제품이나 베타, 미리보기, "nightly build" 등 공용 버전일 수 있습니다. 정식 출시가 아닌 제품 릴리스는 기능이 최소 한 달 이상 구현되어 있어야 안정성을 입증할 수 있습니다.
  3. 실험적이지 않음(즉, 테스트 스위트를 통과하기 위해 특별히 설계된 버전이 아니며 앞으로 정상적으로 사용될 계획임).

명세는 최소 6개월 동안 후보 권고안 상태를 유지할 예정입니다.

색인

이 명세에서 정의된 용어

참조로 정의된 용어

참고문헌

표준 참고문헌

[CSS-VALUES-3]
Tab Atkins Jr.; Elika Etemad. CSS 값 및 단위 모듈 레벨 3. 2022년 12월 1일. CR. URL: https://www.w3.org/TR/css-values-3/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS 값 및 단위 모듈 레벨 4. 2022년 10월 19일. WD. URL: https://www.w3.org/TR/css-values-4/
[RFC2119]
S. Bradner. RFC에서 요구 수준을 나타내는 주요 단어. 1997년 3월. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119

참고 참고문헌

[CSSOM]
Daniel Glazman; Emilio Cobos Álvarez. CSS 오브젝트 모델 (CSSOM). 2021년 8월 26일. WD. URL: https://www.w3.org/TR/cssom-1/
[FUND-COMP-GRAPHICS]
Peter Shirley; Michael Ashikhmin; Steve Marschner. 컴퓨터 그래픽스의 기초. 2009.
[WEB-ANIMATIONS]
Brian Birtles; 외. 웹 애니메이션. 2022년 9월 8일. WD. URL: https://www.w3.org/TR/web-animations-1/