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 |
| 适用对象: | 内容图片和 带有装饰图片的元素 |
| 可继承: | 是 |
| 百分数: | n/a |
| 计算值: | 如指定 |
| 规范顺序: | 按语法 |
| 动画类型: | 离散 |
该属性允许作者控制 动画图片 以动画状态显示 或保持暂停。
此属性会影响 内容图片和装饰图片。 当一个元素包含多个装饰图片 (如多重背景图片或边框图像), 或者既有内容图片又有一个或多个装饰图片时, 该元素上的属性计算值会同时影响它们。
注:因此无法只暂停 元素上的装饰图片动画, 而让同一元素的内容图片动画继续, 反之亦然。
对于非动画图片, 此属性的不同值无效。 此属性同样不影响视频或编程生成图片。
当此属性应用于根元素时, 对背景装饰图片的影响会传递到画布背景中。
注:由于历史原因,
background属性不仅从根元素继承,
也会从 HTML
body
元素继承。
但较新的属性如image-animation仅从
根元素传播。
设置于
body
不会生效,
即使背景属性设置在这里。
- normal
-
动画图片的动画按正常方式运行,
以图片格式和宿主语言决定。
此外, 所有具有相同绝对URL、 相同图片数据且 image-animation计算值为 normal的 动画图片 必须以同一时间线为组同步渲染, 该时间线开始于组中最早添加的时间。
注:上述要求基于[HTML]渲染期望,在 HTML § 15.4.2 图像中定义。 由于[HTML]通常不要求 用户代理以特定方式展示文档,因此没强制该行为。 本规范则要求如此。
- stopped
- 动画图片 渲染为静态图片: 用户代理不得播放其任何动画。 若图片包含封面帧, 则必须使用该帧; 否则显示动画初始状态的图片。
- paused
-
用户代理不得运行
动画图片中的动画,
并必须继续显示
本值应用时图像的状态,
实现动画暂停效果。
如果在应用该值前动画未播放, 行为与stopped 相同。
- running
-
与normal类似,
动画图片的动画正常运行,
由图片格式及宿主语言决定。
但动画的时间轴按元素单独划分: 在同一元素的内容图片 及装饰图片中, 具有相同绝对URL、 相同图片数据且 image-animation计算值为 running 的动画图片, 必须在本元素内同步渲染成同一时间线为组, 该组与其它元素的图片时间线独立。
若在计算值为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值影响。 但若用户代理全局禁用图片动画, 即使本可动画的图片也会视为静态图片,不会匹配。
4. 术语
- 静态图片
-
仅显示单帧作为最终观看体验的图片。
JPEG 图片是一种静态图片。
- 动画图片
-
最终观看体验需顺序显示多帧的图片,
可以循环也可以不循环。
仅支持渐进渲染或多遍加载 并不属于动画。
- 内容图片
-
宿主语言中表示静态图片
或动画图片的元素,
不包括视频或编程图片。
img[HTML] 元素, 包括嵌套于picture元素时;object[HTML] 元素(如果其表示一个图片); 以及image[SVG2] 元素 都是内容图片。 - 装饰图片
-
通过 CSS 插入文档渲染流程的图片,
如
background-image或border-image等属性添加。 - 视频
-
宿主语言中表示动态画面(可带音频或不带音频), 通常甚至带有交互控件 (播放、暂停、定位、音量、全屏等), 也可有字幕或说明文字的元素。
注:从文件格式角度, 视频和动画图片概念重叠广泛, 原则上未必能严格区分。 此处区别基于作者意图, 取决于文档中选用的元素。
- 编程图片
- 通过宿主语言 API 编程生成的图片, 而非外部资源加载图片。
- 封面帧
- 一些动画图片 格式允许创作者指定一个静态图片, 在本规范中称为封面帧, 用于动画未播放时显示, 明确区别于动画的初始状态。
5. 无障碍性考虑
- 本规范引入的特性使作者能够 避免WCAG 2.2 § 成功标准 2.2.2 暂停、停止、隐藏 的潜在违规。
-
网页本就可以包含动画图片,
而且应当为
alt属性提供合适的描述。 为适应动画暂停或恢复,无需也不应改变描述内容。 比如 “卡通郊狼被铁砧砸到”, “可爱的跳舞仓鼠”, “建设中”, 或“旋转的加载指示器”, 这些描述在动画播放与否时同样合适有效。 - 目前,屏幕阅读器通常不会对动画图片 和非动画图片作区分提示, 当然如果需要也可实现。 同样,对于图片的暂停或播放状态也不预期有特别说明, 但如有需要也可实现。
-
如§ 3 区分动画图片::animated-image 伪类所述,
作者若实现用于控制图片动画的UI,
需注意通用的无障碍性原则,
做好无障碍UI的设计。
由于无法直接在 CSS 中让元素可获焦点,
正确的键盘导航还要求设置合适的元素属性。
另一种方案,
是让作者可以指示用户代理
在合适时机自动为匹配:animated-image伪类的元素
提供 UI 控件,替代或补充自定义 UI。
比如,可以为image-animation属性 定义新的controlled值。 指定该值时,动画初始不运行, 等效于指定paused。 并且, 若底层内容图片实际为动画图片, 用户代理会自动为用户提供动画的播放/暂停控件, 并让元素可获焦点。
如有必要,可在后续规范版本中补充该功能。 不过, 目前尚不确定作者是否乐于广泛采用此方案, 他们往往偏好自己设计 UI 控件以贴合站点风格。 故本规范选择 等待作者需求确认后再处理相应复杂度。
6. 隐私 考虑
image-animation属性允许跨域控制图片动画,
且不会泄漏图片是否可动画的信息。
属性计算值不会因此变更。
running值对动画图片
和静态图片有不同表现,
但页面本身观察不到这些差异。
不过,:animated-image伪类会暴露 某个内容图片 是否为动画或静态, 这是页面本无法跨域知晓的信息。 虽可通过 CORS 限制, 但本规范选则不做限制,原因如下:
-
这类信息带来的增益并不多。
-
目标 URL 下图片的存在性 已可暴露用户关键信息 (如是否登录特定域名), 但这可通过图片尺寸知晓, 可动画性无实际风险增量。
-
实际运用中,网站极少 用同一 URL 按用户私有信息 区分返回静态/动画图片, 因此泄漏风险极低。
-
-
视频已存在类似信息共享现象: HTML
video元素即使跨域也可获取 duration。 静态图片本质上是 duration=0 的动画图片, 曝露该信息并无区别。 -
有提案允许
<video>元素加载图片。 若实现,该情形不再类比,实际上 任何图片是否动画跨域也都可知。
7. 安全 考虑
本规范据悉不会引入新的安全问题。