投稿日:2020年12月3日
季節柄、css 雪のクエリで本サイトを訪れる方が増えています。
PV数も右肩上がりです。
誠に、ありがとうございます。
上記サイトは、雪の結晶のpngデータをhtmlのDOMを書き換えて、ふわふわ舞っている感じを表現しています。
動きなどは同様ですが、今回は画像を使わず、CSSだけで雪を降らせてみます。
CSSで円を作り、それを雪と見立てて作ったのが以下になります。
ソースコードは下記。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>snowPowder</title>
<style>
* {
margin: 0;
padding: 0;
}
#main__container {
width: 100%;
height: 300px;
background-color: #000;
overflow: hidden;
display: flex;
justify-content: space-around;
transition-duration: 0.1s;
transition-timing-function: ease;
}
</style>
</head>
<body>
<div id="main__container"></div>
<script>
var winWidth = document.documentElement.clientWidth, //ウィンドウの横幅
winHeight = document.documentElement.clientHeight; //ウィンドウの高さ
var main = document.getElementById('main__container');
for (var i = 1; i <= 40; i++) {
var div = document.createElement('div'); //divを作成
main.appendChild(div); //divを追加
div.setAttribute('id', 'contents' + zeroPad(i));
div.setAttribute('style', 'position:relative; background-color:#fff; border-radius:50%; top:-30px;');
randomValue(div);
}
function randomValue(ele) {
var multiArray = [1, -1]; //1か-1の配列
var randomMulti = multiArray[Math.floor(Math.random() * multiArray.length)]; //1か-1をランダムに取得
var maxSize = 9, //最大サイズ
minSize = 3, //最小サイズ
objSize = getRandomNum(maxSize, minSize), //サイズ 最大〜最小までのランダム値
blurValue = getRandomNum(3, 0), //ボカシ量
opacityValue = getRandomFloot(0.8, 0.5).toFixed(1), //透明度 ※小数点第1位まで取得
XSpeedNum = getRandomFloot(2, 0), //Xの移動量
YSpeedNum = getRandomFloot(4, 2), //Y座標の移動量
ZSpeedNum = getRandomFloot(0.025, 0); //Z座標の移動量
ele.style.width = objSize + 'px';
ele.style.height = objSize + 'px';
ele.style.margin = (maxSize - objSize) / 2 + 'px';
ele.style.filter = 'blur(' + blurValue + 'px)';
ele.style.opacity = opacityValue;
var YNum = -40;
var XNum = 0;
var ZNum = 0;
(function animeLoop() {
var requestAnime = window.requestAnimationFrame(animeLoop);
XNum += XSpeedNum;
YNum += YSpeedNum;
ZNum += ZSpeedNum;
ele.style.top = YNum + 'px';
ele.style.left = XNum * randomMulti + 'px';
ele.style.transform = 'scale(' + ZNum + ',' + ZNum + ')';
if (YNum >= 300) {
window.cancelAnimationFrame(requestAnime);
return randomValue(ele);
}
})();
return ele;
}
//////////// 関数 ////////////
function zeroPad(zeroNum) { //ゼロパッド取得関数
var zeroNum = ('000' + zeroNum).slice(-3);
return zeroNum;
}
function getRandomNum(max, min) { //ランダム値取得関数
var ranNum = Math.floor(Math.random() * (max + 1 - min) + min);
return ranNum
}
function getRandomFloot(max, min) { //ランダム値取得関数 小数点第1位
var ranFlootNum = Math.random() * (max - min) + min;
return ranFlootNum;
}
</script>
</body>
</html>
▲pure Scriptで少々古いJSです。
maxSize
の大きさと、for
文内での数にもよりますが、あまり大きいと円がイビツになります。
コピペしてご自由にお使いください。
※何か問題が発生しても責任は負いかねます。
まとめ
最近、Reactを学び始めたので、折を見てReactで記述してみたいと思います。
それと、この記事を書くのと同じ頃にAfter Effectでも同様のムービーを作ったので、できたらアップします。
最後まで読んでくださりありがとうございました。
関連記事