Falling Snow Effect

Falling Snow Effect

A couple of days ago I created this Falling Snow Effect for day #031 in the #100Days100Projects Challenge and in this article I'm going to show you how easy it is to create such an effect using only vanilla JavaScript and a little bit of CSS.

You can see the effect here:

https://codepen.io/FlorinPop17/pen/xxxEqGj

Before we write any code, let's see what's the logic behind it...

Basically we are going to dynamically create a snow_flake DOM element which will be inserted in the body tag and it's going to be positioned absolute on top of the window by offsetting the top position. After that, we will add a little bit of animation to make it fall down to the bottom.

The JavaScript

We need to create a function that will add a snow_flake to the DOM and it should have all the styling that we want to be randomized:

  • width - to have different sizes
  • left positioning - in order to start falling at a different location
  • animationDuration - to randomize the speed at which falls
  • opacity - to add a 3D effect to it (kinda)

Also, we are going to use FontAwesome to get the snow flake icon.

All the other properties that we need but are static we will add in the CSS part later.

(Below I added the entire function and I explained every line of code via comments)

function createSnowFlake() {
	// Creating the <i> tag
	const snow_flake = document.createElement('i');
	// Adding the required classes for the FontAwesome icon to show up
	snow_flake.classList.add('far');
	snow_flake.classList.add('fa-snowflake');

	// Randomly generate the width to be between 10 and 20 px
	snow_flake.style.width = Math.random() * 10 + 10 + 'px';

	// Randomly generate the left position to be between 0 and the innerWidth of the screen
	snow_flake.style.left = Math.random() * window.innerWidth + 'px';

	// Randomly generate the animationDuration - between 2 and 5 seconds
	snow_flake.style.animationDuration = Math.random() * 3 + 2 + 's';

	// Randomly add an opacity - between 0 and 1
	snow_flake.style.opacity = Math.random();

	// Add the newly created <i> tag inside the <body> tag
	body.appendChild(snow_flake);

	// Set a timeout to remove the snow_flake from the DOM after 5 seconds
	// as we don't want it to overload the page
	setTimeout(() => {
		snow_flake.remove();
	}, 5000);
}

And now that we have this function, we are going to call it inside a setInterval to run 10 times per second (100ms):

setInterval(createSnowFlake, 100);

The CSS

As for the CSS we are setting the static properties plus the animation which is set to forwards as we want the snow flake to stay at the bottom after the animation ends (105vh - viewport height).

.fa-snowflake {
	color: #fff;
	position: absolute;
	top: -20px;
	animation: fall linear forwards;
}

@keyframes fall {
	to {
		transform: translateY(105vh);
	}
}

And finally, let's give the body a background-color in order to be able to see the white snowflakes and an overflow: hidden to make sure that we don't have a scrollbar when the snowflakes reach the bottom:

body {
	background-color: #323975;
	overflow: hidden;
}

Conclusion

Easy-peasy, right? 😄

I hope you enjoyed this little tutorial. Let me know over on Twitter @florinpop1705.

Happy Coding! 😇

Tagged with html5, css3, animation, javascript