jquery/zepto 圣诞节雪花飞扬

下载地址:

http://www.html5tricks.com/jquery-html5-christ-snow.html

演示地址:

http://www.html5tricks.com/jquery-html5-christ-snow.html

个人的demo:

新建并且引用以下js文件:

(function($){
    $.snowfall = function(element, options){
        var    defaults = {
                flakeCount : 35,
                flakeColor : ‘#ffffff‘,
                flakeIndex: 999999,
                minSize : 1,
                maxSize : 2,
                minSpeed : 1,
                maxSpeed : 5,
                round : false,
                shadow : false,
                collection : false,
                collectionHeight : 40,
                deviceorientation : false
            },
            options = $.extend(defaults, options),
            random = function random(min, max){
                return Math.round(min + Math.random()*(max-min));
            };

            $(element).data("snowfall", this);            

            // Snow flake object
            function Flake(_x, _y, _size, _speed, _id)
            {
                // Flake properties
                this.id = _id;
                this.x  = _x;
                this.y  = _y;
                this.size = _size;
                this.speed = _speed;
                this.step = 0;
                this.stepSize = random(1,10) / 100;

                if(options.collection){
                    this.target = canvasCollection[random(0,canvasCollection.length-1)];
                }

                var flakeMarkup = $(document.createElement("div")).attr({‘class‘: ‘snowfall-flakes‘, ‘id‘ : ‘flake-‘ + this.id}).css({‘width‘ : this.size, ‘height‘ : this.size, ‘background‘ : options.flakeColor, ‘position‘ : ‘absolute‘, ‘top‘ : this.y, ‘left‘ : this.x, ‘fontSize‘ : 0, ‘zIndex‘ : options.flakeIndex});

                if($(element).get(0).tagName === $(document).get(0).tagName){
                    $(‘body‘).append(flakeMarkup);
                    element = $(‘body‘);
                }else{
                    $(element).append(flakeMarkup);
                }

                this.element = document.getElementById(‘flake-‘ + this.id);

                // Update function, used to update the snow flakes, and checks current snowflake against bounds
                this.update = function(){
                    this.y += this.speed;

                    if(this.y > (elHeight) - (this.size  + 6)){
                        this.reset();
                    }

                    this.element.style.top = this.y + ‘px‘;
                    this.element.style.left = this.x + ‘px‘;

                    this.step += this.stepSize;

                    if (doRatio === false) {
                        this.x += Math.cos(this.step);
                    } else {
                        this.x += (doRatio + Math.cos(this.step));
                    }

                    // Pileup check
                    if(options.collection){
                        if(this.x > this.target.x && this.x < this.target.width + this.target.x && this.y > this.target.y && this.y < this.target.height + this.target.y){
                            var ctx = this.target.element.getContext("2d"),
                                curX = this.x - this.target.x,
                                curY = this.y - this.target.y,
                                colData = this.target.colData;

                                if(colData[parseInt(curX)][parseInt(curY+this.speed+this.size)] !== undefined || curY+this.speed+this.size > this.target.height){
                                    if(curY+this.speed+this.size > this.target.height){
                                        while(curY+this.speed+this.size > this.target.height && this.speed > 0){
                                            this.speed *= .5;
                                        }

                                        ctx.fillStyle = "#fff";

                                        if(colData[parseInt(curX)][parseInt(curY+this.speed+this.size)] == undefined){
                                            colData[parseInt(curX)][parseInt(curY+this.speed+this.size)] = 1;
                                            ctx.fillRect(curX, (curY)+this.speed+this.size, this.size, this.size);
                                        }else{
                                            colData[parseInt(curX)][parseInt(curY+this.speed)] = 1;
                                            ctx.fillRect(curX, curY+this.speed, this.size, this.size);
                                        }
                                        this.reset();
                                    }else{
                                        // flow to the sides
                                        this.speed = 1;
                                        this.stepSize = 0;

                                        if(parseInt(curX)+1 < this.target.width && colData[parseInt(curX)+1][parseInt(curY)+1] == undefined ){
                                            // go left
                                            this.x++;
                                        }else if(parseInt(curX)-1 > 0 && colData[parseInt(curX)-1][parseInt(curY)+1] == undefined ){
                                            // go right
                                            this.x--;
                                        }else{
                                            //stop
                                            ctx.fillStyle = "#fff";
                                            ctx.fillRect(curX, curY, this.size, this.size);
                                            colData[parseInt(curX)][parseInt(curY)] = 1;
                                            this.reset();
                                        }
                                    }
                                }
                        }
                    }

                    if(this.x > (elWidth) - widthOffset || this.x < widthOffset){
                        this.reset();
                    }
                }

                // Resets the snowflake once it reaches one of the bounds set
                this.reset = function(){
                    this.y = 0;
                    this.x = random(widthOffset, elWidth - widthOffset);
                    this.stepSize = random(1,10) / 100;
                    this.size = random((options.minSize * 100), (options.maxSize * 100)) / 100;
                    this.speed = random(options.minSpeed, options.maxSpeed);
                }
            }

            // Private vars
            var flakes = [],
                flakeId = 0,
                i = 0,
                elHeight = $(element).height(),
                elWidth = $(element).width(),
                widthOffset = 0,
                snowTimeout = 0;

            // Collection Piece ******************************
            if(options.collection !== false){
                var testElem = document.createElement(‘canvas‘);
                if(!!(testElem.getContext && testElem.getContext(‘2d‘))){
                    var canvasCollection = [],
                        elements = $(options.collection),
                        collectionHeight = options.collectionHeight;

                    for(var i =0; i < elements.length; i++){
                            var bounds = elements[i].getBoundingClientRect(),
                                canvas = document.createElement(‘canvas‘),
                                collisionData = [];

                            if(bounds.top-collectionHeight > 0){
                                document.body.appendChild(canvas);
                                canvas.style.position = ‘absolute‘;
                                canvas.height = collectionHeight;
                                canvas.width = bounds.width;
                                canvas.style.left = bounds.left + ‘px‘;
                                canvas.style.top = bounds.top-collectionHeight + ‘px‘;

                                for(var w = 0; w < bounds.width; w++){
                                    collisionData[w] = [];
                                }

                                canvasCollection.push({element :canvas, x : bounds.left, y : bounds.top-collectionHeight, width : bounds.width, height: collectionHeight, colData : collisionData});
                            }
                    }
                }else{
                    // Canvas element isnt supported
                    options.collection = false;
                }
            }
            // ************************************************

            // This will reduce the horizontal scroll bar from displaying, when the effect is applied to the whole page
            if($(element).get(0).tagName === $(document).get(0).tagName){
                widthOffset = 25;
            }

            // Bind the window resize event so we can get the innerHeight again
            $(window).bind("resize", function(){
                elHeight = $(element).height();
                elWidth = $(element).width();
            }); 

            // initialize the flakes
            for(i = 0; i < options.flakeCount; i+=1){
                flakeId = flakes.length;
                flakes.push(new Flake(random(widthOffset,elWidth - widthOffset), random(0, elHeight), random((options.minSize * 100), (options.maxSize * 100)) / 100, random(options.minSpeed, options.maxSpeed), flakeId));
            }

            // This adds the style to make the snowflakes round via border radius property
            if(options.round){
                $(‘.snowfall-flakes‘).css({‘-moz-border-radius‘ : options.maxSize, ‘-webkit-border-radius‘ : options.maxSize, ‘border-radius‘ : options.maxSize});
            }

            // This adds shadows just below the snowflake so they pop a bit on lighter colored web pages
            if(options.shadow){
                $(‘.snowfall-flakes‘).css({‘-moz-box-shadow‘ : ‘1px 1px 1px #555‘, ‘-webkit-box-shadow‘ : ‘1px 1px 1px #555‘, ‘box-shadow‘ : ‘1px 1px 1px #555‘});
            }

            // On newer Macbooks Snowflakes will fall based on deviceorientation
            var doRatio = false;
            if (options.deviceorientation) {
                $(window).bind(‘deviceorientation‘, function(event) {
                    doRatio = event.originalEvent.gamma * 0.1;
                });
            }

            // this controls flow of the updating snow
            function snow(){
                for( i = 0; i < flakes.length; i += 1){
                    flakes[i].update();
                }

                snowTimeout = setTimeout(function(){snow()}, 30);
            }

            snow();

        // Public Methods

        // clears the snowflakes
        this.clear = function(){
                        $(element).children(‘.snowfall-flakes‘).remove();
                        flakes = [];
                        clearTimeout(snowTimeout);
                    };
    };

    // Initialize the options and the plugin
    $.fn.snowfall = function(options){
        if(typeof(options) == "object" || options == undefined){
                 return this.each(function(i){
                    (new $.snowfall(this, options));
                });
        }else if (typeof(options) == "string") {
            return this.each(function(i){
                var snow = $(this).data(‘snowfall‘);
                if(snow){
                    snow.clear();
                }
            });
        }
    };
})(zepto);

使用方式,请务必在页面完全加载之后使用以下代码,其他具体参数请查看演示地址的源码

$(document).snowfall({round : true, minSize: 2, maxSize:4}); // add rounded
时间: 2024-10-12 21:47:48

jquery/zepto 圣诞节雪花飞扬的相关文章

jQuery动画-圣诞节礼物

▓▓▓▓▓▓ 大致介绍 下午看到了一个送圣诞礼物的小动画,正好要快到圣诞节了,就动手模仿并改进了一些小问题 原地址:花式轮播----圣诞礼物传送 思路:动画中一共有五个礼物,他们平均分布在屏幕中,设置最外边的两个礼物旋转一定的角度并隐藏,动画开始,每个礼物向右移动一定的位置,然后再把第五个礼物添加到第一个礼物之前,这样这五个礼物就重新排列了,在写jQ时只管礼物位置的变化就行了,因为礼物的旋转和隐藏在样式中都已经设置好了,某个礼物如果成为第一个礼物就会自动隐藏旋转 如果对其中的方法不熟悉的可以参考

迷你版jQuery——zepto核心源码分析

前言 zepto号称迷你版jQuery,并且成为移动端dom操作库的首选 事实上zepto很多时候只是借用了jQuery的名气,保持了与其基本一致的API,其内部实现早已面目全非! 艾伦分析了jQuery,小钗暂时没有那个本事分析jQuery,这里就恬不知耻说说自己对zepto的源码理解,希望对各位有用 首先zepto的出现其实还是很讨巧的,他看见了巨人jQuery在移动浪潮来临时的转身慢.牵挂多的问题 马上搞出了一套轻量级类jQuery框架代码,核心代码1000行不到,快速占领了移动端的市场,

更换 jQuery -&gt; Zepto / 优化换页效果

Zepto.js 手机版的 jQuery 手机版的网站使用 jQuery 未免太浪费手机的宝贵的流量了吧!那么你应该要试试 Zepto.js 了,单靠它的 8.4k(gzipped)size 完全可以代替掉 jQuery 这只庞大的怪物. jQuery 的 ajax,addClass,find,next,toggle,wrap.主流的 jQuery API 都有了,并且添加了 touch events.可以长按,滑动,就如使用 iOS 或者 Android 一样. 且添加了 touch even

(jQuery||Zepto).extend 的一个小问题

最近一直在搞移动端,也由于自己对jQuery比较熟悉,再加上Zepto提供了跟jQuery一样的API,所以就选择了Zepto作为开发框架. 由于是移动端开发,所以也应用了一些ES5新增的API,比如forEach,下面就是我写的代码的一些示例: list.forEach(function(v) { return !!v; }) 我天真的以为forEach就跟jQuery的each一样,只要我的返回值为false,它就会中断循环,于是,类似这样的遍历代码写了不少(真的是懒得为每个遍历去声明变量啊

jquery和zepto的区别

1.zepto对象不能自定义事件 例如执行: $({}).bind('cust', function(){});     结果:  TypeError: Object has no method 'addEventListener'解决办法是创建一个脱离文档流的节点作为事件对象: 例如: $('').bind('cust', function(){}); 2.Zepto 的选择器表达式: [name=value]  中value 必须用 双引号 "  or 单引号 ' 括起来 例如执行:$('[

web app中常用插件(zepto--用法类似于jquery、利用nodejs定制zepto)

1.移动端开发不用jquery的原因 jquery使用的优点中很大一个原因是解决了js的兼容性,但是在移动端开发中移动端的浏览器都很新进的浏览器,他的兼容性问题不需要jquery,所以不用考虑兼容性, 移动端的动画时支持css3的,所以直接使用css3来实现动画可以减少我们对jquery中动画函数的依赖 在移动端jquery对我们而言算是体积大,同时效率也不高 2.在移动端使用的插件---很多api都类似于jquery zepto是一个分模块的js库,他把不同的功能封装在不同模块(默认下载的ze

华丽的HTML5/jQuery动画和应用 前端必备

在网页应用中,我们经常会使用jQuery来实现一些简单的动画效果,比如菜单下拉时的渐变特效,图片滑动时的淡入淡出效果等.现在我们将jQuery和HTML5互相结合,让HTML5/CSS3强大的页面渲染引擎和jQuery简单易用的框架融合在一起,发挥前端迷人的效果. 1.jQuery 360度图片旋转插件DopelessRotate DopelessRotate是一款基于jQuery的图片旋转插件,这款图片旋转插件功能非常强大,它不仅可以在加载的时候显示进度条,而且点击右侧的放大镜按钮可以查看原始

运用HTML5+CSS3+Zepto构建移动web网站!

手机微站.HTML5+CSS3(rem)+jQuery+Zepto+iScroll+Swipe综合开发手机网站. 移动端web网站(手机网站).mobile网站模版.HTML5网站 面向手机端的html5开发框架有很多,如何找到适合自己的一个呢? 1.jQuery Mobile jQuery Mobile 是 jQuery 在手机上和平板设备上的版本.jQuery Mobile 不仅会给主流移动平台带来jQuery核心库,而且会发布一个完整统一的jQuery移动UI框架.支持全球主流的移动平台.

juqery.fn.extend和jquery.extend

jquery.fn == jquery.prototype //true jquery.extend( obj1,obj2 ) 用一个或多个对象来拓展一个对象,返回拓展之后的对象 var aaa = { a:1, b:2 } var bbb = { a:3, b:4, c:5 } $.extend(aaa,bbb); //aaa=bbb={ a:3, b:4, c:5 } 对jquery.fn进行拓展,就是为jquery类添加"成员函数":jquery的实例可以使用这个函数.像$('d