Snowstorm: A JavaScript Snow Effect for HTML

Let It Snow.

So, you want JavaScript snow on your web site, eh?

Snowstorm is a JavaScript-driven snow effect that can be easily added to web pages. It is free for use, and easy to set up. A single JavaScript file provides the functionality required. No images are used for the snow effect.

cdl_capture_2011-11-29-27_ 000

I’d like to use this on my site.

This is all you need to get started:

<script src="snowstorm.js"></script>

See this basic example for reference.

What kind of things can I customize?

You can adjust the snow speed, the amount of snow, the “wind”, if and where it should stick (and if it should “melt”), and finally, whether the snow can react to the mouse moving (ie., “wind changes.”) See Customizing Snowstorm for more.

And the Christmas Lights?

The christmas lights are a separate experimental script which also has an example. It is undocumented, but the script can be modified to taste if you’re the adventurous type.

Download

ZIP file, includes this demo page and source code.

Also on Github: github.com/scottschiller/snowstorm/

License

Snowstorm is provided under a BSD license.

Technical Notes

Snowstorm works under most of the old major browsers (IE 5.x+, Netscape 6+) as well as IE 6, 7, 8, Firefox, Safari and Opera, and the iPhone. If you are seeing snow as you read this, then the script is working as expected.

CPU Use

Snowstorm will eat up a lot of CPU, even on modern computers, because of the number of elements being moved around the screen at once. The basic example may have notably lower CPU use as it doesn’t include the christmas lights, and the page layout is much simpler. Consider raising the animation interval, and lowering the amount of snowflakes (active and max) to help reduce CPU use.

By default, mobile phones are excluded from the snow effect to be nice to their CPUs (and batteries), but you can set snowStorm.excludeMobile = false; to enable Snowstorm on devices like the iPhone, iPad and Android cell phones etc. This demo page has the effect enabled for mobile devices.

Implementation

One JavaScript reference is required. Aside from customization, that’s it!

<script src="snowstorm.js"></script>

Once you have snowstorm configured, you can use the optimized, minified version of the code (~40% smaller):

<script src="snowstorm-min.js"></script>

Customizing Snowstorm

Once you have Snowstorm running in your page, you can customize its properties either by editing the snowstorm.js file directly, or assigning new values to the snowStorm object after snowstorm.js has loaded.

For example:

<!-- required snowstorm JS, default behaviour -->
<script src="snowstorm.js"></script>

<!-- now, we'll customize the snowStorm object -->
<script>
snowStorm.snowColor = '#99ccff'; // blue-ish snow!?
snowStorm.flakesMaxActive = 96;  // show more snow on screen at once
snowStorm.useTwinkleEffect = true; // let the snow flicker in and out of view
</script>

See this customized example in action.

Configurable Properties

Snowstorm can be fairly easily customized; some of the major properties are listed below.

snowStorm.animationInterval = 33;
Theoretical “miliseconds per frame” measurement. 20 = fast + smooth, but high CPU use. 50 = more conservative, but slower
snowStorm.flakeBottom = null;
Limits the “floor” (pixels) of the snow. If unspecified, snow will “stick” to the bottom of the browser window and persists through browser resize/scrolling.
snowStorm.flakesMax = 128;
Sets the maximum number of snowflakes that can exist on the screen at any given time.
snowStorm.flakesMaxActive = 64;
Sets the limit of “falling” snowflakes (ie. moving on the screen, thus considered to be active.)
snowStorm.followMouse = true;
Allows snow to move dynamically with the “wind”, relative to the mouse’s X (left/right) coordinates.
snowStorm.freezeOnBlur = true;
Stops the snow effect when the browser window goes out of focus, eg., user is in another tab. Saves CPU, nicer to user.
snowStorm.snowColor = '#fff';
Don’t eat (or use?) yellow snow.
snowStorm.snowCharacter = '•';
&bull; (•) = bullet. &middot; entity (·) is not used as it’s square on some systems etc. Changing this may result in cropping of the character and may require flakeWidth/flakeHeight changes, so be careful.
snowStorm.snowStick = true;
Allows the snow to “stick” to the bottom of the window. When off, snow will never sit at the bottom.
snowStorm.targetElement = null;
Element which snow will be appended to (default: document body) – can be an element ID string eg. ‘myDiv’, or a DOM node reference.
snowStorm.useMeltEffect = true;
When recycling fallen snow (or rarely, when falling), have it “melt” and fade out if browser supports it
snowStorm.useTwinkleEffect = true;
Allow snow to randomly “flicker” in and out of view while falling
snowStorm.usePositionFixed = false;
true = snow not affected by window scroll. may increase CPU load, disabled by default – if enabled, used only where supported.
snowStorm.vMaxX = 8;

snowStorm.vMaxY = 5;

Defines maximum X and Y velocities for the storm; a random value in this range is selected for each snowflake.

Methods

Snowstorm has a few basic methods for controlling the snow effect.

snowStorm.randomizeWind()
Sets the wind speed with a random value relative to vMaxX and vMaxY properties.
snowStorm.freeze()
Stops the snow effect in place.
snowStorm.resume()
Continues snowing from a “frozen” state.
snowStorm.toggleSnow()
Enables or disables the snow effect depending on state, same as calling freeze() or resume().
snowStorm.stop()
Freezes and kills the snowstorm effect, and removes related event handlers. Snowstorm will not work properly if other methods are called after stop().

Example

http://www.schillmania.com/projects/snowstorm/basic-example.html

Leave a comment