JavaScriptで背景画像を動かすだけで怒られる。CSSでやればJavaScriptを無効にされても動かせるので、もっと怒られるのかもしれない。いちいちCSSアニメーションを書くのは面倒なので、transition
プロパティーを使ってインスタントに動かせるような工夫を考えた。
Demo: Animated Background
ループできないtransiton
プロパティーで擬似的に永続アニメーションを提供するには、transition-duration
プロパティーで大きな値を指定すれば良い。またアニメーションの開始に必要になるトリガーは主に擬似クラスを利用することになるが、body
要素に:hover
擬似クラスを直接使うとアニメーションをうまく起こせない問題があり、:target
擬似クラスではIDの指定とURLが限定される問題がある。ルートのhtml
要素に:hover
を指定することで、この二つの問題は解決できる。あとはどれくらいのスピードで動かすのかを考えてbackground-position
プロパティーで大きな値を指定するだけで良い。
body {
background-image: url('background.png');
background-position: 0 0;
}
html:hover body {
background-position: 720000px 720000px;
transition-property: background-position;
transition-timing-function: linear;
transition-duration: 3600s;
}
デモでは800x800の画像を背景にしたので、4秒で1周するように720000px
を指定した。アニメーションの長さは1時間確保しておけば大丈夫だろう。リニアなアニメーションなら、このようにちょっと工夫すればできるけど、拡大・縮小を繰り返すとかはanimation
プロパティーを使った本元CSSアニメーションじゃないと難しい。
パフォーマンスとしてはInternet Explorer 11とFirefox 29ではハードウェア・アクセラレーションが何もせずに効くので問題ない。Chrome 34ではCPUを食いつくすので、なんらかの方法でハードウェア・アクセラレーションを有効にする必要がある。