Webサイトに滑らかなアニメーションやパララックス(視差効果)を導入すると、一気にモダンで洗練された印象になります。
しかし、過度な動きや視覚効果は一部のユーザーに画面酔いなどの体調不良を引き起こす原因になります。
アニメーション表現の魅力を損なわずに、すべての人が快適に使えるWebサイトを実装するためにどうすればいいでしょうか。
その解決策となるのがprefers-reduced-motionです。
アニメーションにアクセシビリティ配慮が必要な理由
派手なアニメーション演出や表現は閲覧したユーザーに大きなインパクトを与える一方で、見る人によっては以下のような悪影響を及ぼすことがあります。
- 体調不良・めまい:画面全体の大きな揺れにより、めまいや頭痛を引き起こす
- 画面酔い:画面上の急激な移動や変化によって気分が悪くなる
- 注意欠陥:動きが視覚的なノイズとなり、コンテンツの読解に集中できなくなる
「画面酔い」を引き起こしやすいアニメーションの具体例
Webサイト制作でよく使われる演出の中にも、注意が必要なものが多くあります。
- 画面全体がスクロールと違う速度で動く背景
- ページ遷移時の激しいズームイン・ズームアウト
- 勢いよく動く大きな移動アニメーション
- 背景で自動再生され続ける動画やスライドショー
情報を探したいだけなのにアニメーションによって体調を崩してしまう、こうしたリスクを避けるためにiOSやAndroid、macOS、Windowsといった主要なOSには「画面の動きを抑える設定」が用意されています。
prefers-reduced-motionとは
ユーザーがこの「画面の動きを抑える設定」を有効にすると、有効にした設定をブラウザを通してCSS側で受け取り、演出を自動的に切り替えます。
CSSでの基本的な書き方
prefers-reduced-motionとはCSSのメディアクエリの一つです。
以下のようにメディアクエリを用いて記述します。
/* ホバー時に上に浮くアニメーションを設定 */
.card {
transition: transform 0.3s ease, box-shadow 0.3s ease;
cursor: pointer;
}
.card:hover {
transform: translateY(-8px);
box-shadow: 0 5px 5px rgba(0, 0, 0, 0.15);
}
/* ユーザーが「動きを抑える」設定をしている場合 */
@media (prefers-reduced-motion: reduce) {
.card {
/* 動き(transform)は無効化し、影の変化だけ残す */
transition: box-shadow 0.3s ease;
}
.card:hover {
transform: none;
}
}
この記述により、ユーザーの設定状態によってマウスホバー時の挙動が以下のように変化します。
- 通常時:カードが上へ浮き上がり、同時に影がつきます。
- 動きを抑える設定時:浮き上がるアニメーションが無効化され、影の変化だけでホバーしたことを直感的に伝えます。
JavaScriptでの実装例
JavaScriptで制御している場合も、matchMediaを使えば同様の判定ができます。
const cards = document.querySelectorAll('.card');
const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)');
cards.forEach(card => {
card.addEventListener('mouseenter', () => {
if (prefersReducedMotion.matches) {
// 動きを抑え、影の変化だけで反応を伝える
card.animate(
[{ boxShadow: '0 0 0 rgba(0, 0, 0, 0)' }, { boxShadow: '0 5px 5px rgba(0, 0, 0, 0.15)' }],
{ duration: 300, fill: 'forwards' }
);
} else {
// 通常時は浮き上がるアニメーション
card.animate(
[{ transform: 'translateY(0)' }, { transform: 'translateY(-8px)' }],
{ duration: 300, fill: 'forwards' }
);
}
});
// マウスが離れたときに元に戻す
card.addEventListener('mouseleave', () => {
if (prefersReducedMotion.matches) {
// 影を元に戻す
card.animate(
[{ boxShadow: '0 5px 5px rgba(0, 0, 0, 0.15)' }, { boxShadow: '0 0 0 rgba(0, 0, 0, 0)' }],
{ duration: 300, fill: 'forwards' }
);
} else {
// 位置を元に戻す
card.animate(
[{ transform: 'translateY(-8px)' }, { transform: 'translateY(0)' }],
{ duration: 300, fill: 'forwards' }
);
}
});
});
prefers-reduced-motion実装時の注意点
prefers-reduced-motion を使う際の注意点があります。
注意点1:一括で無効にしない
全要素に対して* { animation: none !important; }と一括での無効化はしない方がよいです。
ローディング用のくるくる回るアイコンやプログレスバーなど、必要なアニメーションまで静止してしまい、ユーザーは「通信エラーでフリーズしたのか、処理中なのか」がわからなくなります。
注意点2:「なくす」のではなく「安全な代替演出に置き換える」
アニメーションに対するアクセシビリティの理想的な対応は、アニメーションを完全になくすことではありません。
「体調不良を起こすような過度な位置移動や視差効果を抑え、柔らかいフェードインなど安全な演出に置き換える」ことが大切です。
まとめ
「動きで惹きつける演出」と「誰もが安心して使える配慮」は、prefers-reduced-motionを活用することで両立できます。
動きをすべてなくしてしまうのではなく、「安全で心地よい表現」への視点を持って、すべてのユーザーが快適に閲覧できるWebサイトを目指しましょう。