1. イントロダクション
アニメーション画像([GIF]、[PNG]、[WebP]… などによって実現可能)は、 Web上で一般的に利用されています。 ユーザーエージェントはデフォルトでこれらの画像を自動再生しますが、 これはユーザーにとって不快であったり、 特に1ページに複数の画像が表示されているケース(例:画像ギャラリー)では顕著です。 また、WCAG 2.2 § 成功基準2.2.2 一時停止・停止・非表示にも違反します。 現在のところ、 サイト制作者にはこれを制御する手段がありません。
このため、こうしたアニメーションを制御したいというユーザーの要望があります。しかし、利用形態が多様であるため、 ケースや求められるUI・ユーザー体験も幅広く、 これを自動化やユーザーエージェントのオプトイン機能とすることは十分とは言えません。
ユーザーに最良の体験を提供するために、 ウェブサイトはアニメーション画像ごとに再生体験を個別に制御する必要があります。
本仕様は、CSSプロパティ(image-animation) と疑似クラス(:animated-image) を提案し、 制作者がアニメーションを制御可能にし、 その制御や任意のUIを関連要素へ適用できるようにします。
動機や検討した代替案の詳細については、 別管理されている 説明文書(explainer) や プレゼンテーション も参照ください。
2. 画像アニメーションの制御:image-animation プロパティ
| 名前: | image-animation |
|---|---|
| 値: | normal | paused | stopped | running |
| 初期値: | normal |
| 適用対象: | コンテンツ画像および 装飾画像を持つ要素 |
| 継承: | yes |
| パーセンテージ: | n/a |
| 算出値: | 指定通り |
| 標準順序: | 構文規則に従う |
| アニメーション型: | 離散 |
このプロパティにより、制作者は アニメーション画像を アニメーション状態で表示するか 一時停止状態で表示するかを制御できます。
コンテンツ画像および装飾画像 の両方がこのプロパティの影響を受けます。 要素内に複数の装飾画像 (例:複数の背景画像やボーダー画像) またはコンテンツ画像と1つ以上の装飾画像がある場合、 その要素のこのプロパティの算出値が全てに影響します。
注記: よって、要素の 装飾画像のみを 一時停止し、同じ要素のコンテンツ画像のアニメーションだけを再生したり、 逆の操作をすることはできません。
非アニメーション画像の場合は、 このプロパティの値を変えても効果はありません。 また、このプロパティは動画やプログラムによる画像 には影響しません。
このプロパティがルート要素 に適用された場合 その効果は背景の装飾画像についてキャンバス背景 にも伝播します。
注記: 互換性のため、
backgroundプロパティはルート要素だけでなく
HTMLの
body
要素からも伝播します。
しかし、image-animation
のような新しいプロパティはルート要素のみから伝播します。
body
に設定しても、
そこにbackgroundが指定されている場合であっても
伝播はしません。
- normal
-
アニメーション画像
のアニメーションは、画像フォーマットやホスト言語により
通常通り再生されます。
さらに、 同じアニメーション画像で絶対URL・画像データが同一で かつ算出値image-animation がnormal のものは 全てグループとして同じタイムライン上で同期再生しなければなりません。 タイムラインはグループ内で最も早く追加された時点から始まります。
注記: 上記要件は [HTML]で HTML § 15.4.2 Imagesに規定されるレンダリング期待値に基づきます。 ただし[HTML]は 文書の具体的な表示方法を通常必須とはしていませんので 上記の挙動は規範的ではありません。 本仕様はこれを規範要件とします。
- stopped
- アニメーション画像は 静止画像 として描画されます。 ユーザーエージェントはアニメーションを再生してはなりません。 カバーフレーム を含む場合はそのフレームを表示しなければならず、 それ以外の場合はアニメーションの初期状態で画像を表示します。
- paused
-
ユーザーエージェントは
アニメーション画像に
含まれるアニメーションを
再生してはなりません。
この値の適用開始時点で表示されていた画像のまま
アニメーションを事実上「一時停止」します。
この値が適用されるまでアニメーションが再生されていなかった場合、 挙動はstoppedと同じです。
- running
-
normal と同様に
アニメーション画像
のアニメーションが画像フォーマットやホスト言語に従って
通常通り再生されます。
ただし、アニメーションタイムラインは要素ごとにスコープされます: 単一要素内のコンテンツ画像および 装飾画像の間では 同じ絶対URLかつ同じ画像データ、 かつimage-animation算出値がrunningのものは ひとまとまりのグループとして同期再生されますが、 他要素中の画像とはタイムラインが別になります。
この値が適用されている間に画像が要素に追加された場合、 タイムラインはグループ内で新たに最も早く追加された時点から開始します。
要素がdisplay: none から作成または表示され、 すでに画像が追加されており、かつ image-animation がrunningの場合、 タイムラインはレイアウトに加えられた時点から開始します。
このプロパティを他の値から running に切り替えた場合は アニメーションは切り替え時点で表示されていた状態から続行となるよう タイムラインの開始位置を調整します。
img
要素のみアニメーションを継続しています。
:root{ /* 継承により文書全体に伝播 */ image-animation: paused; } img{ image-animation : normal; }
img
要素で
同じ画像(絶対URL・画像データとも同一)を表示し、
全てにimage-animation: normal
が指定されているとします。
そのうち1つの要素だけ image-animationプロパティを一時的に paused に変更すると、 その画像アニメーションだけが停止します。 他の画像には影響せず、 アニメーションは継続します。
次に、その要素の image-animationプロパティを 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画像は静止画像です。
- アニメーション画像
-
複数フレームを
最終的な表示体験の一部として連続表示することを
意図した画像であり、
ループする場合もしない場合もあります。
アニメーションPNG画像や アニメーション[GIF]画像は アニメーション画像です。
プログレッシブレンダリングやマルチパス読み込みへの対応があるだけでは、 アニメーションとはみなされません。
- コンテンツ画像
-
静止画像または
アニメーション画像を
表現するホスト言語の要素。ただし
動画や
プログラム画像は除きます。
img[HTML]要素(picture要素内にネストされている場合も含む)、object[HTML]要素(画像を 表現する場合)、 およびimage[SVG2] 要素がコンテンツ画像にあたります。 - 装飾画像
-
background-imageやborder-imageなどのCSSプロパティを通じて 文書レンダリングに挿入される画像。 - 動画
-
ホスト言語において動画(動く画像)を表す要素。 通常、音声を伴う場合もあるが必須ではなく、 再生・一時停止・シーク・音量調整・全画面表示などの インタラクティブなコントロールが伴う場合もある。 また、キャプションや字幕を伴うこともある。
注記: 概念的には、ファイルフォーマットだけに注目すると 動画とアニメーション画像の区別は 実質的な重なりが多く 原理的に区別できないこともある。 ここでの区別は文書内でどの要素を使うかという 制作者の意図に依存します。
- プログラム画像
- ホスト言語のAPIを利用してプログラム的に生成された画像。 外部リソースから読み込まれる画像とは区別される。
- カバーフレーム
- 一部のアニメーション画像 形式では、 画像作者が静止画像 を指定することができ、この文書ではそれを カバーフレーム と呼びます。 アニメーションが再生されていないときに 初期状態とは別に表示されるフレームです。
5. アクセシビリティに関する考慮事項
- 本仕様で導入された機能により、 WCAG 2.2 § 成功基準2.2.2 一時停止・停止・非表示 の違反となっていた状況へ対処できるようになります。
-
Webページには既にアニメーション画像を含められますが、
適切な
altテキストを必ず提供することが既定です。 アニメーションの一時停止や再開への対応にあたり、 テキスト記述の変更は不要であり、 「アニメが潰されるコヨーテ」, 「踊るハムスター」, 「工事中」, 「回転中のローディングインジケーター」 などの説明は アニメーションの状態に関係なく適切かつ伝わりやすいままです。 - 現状、スクリーンリーダーはアニメーション画像と非アニメーション画像を 区別して読み上げることは一般的にありませんが、 要望があれば実装することは可能です。 一時停止中や再生中の画像も違う扱いになることはありません。 ただし、これも要望があればできます。
-
§ 3 アニメーション画像の識別::animated-image疑似クラス
でも述べたとおり、
画像アニメーション制御UIを構築する制作者は、
アクセシブルなUIを構築するため
通常の配慮が必要です。
CSSだけでは要素のフォーカス化はできないので、
適切なキーボード操作には要素属性の設定も必要です。
制作者が:animated-image疑似クラスにマッチする要素上に独自の
UIを追加する代わりに、
必要に応じてユーザーエージェント自身にUIの提供を指示する
ことも考えられます。
例えば、image-animationプロパティに 追加でcontrolled値を定義すれば、 初期状態でアニメーションは再生されず pausedと同じ挙動となった上で、 その要素が本当に コンテンツ画像で かつアニメーション画像であれば ユーザーエージェントが再生・一時停止UIを提供し かつ要素をフォーカス可能にすることができます。
必要であれば今後の仕様でこれを追加可能ですが、 制作者の多くはサイトに合わせて独自UIを実装したい傾向が強いため 広く使われるかは不明です。 したがって、本仕様では こうした高度な仕組みの導入は 要望が確認されてからとしています。
6. プライバシーに関する考慮事項
image-animationプロパティは
クロスオリジンでもアニメーション制御を可能にしますが、
画像が実際にアニメーション可能かどうかの情報は漏れません。
算出値はその情報により変わりません。
running値はアニメーション画像と
静止画像とで
目に見える効果の違いがありますが、
その違いをページ側が観測することはできません。
一方で:animated-image疑似クラスは コンテンツ画像が アニメーション か静止画像かを ページにクロスオリジンでも伝えます。 これはCORSで制限可能ですが、 本仕様では次の理由で制限していません:
-
すでに知られている情報しか得られないことが多い。
-
画像が対象URLに存在するかどうか自体がユーザーについて (例:特定ドメインにログイン中か等)重要な情報を明かしうるが これは画像の大きさなどから既に分かっており、 アニメーション可能性が新たなリスクを 本質的に増すことはありません。
-
同じURLで静止画像とアニメーション画像の両方を ユーザー非公開情報で分岐して返すこと自体、 サイト設計上非常にまれです。
-
-
動画についても同様の情報は既に共有されています: HTML
video要素はクロスオリジン動画でもdurationを公開します。 静止画像は本質的には duration=0の特殊なアニメーションなので 同様に公開しても不都合はありません。 -
<video>要素で画像を使えるようにしようという提案もあります。 実現すれば、アニメ画像化かどうかは クロスオリジンでも既に分かる状態になります。
7. セキュリティに関する考慮事項
本仕様で新たなセキュリティ問題は把握されていません。