SnowFall — Анимация падающего снега
Анимация падающего снега воспроизведенная на JQuery. Для анимации используется библиотека TweenMax от GreenSock. Снежинки имеют разное размытие, за счет чего достигается эффект объемности происходящего.
В демо примере показали, как можно применить такую анимацию только для заднего фона.
Мы подключили их с CDN.
Управляя значениями переменных:
Весь код представлен ниже:
В демо примере показали, как можно применить такую анимацию только для заднего фона.
HTML
Сам снег добавляется в контейнер с ID<div id="snow-animation-container"></div>
CSS
Стилей нет, само оформление снежинок формируется js скриптом. Мы управляем только контейнером, в который помещаются все снежинки.JS
Для работы снега, нужно подключить библиотеки jQuery и TweenMax на страницу.Мы подключили их с CDN.
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/1.20.3/TweenMax.min.js"></script>
И после подключить файл со скриптом script.jsУправляя значениями переменных:
- MAX_SNOW = 200 — максимальное количество снежинок
- MAX_SNOW_SIZE = 7 — максимальный размер снежинки в пикселях
- MAX_SNOW_SPEED = 1 — ускорение снежинки
Весь код представлен ниже:
$(document).ready(documentReady);
function documentReady() {
var MAX_SNOW = 200;
var MAX_SNOW_SIZE = 7;
var MAX_SNOW_SPEED = 1;
snowStart();
function snowStart() {
// console.log("// Snow animation start");
createSnows();
}
function createSnows() {
var container = $("#snow-animation-container");
for (var i = 0; i < MAX_SNOW; i++) {
var appendItem = getRandomItem(i);
container.append(appendItem);
var animateItem = $(".snow" + String(i));
var randomTime = Math.random() * MAX_SNOW_SPEED;
goAnimate(animateItem, i, randomTime);
goAnimate2(animateItem);
};
// console.log("// Create snows");
}
function goAnimate(item, id, randomTime) {
TweenMax.to(item, randomTime, {
css: {
marginTop: "+=100"
},
ease: Linear.easeNone,
onComplete: function() {
var topPosition = item.css("margin-top").replace("px", "");
if (topPosition > $(window).height()) {
changePosition(item);
randomTime = Math.random() * MAX_SNOW_SPEED;
goAnimate(item, id, randomTime);
} else {
goAnimate(item, id, randomTime);
}
}
});
}
function goAnimate2(item) {
var directionTime = 1 + Math.floor(Math.random() * 5);
var randomDirection = 1 + Math.floor(Math.random() * 4);
var delayTime = 1 + Math.floor(Math.random() * 3);
if (randomDirection == 1) {
TweenMax.to(item, directionTime, {
css: {
marginLeft: "+=100"
},
ease: Linear.easeOut,
onComplete: function() {
TweenMax.to(item, directionTime, {
css: {
marginLeft: "-=100"
},
delay: delayTime,
ease: Linear.easeOut,
onComplete: function() {
goAnimate2(item);
}
});
}
});
} else if (randomDirection == 2) {
TweenMax.to(item, directionTime, {
css: {
marginLeft: "-=100"
},
ease: Linear.easeOut,
onComplete: function() {
TweenMax.to(item, directionTime, {
css: {
marginLeft: "+=100"
},
delay: delayTime,
ease: Linear.easeOut,
onComplete: function() {
goAnimate2(item);
}
});
}
});
} else if (randomDirection == 3) {
TweenMax.to(item, directionTime, {
css: {
marginLeft: "+=100"
},
ease: Linear.easeOut,
onComplete: function() {
goAnimate2(item);
}
});
} else if (randomDirection == 4) {
TweenMax.to(item, directionTime, {
css: {
marginLeft: "-=100"
},
ease: Linear.easeOut,
onComplete: function() {
goAnimate2(item);
}
});
}
}
function changePosition(item) {
var _width = Math.floor(Math.random() * MAX_SNOW_SIZE);
var _height = _width;
var _blur = Math.floor(Math.random() * 5 + 2);
var _left = Math.floor(Math.random() * ($(window).width() - _width));
var _top = -$(window).height() + Math.floor(Math.random() * ($(window).height() - _height));
item.css("width", _width);
item.css("height", _height);
item.css("margin-left", _left);
item.css("margin-top", _top);
item.css("-webkit-filter", "blur(" + String(_blur) + "px)");
item.css("-moz-filter", "blur(" + String(_blur) + "px)");
item.css("-o-filter", "blur(" + String(_blur) + "px)");
item.css("-ms-filter", "blur(" + String(_blur) + "px)");
item.css("filter", "blur(" + String(_blur) + "px)");
}
function getRandomItem(id) {
var _width = Math.floor(Math.random() * MAX_SNOW_SIZE);
var _height = _width;
var _blur = Math.floor(Math.random() * 5 + 2);
var _left = Math.floor(Math.random() * ($(window).width() - _width));
var _top = -$(window).height() + Math.floor(Math.random() * ($(window).height() - _height));
var _id = id;
return getSmallSnow(_width, _height, _blur, _left, _top, _id);
}
function getSmallSnow(width, height, blur, left, top, id) {
var item = "<div class='snow" + id + "' style='position:absolute; margin-left: " + left + "px; margin-top: " + top + "px; width: " + width + "px; height: " + height + "px; border-radius: 50%; background-color: white; -webkit-filter: blur(" + blur + "px); -moz-filter: blur(" + blur + "px); -o-filter: blur(" + blur + "px); -ms-filter: blur(" + blur + "px); filter: blur(" + blur + "px);'></div>"
return item;
}
}