CSSだけで雪を作ろう!降らせよう!

投稿日
  • コーディング

12月に入りますます寒さが厳しくなり、雪の気配が感じられるようになってきました。
というわけで、今回はCSSを使って雪を降らせる方法を考察してみました。
使うのはCSSだけで 画像ファイルは一切使用しません!図1

図1 CSSで雪のアニメーション

前述の通り、上のアニメーションですが雪には一切画像を使用していません。
CSSのradial-gradient()関数を使って雪の画像を作成し、その画像をAnimationプロパティで指定したキーフレームアニメーションで動かす、という仕組みになっております。
なお上記の例に関しては雪の大きさと配置、半透明度などをランダムに表示させるために、radial-gradient()関数の指定に関してのみJavaScriptを使用しております。

radial-gradient()関数で雪を作ろう!

radial-gradient()関数は放射状のカラーグラデーション画像を作り出すことができる関数です。
作成した画像はbackground-imageやborder-image、list-style-imageなどの画像として使用することが可能です。
関数の設定を工夫すると、グラデーション画像だけではなく、任意の大きさの円画像を作ることも可能です。
早速一つ例を見てみましょう。

radial-gradient()関数 動作例1

background-image: radial-gradient(circle at center center, 
    #81bf33 0px,
    #81bf33 50px,
    transparent 50px,
    transparent 100%);

上記は半径50pxの緑色の円を背景画像として描いたものです。
まずradial-gradient()関数の中身を1つ1つ見ていきましょう。
最初の"circle"は円を描くのに必要な記述です。
"at" で続く記述は円の中心を示しています。今回は"center center"ですので、円の中心が親画像の中心と重なるようになっています。
次の具体的なグラデーションの記述をカンマ区切りで行います。
グラデーションの記述は"色の指定"と"グラデーションの位置"にて構成されており、円の中心から順に記載していきます。
0pxから50pxまでは緑色、それ以降は透明(transparent)とすることで、円画像を作っています。
なお最後の"transparent 100%"は省略することも可能です。

radial-gradient()関数 動作例2

background-image: radial-gradient(circle at 15px 15px,
    #81bf33 0px,
    #81bf33 10px,
    transparent 10px),
radial-gradient(circle at 80px 80px, 
    #81bf33 0px, 
    #81bf33 20px, 
    transparent 20px);

background-imageが複数設定できることを利用して、今度はradial-gradient()関数にて異なる大きさの円を2つ作りました。
例1とほとんど同じですが、"at"以降に具体的な円の中心位置を指定することで、異なる場所に円を表示するようにしています。

作成した画像を繰り返し表示させる

background-size: 100px 100px;
background-repeat: repeat;

実は先ほどの円画像は100×100pxに収まる範囲で作成していました。
あらためて"background-size: 100px 100px;"と背景の範囲を指定して、"background-repeat:repeat;"とすることで、上記のように作成した画像を繰り返し表示させることができます。
本題とはずれますが、この技術を応用すればCSSだけで様々な背景パターンを作ることが出来ますね。

animationプロパティで雪を動かそう!

雪の画像を作り終えたら、今度はその画像を動かすためのキーフレームアニメーションを作成します。
具体的には背景画像の"background-position"をアニメーションさせます。

.snow{
    height: 300px;
    background-color: #010927;
    background-image: radial-gradient(circle at 10px 10px, 
        rgba(255, 255, 255, 0.5) 0px, 
        rgba(255, 255, 255, 0.5) 3px, 
        transparent 3px), 
    radial-gradient(circle at 35px 35px, 
        rgba(255, 255, 255, 0.7) 0px, 
        rgba(255, 255, 255, 0.7) 6px, 
        transparent 6px);
    background-size: 80px 80px;
    background-repeat: repeat;
    animation-name: snowing;
    animation-timing-function: linear;
    animation-duration: 5s;
    animation-iteration-count: infinite;
}
                   
@keyframes snowing {
    0% {
        background-position: 0% 0px;
    }
    50% {
        background-position: 5% 40px;
    }
    100% {
        background-position: 0% 80px;
    }
}

まずradial-gradient()関数で雪を作成します。
この例では80×80pxの範囲に2つの円(雪)が収まるように設定しています。
あとは色や半径が異なるだけで先ほどまでと同様です。
今回追加したのはanimationプロパティと対応するキーフレームアニメーションになります。
キーフレームアニメーションでは、画像のy方向のポジションを0pxから80pxまでアニメーションすることで、雪を降らす効果を出しています
またx方向も若干動かすことで、雪がゆらゆら揺れている様子も表しています。
アニメーションの速度は"animation-duration"にて設定します。

今回は雪の数を2パターンだけ用意しましたが、その数を増やすことでさらに自然な雪のアニメーションになりますので、また試してみて下さい。
ただし雪の数(radial-gradient関数の数)が増えれば増えるほど、処理が重くなる傾向にありますので注意して下さい。


CSSのみで雪を作り降らせる方法、いかがでしたか?
記事中でも触れましたが今回ご紹介したradial-gradient関数は、様々な背景パターンを作ることにも利用できます。
残念ながらInternet Explorerのバージョン10以下には対応していませんが、モダンなブラウザには全て対応しておりますので、積極的に使用しても良いかも知れませんね。
また参考になれば幸いです。