1. 소개
애니메이션 이미지([GIF], [PNG], [WebP] 등에서 지원)는 웹에서 널리 사용됩니다. 기본적으로 사용자 에이전트는 이러한 이미지를 자동으로 재생하며, 이는 사용자에게 불편함을 줄 수 있습니다. 특히 한 페이지에 여러 이미지가 있는 경우(예: 이미지 갤러리)에 그러하며, WCAG 2.2 § 성공 기준 2.2.2 일시 중지, 정지, 숨기기를 위반합니다. 현재 사이트 작성자는 이를 제어할 수 없습니다.
이로 인해 사용자는 이러한 애니메이션을 제어하기를 원합니다. 그러나 사용 방식이 다양하기 때문에 사용 사례와 원하는 UI 및 사용자 경험도 매우 다양합니다. 따라서 이를 자동 또는 선택적으로 활성화하는 사용자 에이전트 기능으로 제공하는 것만으로는 충분하지 않습니다.
사용자에게 최상의 경험을 제공하려면 웹사이트는 재생 경험을 제어할 수 있어야 하며, 애니메이션 이미지의 각기 다른 사용 사례에 맞게 개별적으로 제어해야 합니다.
이 명세에서는 작성자가 애니메이션을 제어하고 이를 위한 CSS 속성(image-animation) 과 의사 클래스(:animated-image)를 제안합니다. 이를 통해 작성자는 애니메이션을 제어하고, 이 제어 기능과 연결하려는 UI를 관련 요소에 적용할 수 있습니다.
동기와 검토된 대안을 더 자세히 살펴보려면 별도로 관리되는 설명 문서 및 이 주제에 관한 발표 자료도 참고하시기 바랍니다.
2. 이미지 애니메이션 제어: image-animation 속성
| 이름: | image-animation |
|---|---|
| 값: | normal | paused | stopped | running |
| 초기값: | normal |
| 적용 대상: | 선언적 이미지 |
| 상속 여부: | 예 |
| 백분율: | 해당 없음 |
| 계산값: | 지정된 대로 |
| 정규 순서: | 문법에 따름 |
| 애니메이션 유형: | 불연속 |
이 속성을 사용하면 작성자는 애니메이션 이미지가 애니메이션 상태로 표시될지 일시 중지될지를 제어할 수 있습니다.
요소에 여러 선언적 이미지가 포함되어 있으면 (예: 배경 이미지나 테두리 이미지가 여러 개인 요소, 또는 이미지를 나타내는 호스트 언어의 대체 요소로서 CSS를 통해 하나 이상의 이미지도 연결되어 있는 요소), 해당 요소에서 이 속성의 계산값은 모든 이미지에 영향을 줍니다.
참고: 따라서 요소에 포함된 일부 이미지의 애니메이션만 일시 중지하고 같은 요소의 다른 이미지에서는 애니메이션이 계속 실행되도록 할 수 없습니다.
애니메이션이 없는 이미지의 경우 이 속성의 값이 달라도 아무런 영향을 미치지 않습니다. 이 속성은 비디오나 프로그래밍 방식의 이미지에도 영향을 미치지 않습니다.
이 속성이 루트 요소에 적용되면 배경 이미지에 대한 효과가 캔버스 배경으로 전파됩니다.
참고: 기존 호환성상의 이유로
background 속성은 루트 요소뿐만 아니라
HTML
body
요소에서도 전파됩니다.
그러나 image-animation과 같은 새로운 속성은 오직
루트 요소에서만 전파됩니다.
이 속성을
body에
설정해도 전파되지 않으며,
background가 해당 요소에 설정되어 있어도 마찬가지입니다.
- normal
-
애니메이션
이미지의 애니메이션은
이미지 형식과 호스트 언어에 따라 정상적으로 실행됩니다.
또한 동일한 애니메이션 이미지 중 절대 URL이 같고, 이미지 데이터가 같으며, image-animation의 계산값이 normal인 이미지들은 하나의 그룹으로 동일한 타임라인에 동기화하여 렌더링해야 하며, 타임라인은 그룹에 가장 먼저 추가된 시점에 시작됩니다.
참고: 위 요구 사항은 [HTML]의 렌더링 기대 동작을 바탕으로 하며, 이는 HTML § 15.4.2 이미지에 정의되어 있습니다. [HTML]은 일반적으로 사용자 에이전트가 문서를 특정 방식으로 표시하도록 요구하지 않으므로, 위 동작도 규범적으로 요구하지 않습니다. 그러나 이 명세에서는 이를 요구합니다.
- stopped
- 애니메이션 이미지는 정적 이미지인 것처럼 렌더링됩니다. 사용자 에이전트는 이미지에 포함된 애니메이션을 실행해서는 안 됩니다. 이미지에 표지 프레임이 포함되어 있으면 사용자 에이전트는 해당 프레임을 사용해야 합니다. 그렇지 않으면 애니메이션의 초기 상태에서 표시될 이미지를 표시해야 합니다.
- paused
-
사용자 에이전트는
애니메이션
이미지에 포함된 애니메이션을 실행해서는 안 되며,
이 값이 적용되기 시작했을 때의
이미지 상태를 계속 표시해야 합니다.
결과적으로 애니메이션이 일시 중지됩니다.
이 값이 적용되기 전에 애니메이션이 재생되고 있지 않았다면 동작은 stopped와 같습니다.
- running
-
normal과 마찬가지로
애니메이션
이미지의 애니메이션은
이미지 형식과 호스트 언어에 따라 정상적으로 실행됩니다.
그러나 애니메이션 타임라인은 요소별로 구분됩니다. 단일 요소에 포함된 모든 이미지 중 image-animation의 계산값이 running인 이미지들 가운데, 애니메이션 이미지가 동일한 절대 URL과 동일한 이미지 데이터를 가지면 하나의 그룹으로 동일한 타임라인에 동기화하여 렌더링해야 하며, 이 타임라인은 다른 요소에 포함된 이미지의 타임라인과 구별됩니다.
계산값이 running인 동안 요소에 이미지가 추가되면, 타임라인은 그룹에 가장 먼저 추가된 시점에 시작됩니다.
요소가 이전에 display: none으로 설정된 후 생성되거나 표시되며, 이미지가 이미 추가되어 있고 image-animation이 이미 running으로 설정되어 있다면, 타임라인은 요소가 레이아웃에 포함되는 시점에 시작됩니다.
이 속성이 다른 값에서 running으로 변경되면 이 타임라인의 시작 시점은 변경 당시 표시되던 상태에서 애니메이션이 계속되도록 설정됩니다.
img
요소의 애니메이션은 계속 실행되도록 합니다.
:root{ /* 상속을 통해 문서 전체에 전파됩니다 */ image-animation: paused; } img{ image-animation : normal; }
img
요소가 있으며,
이 요소들은 동일한 이미지의 인스턴스를 표시합니다.
(절대 URL과 이미지 데이터가 동일합니다.)
모든 요소에 image-animation: normal 스타일이 적용되어 있습니다.
요소 중 하나의 image-animation 속성이 일시적으로 paused로 변경되어 해당 이미지의 애니메이션이 중지됩니다. 다른 이미지에는 영향을 주지 않으며 애니메이션이 계속 실행됩니다.
image-animation 속성이 paused인 요소의 값은 나중에 running으로 변경됩니다. 이 시점에 해당 이미지의 애니메이션이 다시 시작되며, 다른 이미지의 타임라인이 어디까지 진행되었는지와 관계없이 이제 동기화가 해제됩니다.
그 후 해당 요소의 image-animation 속성이 normal로 변경됩니다. 이 시점에 이미지의 애니메이션은 즉시 다른 인스턴스와 다시 동기화됩니다.
image-animation 속성은 래스터 이미지
형식뿐만 아니라
벡터 이미지에도 영향을 줍니다.
SVG도 포함됩니다([SVG2] 참조).
그러나 이는 이미지로 로드된 별도의 SVG 리소스에만 해당하며,
HTML 문서에 인라인으로 포함된
svg
요소는 포함되지 않습니다.
(그러나
svg
요소에 설정하면
이 속성이 상속되므로
SVG
image
요소를 통해 로드된 모든 애니메이션이 있는
선언적 이미지에도
영향을 줍니다.)
3. 애니메이션 이미지 구별: :animated-image 의사 클래스
:animated-image 의사 클래스는 선언적 이미지를 나타내는 요소 중 애니메이션 이미지가 로드된 요소와 일치합니다. animated-image 의사 클래스가 일치하려면 이미지가 애니메이션을 지원하는 형식이어야 할 뿐만 아니라 실제로 애니메이션이 있는 이미지여야 합니다.
선언적 이미지를 나타내지 않는 요소에는 animated-image 의사 클래스가 절대 일치하지 않습니다.
이 간단한 예제에서는 애니메이션을 실행할 수 있는 이미지를 처음에 일시 중지하고, 필터를 적용하여 흐릿하고 회색빛으로 보이게 합니다. 이미지에 마우스 포인터를 올리거나 포커스를 맞추면 필터가 제거되고 이미지를 재생할 수 있게 됩니다.
img : animated-image{ image-animation : paused; filter : grayscale ( 10 % ) contrast ( 50 % ) brightness ( 80 % ); } img:animated-image:hover, img:animated-image:focus{ filter : none; image-animation : running; }
function setImageFocusability( event) { var img= event. target; if ( img. matches( ":animated-image" ) { img. tabIndex= 0 ; } else { img. removeAttribute( "tabindex" ); } } document. querySelectorAll( "img" ). forEach( ( i) => { setImageFocusability({ target: i}); i. addEventListener( 'load' , setImageFocusability); i. addEventListener( 'error' , setImageFocusability); });
:animated-image의 일치 여부는 이미지의 현재 재생 상태나 image-animation 속성의 값에 영향을 받지 않습니다. 그러나 사용자 에이전트의 특정 설정으로 이미지 애니메이션이 전역적으로 비활성화된 경우, 해당 설정이 활성화되어 있으면 사용자 에이전트는 원래 애니메이션 이미지지만 재생이 억제된 이미지를 정적 이미지로 취급하여 :animated-image와 일치하지 않도록 할 수 있습니다.
4. 용어
- 정적 이미지
-
최종적인 표시 결과로
단일 프레임을 표시하도록 의도된 이미지입니다.
JPEG 이미지는 정적 이미지입니다.
- 애니메이션 이미지
-
최종적인 표시 결과의 일부로
여러 프레임을 순차적으로 표시하도록 의도된 이미지이며,
반복 재생될 수도 있지만 반드시 그럴 필요는 없습니다.
애니메이션 PNG 이미지나 애니메이션이 있는 [GIF] 이미지는 애니메이션 이미지입니다.
점진적 렌더링이나 다중 패스 로딩을 지원한다고 해서 이미지가 애니메이션 이미지로 인정되는 것은 아닙니다.
- 선언적 이미지
-
호스트 언어의 대체 요소로서
정적 이미지나
애니메이션 이미지를 나타내지만,
비디오나 프로그래밍 방식의
이미지는 제외하는 요소,
또는 CSS를 통해 문서 렌더링에 삽입된 이미지입니다.
img[HTML] 요소는picture요소 안에 중첩된 경우를 포함하며, 이미지로 표현되는 경우의object[HTML] 요소나image[SVG2] 요소도 선언적 이미지이며,background-image또는border-image와 같은 속성이나 content 속성을 통해 삽입된 이미지도 마찬가지입니다.HTML
video요소가 포스터 프레임을 나타내는 경우에는 (그리고 오직 그 경우에만) 선언적 이미지로 간주됩니다. - 비디오
-
움직이는 영상을 나타내는 호스트 언어의 대체 요소로,
일반적으로 소리가 함께 제공되지만 반드시 그럴 필요는 없으며,
일반적으로 상호 작용 컨트롤이 제공되지만 반드시 그럴 필요는 없습니다.
(재생, 일시 중지, 탐색, 음량 조절, 전체 화면 표시 등)
자막이나 캡션이 함께 제공될 수도 있지만 반드시 그럴 필요는 없습니다.
참고: 개념적인 관점에서 파일 형식만을 기준으로 보면 비디오와 애니메이션 이미지는 상당 부분 겹치며, 원칙적으로 서로 구별할 수 없는 경우도 있습니다. 여기서의 구분은 문서에서 선택한 요소를 통해 표현되는 작성자의 의도에 근거합니다.
- 프로그래밍 방식의 이미지
-
외부 리소스에서 로드하는 대신
호스트 언어의 API를 통해 프로그래밍 방식으로 생성된 이미지입니다.
canvas[HTML] 요소는 프로그래밍 방식의 이미지를 나타냅니다. - 표지 프레임
- 일부 애니메이션 이미지 형식에서는 이미지 작성자가 정적 이미지를 지정할 수 있으며, 이 문서에서는 이를 표지 프레임이라고 합니다. 이 이미지는 애니메이션이 실행되지 않을 때 표시되며, 애니메이션의 초기 상태와는 구별됩니다.
5. 접근성 고려 사항
- 이 명세에서 도입한 기능을 통해 작성자는 그렇지 않으면 발생할 수 있는 WCAG 2.2 § 성공 기준 2.2.2 일시 중지, 정지, 숨기기 위반을 해결할 수 있습니다.
-
웹 페이지에는 이미 애니메이션 이미지가 포함될 수 있으며,
적절한
alt텍스트도 제공되어야 합니다. 애니메이션의 일시 중지와 재개를 지원하기 위해 이를 변경할 필요도, 변경할 것으로 예상되지도 않습니다. 다음과 같은 설명은 ”떨어지는 모루에 깔리는 만화 속 코요테“, “귀엽게 춤추는 햄스터”, “공사 중”, 또는 “회전하는 로딩 표시기”와 같이 애니메이션이 실행 중인지 여부와 관계없이 여전히 적절하며 내용을 잘 전달합니다. - 현재 스크린 리더는 일반적으로 애니메이션 이미지를 정적 이미지와 다르게 안내하지 않습니다. 다만 필요하다고 판단되면 접근성 트리를 확장하여 이 정보를 노출할 수 있습니다. 마찬가지로 일시 중지된 이미지와 재생 중인 이미지를 다르게 안내할 것으로 예상되지는 않지만, 필요하다고 판단되면 접근성 트리를 확장하여 이 정보를 노출할 수 있습니다.
-
§ 3 애니메이션 이미지 구별:
:animated-image 의사 클래스에서 설명했듯이,
이미지 애니메이션을 제어하는 UI를 만드는 작성자는
접근 가능한 UI를 구축하기 위해
일반적인 주의 사항을 준수해야 합니다.
CSS에서는 요소에 직접 포커스를 맞출 수 있도록 할 수 없으므로
올바른 키보드 탐색을 위해 요소의 속성도 설정해야 합니다.
또 다른 해결 방법은
작성자가 :animated-image 의사 클래스와 일치하는 요소에
직접 UI를 만들도록 하는 대신 또는 그와 함께
작성자가 사용자 에이전트에 지시하여
적절한 경우 사용자 에이전트 자체가 UI를
제공하도록 하는 것입니다.
예를 들어 image-animation 속성에 controlled라는 값을 추가로 정의할 수 있습니다. 이 값이 지정되면 처음에는 이미지 애니메이션이 실행되지 않으며, paused가 지정된 것처럼 동작합니다. 또한 기반 요소가 이미지를 나타내고 (즉, CSS로 로드된 이미지가 아니며) 해당 이미지가 실제로 애니메이션 이미지라면, 사용자 에이전트는 사용자가 애니메이션을 재생하고 일시 중지할 수 있는 UI를 제공하고, 해당 요소에 포커스를 맞출 수 있도록 합니다.
필요하다면 이 기능을 이 명세의 이후 버전에 추가할 수 있습니다. 그러나 작성자가 이를 널리 사용할지는 불확실합니다. 작성자는 사이트에 맞게 특별히 설계된 UI 컨트롤을 선호하는 경우가 많기 때문입니다. 따라서 이 명세에서는 이러한 해결 방법의 복잡성을 구체적으로 다루는 작업을 작성자의 수요가 확인될 때까지 미루기로 했습니다.
6. 개인정보 보호 고려 사항
image-animation 속성을 사용하면
출처가 다른 이미지의 애니메이션도 제어할 수 있으며,
해당 이미지가 실제로 애니메이션을 실행할 수 있는지에 관한 정보는 유출되지 않습니다.
이 정보에 따라 계산값이 변경되지 않기 때문입니다.
running 값은 애니메이션 이미지와
정적 이미지에
시각적으로 다른 영향을 주지만,
페이지 자체에서는 이러한 차이를 관찰할 수 없습니다.
그러나 :animated-image 의사 클래스는 요소가 나타내는 선언적 이미지가 애니메이션 이미지인지 정적 이미지인지 드러냅니다. 이는 출처가 다른 경우 페이지가 원래 알 수 없는 정보입니다. CORS를 통해 이를 제한할 수도 있지만, 이 명세에서는 다음과 같은 이유로 이러한 제한을 적용하지 않기로 했습니다.
-
이 정보로 얻을 수 있는 추가적인 이점은 많지 않습니다.
-
대상 URL에 이미지가 존재하는지 여부만으로도 사용자에 관한 중요한 정보가 드러날 수 있습니다. (예: 특정 도메인에 로그인되어 있는지 여부) 그러나 이는 이미 이미지의 크기를 통해 알아낼 수 있으므로 애니메이션 가능 여부가 이러한 위험을 유의미하게 증가시키지는 않습니다.
-
실제로 사이트가 동일한 URL에서 정적 이미지와 애니메이션 이미지를 모두 제공하고, 사용자에 관한 비공개 정보에 따라 어느 이미지를 제공할지 선택하도록 설계되어 해당 정보가 유출될 가능성은 매우 낮습니다.
-
-
비디오에서도 이미 비슷한 정보가 공유됩니다. HTML
video요소는 출처가 다른 비디오에 대해서도 재생 시간을 노출합니다. 정적 이미지는 재생 시간이 0인 애니메이션 이미지의 특수한 경우라고 볼 수 있으므로 해당 정보를 노출하는 것도 이와 유사합니다. -
<video>요소에서 이미지를 허용하자는 제안이 있습니다. 이 제안이 구현되면 상황이 단순히 유사한 데 그치지 않고, 이미지의 애니메이션 여부를 출처가 다른 경우에도 이미 알아낼 수 있게 됩니다.
또한 사용자 에이전트가 이미지 애니메이션을 억제하는 설정을 제공하는 경우, 해당 설정과 :animated-image 의사 클래스 사이의 상호 작용은 잠재적으로 핑거프린팅 정보의 출처가 될 수 있으며, 이에 대해서는 관련 절에서 설명합니다.
7. 보안 고려 사항
이 명세가 새로운 보안 문제를 도입하는 것으로 알려져 있지는 않습니다.
8. 변경 사항
2026년 4월 9일 최초 공개 작업 초안 이후의 변경 사항