
背景画像を縦方向に無限スクロールさせる[Infinite Scrolling Background]を紹介します。
まずは実際に動いているサンプルをご覧ください。
Infinite Scrolling Background : https://on-ze.com/demo/css3-infinite-scrolling-background/
一見すると jQuery を使っているようですが、実はシンプルな CSS のみで実装しています。
具体的には CSS3 の『translate3d』を利用することになりますね。
HTML の記述
以下、背景部分のHTMLの書き方です。
<body> ... <div id="window"></div> </body>
ウィンドウ全体に背景を敷き詰める場合でも、body要素に直接 background を指定するのではなく、背景を描画する専用のボックス要素を用意します。
ここでは仮に <div id="window"></div> 要素を作ります。
CSS の記述
続いては CSS です。
以下、キーフレームの指定も含めたスタイルシートの記述になります。
#window {
background-image:url("bg.svg");
background-position:center center;
background-size:500px 320px;
width:100%;
height:300%;
position:fixed;
top:0;
left:0;
right:0;
bottom:0;
-webkit-animation:infinitescroll 5s linear infinite;
-moz-animation:infinitescroll 5s linear infinite;
-ms-animation:infinitescroll 5s linear infinite;
-o-animation:infinitescroll 5s linear infinite;
animation:infinitescroll 5s linear infinite;
z-index:0;
}
@-webkit-keyframes infinitescroll {
0% {-webkit-transform:translate3d(0, 0, 0);}
100% {-webkit-transform:translate3d(0, -320px, 0);}
}
@-moz-keyframes infinitescroll {
0% {-moz-transform:translate3d(0, 0, 0);}
100% {-moz-transform:translate3d(0, -320px, 0);}
}
@-ms-keyframes infinitescroll {
0% {-ms-transform:translate3d(0, 0, 0);}
100% {-ms-transform:translate3d(0, -320px, 0);}
}
@-o-keyframes infinitescroll {
0% {-o-transform:translate3d(0, 0, 0);}
100% {-o-transform:translate3d(0, -320px, 0);}
}
@keyframes infinitescroll {
0% {transform:translate3d(0, 0, 0);}
100% {transform:translate3d(0, -320px, 0);}
}
先にHTMLに記述した <div id="window"></div> 要素には position:fixed; 等を効かせてウィンドウ全体を覆います。
またこのとき、高さは最低でも200%以上に指定します。
そして重要な@keyframesですが、「translate3d」で指定する第2引数には背景で使用する画像の高さを記入します。今回の場合、背景画像の高さは 320px なので transform:translate3d(0, -320px, 0); となっています。
Infinite Scrolling Background : https://on-ze.com/demo/css3-infinite-scrolling-background/
同じ方法で「translate3d」ではなく「background-position」を使う方法もあります。
「background-position」を使いたい場合はキーフレームの箇所を次のように書き換えましょう。
@-webkit-keyframes infinitescroll {
0% {background-position:0 0;}
100% {background-position:0 -320px;}
}
@-moz-keyframes infinitescroll {
0% {background-position:0 0;}
100% {background-position:0 -320px;}
}
@-ms-keyframes infinitescroll {
0% {background-position:0 0;}
100% {background-position:0 -320px;}
}
@-o-keyframes infinitescroll {
0% {background-position:0 0;}
100% {background-position:0 -320px;}
}
@keyframes infinitescroll {
0% {background-position:0 0;}
100% {background-position:0 -320px;}
}
先ほどと同じようにスクロールさせる距離は背景画像の高さに合わせます。
なお「translate3d」と「background-position」を比較すると、描画は「translate3d」のほうがスムーズです。
ぜひお試しください。