canvas制作雪花效果

<!DOCTYPE html>
<html>

<head>
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
    <title>圣诞主题</title>
    <link rel=‘stylesheet‘ href=‘common.css‘ />
    <link rel="stylesheet" type="text/css" href="pageC.css">
</head>

<body>
    <section class="container">
        <!-- 第一幅画面 -->
        <section class="page-a bg-adaptive">
        </section>
        <!-- 第二幅画面 -->
    <section class="page-b bg-adaptive">
        </section>
        <!-- 第三幅画面 -->
        <section class="page-c bg-adaptive">
            <!-- 窗户关闭 -->
            <div class="window wood">
                <div class="window-content" data-attr="red">
                   <div class="window-scene-bg"></div>
                    <div class="window-close-bg"></div>
                    <div class="window-left hover"></div>
                    <div class="window-right hover"></div>
                </div>
            </div>
        </section>
        <!-- 雪花 -->
        <canvas id="snowflake"></canvas>

</section>
    <script type="text/javascript">
    var config = {};
    //rem设置
    (function(doc, win) {
        var docEl = doc.documentElement,
            resizeEvt = ‘orientationchange‘ in window ? ‘orientationchange‘ : ‘resize‘,
           recalc = function() {
                var clientWidth = docEl.clientWidth;
                if (!clientWidth) return;
                docEl.style.fontSize = 20 * (clientWidth / 320) + ‘px‘;
                //宽与高度
                document.body.style.height = clientWidth * (900 / 1440) + "px"
                config.clientWidth = clientWidth;
               config.clientHeight =  clientWidth * (900 / 1440)
            };
        win.addEventListener(resizeEvt, recalc, false);
        doc.addEventListener(‘DOMContentLoaded‘, recalc, false);
    })(document, window);
    </script>
    <script src="http://libs.baidu.com/jquery/1.9.1/jquery.js"></script>
    <script type="text/javascript" src="snowflake.js"></script>
</body>

</html>

/**
 * 雪花
 * canvas版
 */
$(function() {

    /**
     * 雪球
     * @param {[type]} elementName [description]
     */
    function Snowflake(elementName) {

        var snowElement = document.getElementById(elementName)
        var canvasContext = snowElement.getContext("2d");
        var width = config.clientWidth;
        var height = config.clientHeight;

        //canvas尺寸修正
        snowElement.width = width;
        snowElement.height = height;

        //构建雪球的数量
        var snowNumber = 50;

        //构建雪球对象
        var snowArrObjs = initSnow(snowNumber, width, height);
        var snowArrNum = snowArrObjs.length;
        /**
         * 绘制页面
         * @return {[type]} [description]
         */
        var render = function() {
            //清理之前的矩形数据
            canvasContext.clearRect(0, 0, width, height);
            for (var i = 0; i < snowArrNum; ++i) {
                snowArrObjs[i].render(canvasContext);
            }
        }

        /**
         * 更新雪花
         * @return {[type]} [description]
         */
        var update = function() {
            for (var i = 0; i < snowArrNum; ++i) {
                snowArrObjs[i].update();
            }
        }

        /**
         * 绘制与更新
         * @return {[type]} [description]
         */
        var renderAndUpdate = function() {
            render();
            update();
            requestAnimationFrame(renderAndUpdate);
        }

        renderAndUpdate();
    }

    function initSnow(snowNumber, width, height) {
        //雪球参数
        var options = {
            //雪球的半球距离
            minRadius: 3,
            maxRadius: 10,
            // 运动的范围区域
            maxX: width,
            maxY: height,
            //速率
            minSpeedY: 0.05,
            maxSpeedY: 2,
            speedX: 0.05,
            //滤镜
            minAlpha: 0.5,
            maxAlpha: 1.0,
            minMoveX: 4,
            maxMoveX: 18
        }
        var snowArr = [];
        for (var i = 0; i < snowNumber; ++i) {
            snowArr[i] = new Snow(options);
        }
        return snowArr;
    }

    /**
     * 雪球类
     */
    function Snow(snowSettings) {
        this.snowSettings = snowSettings;
        this.radius = randomInRange(snowSettings.minRadius, snowSettings.maxRadius);
        //初始的x位置
        this.initialX = Math.random() * snowSettings.maxX;
        this.y = -(Math.random() * 500);
        //运行的速率
        this.speedY = randomInRange(snowSettings.minSpeedY, snowSettings.maxSpeedY);
        this.speedX = snowSettings.speedX;
        //滤镜
        this.alpha = randomInRange(snowSettings.minAlpha, snowSettings.maxAlpha);
        //角度.默认是360
        this.angle = Math.random(Math.PI * 2);
        //运行的距离
        this.x = this.initialX + Math.sin(this.angle);
        //x移动距离
        this.moveX = randomInRange(snowSettings.minMoveX, snowSettings.maxMoveX);
    }

    /**
     * 绘制雪球
     * @param  {[type]} canvasContext [description]
     * @return {[type]}               [description]
     */
    Snow.prototype.render = function(canvasContext) {
        //清除路径
        //开始一个画布中的一条新路径(或者子路径的一个集合)
        canvasContext.beginPath();
        //用来填充路径的当前的颜色,白色的雪球
        canvasContext.fillStyle = "rgba(255, 255, 255, " + this.alpha + ")";
        //一个中心点和半径,为一个画布的当前子路径添加一条弧线
        //坐标,圆,沿着圆指定弧的开始点和结束点的一个角度
        //弧沿着圆周的逆时针方向(TRUE)还是顺时针方向(FALSE)遍历
        canvasContext.arc(this.x, this.y, this.radius, 0, Math.PI * 2, true);
        //关闭子路径
        canvasContext.closePath();
        //fill() 方法使用 fillStyle 属性所指定的颜色、渐变和模式来填充当前路径
        canvasContext.fill();
    }

    Snow.prototype.update = function() {
        this.y += this.speedY;
        if (this.y > this.snowSettings.maxY) {
            this.y -= this.snowSettings.maxY;
        }
        this.angle += this.speedX;
        if (this.angle > Math.PI * 2) {
            this.angle -= Math.PI * 2;
        }
        //?
    }

    /**
     * 随机处理
     * @param  {[type]} min [description]
     * @param  {[type]} max [description]
     * @return {[type]}     [description]
     */
    function randomInRange(min, max) {
        var random = Math.random() * (max - min) + min;
        return random;
    }

    Snowflake("snowflake")
})

时间: 2024-10-06 11:34:58

canvas制作雪花效果的相关文章

用Canvas制作剪纸效果

在做剪纸效果之前,先介绍剪纸效果运用到的一些知识: 1.阴影: 在Canvas之中进行绘制时,可以通过修改绘图环境中的如下4个属性值来指定阴影效果: shadowColor:CSS格式的颜色字串.默认值为rgba(0,0,0,0),即完全透明的黑色. shadowOffsetX:阴影在X轴方向的偏移量,以像素为单位.默认值为0 shadowOffsetY:阴影在Y轴方向的偏移量,以像素为单位.默认值为0 shadowBlur:表示阴影效果如何延伸的double值.默认值为0.该值用于高斯模糊方程

canvas 制作时钟效果

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABuQAAAM7CAYAAACyYvapAAAgAElEQVR4AezdCXhcV3338b8s2ZIty/IiO3a8xY4dExIHQslKQmIoCZAQSGhfytuylEBbCoUWKCnQt4hSlgClLVASCoSdAkkckhDIQnBC9jgbcRbifbdsy7KtzZYsS+9zZMY+Gt2Ze+fOOf+5c+93niePztw55/8753POyEI

canvas 3D雪花效果

<!DOCTYPE html> <html style="height: 100%;"> <head> <meta charset="utf-8"/> <title></title> </head> <body style="background-color: #f00; height: 100%;"> <script type="te

如何使用 HTML5 Canvas 制作水波纹效果

原文:如何使用 HTML5 Canvas 制作水波纹效果 今天,我们继续分享 JavaScript 实现的效果例子,这篇文章会介绍使用 JavaScript 实现水波纹效果.水波效果以图片为背景,点击图片任意位置都会触发.有时候,我们使用普通的 Javascript 就可以创建一个很有趣的解决功能. 在线演示      源码下载 Step 1. HTML 和以前一样,首先是 HTML 代码: <!DOCTYPE html> <html> <head> <meta

酷!使用 jQuery &amp; Canvas 制作相机快门效果

在今天的教程中,我们将使用 HTML5 的 Canvas 元素来创建一个简单的摄影作品集,它显示了一组精选照片与相机快门的效果.此功能会以一个简单的 jQuery 插件形式使用,你可以很容易地整合到任何网站. 效果演示     插件下载 您可能感兴趣的相关文章 Web 开发中很实用的10个效果[源码下载] 精心挑选的优秀jQuery Ajax分页插件和教程 12个让人惊叹的的创意的 404 错误页面设计 让网站动起来!12款优秀的 jQuery 动画插件 十分惊艳的8个 HTML5 & Java

用Canvas制作可以根据手势摆动的树

用Canvas制作可以根据手势摆动的树 根据工作的需要,制作一个摆动的树做为页面的背景.为了增加页面的交互性,我又为背景中的树增加了鼠标(触控)事件,使他能够根据鼠标(触控)做出相应的动作,当手指做上下或者左右滑动的时候树会跟着摆动.先看看最终效果. Step1.完成HTML页面,新建一个Tree类 完成HTML页面后新建一个Tree类用来记录树的各个属性.其中x,y为树根部的坐标值,branchLen,branchWidth分别是树枝的长度与宽度,depth为树枝的层数,canvas用来接页面

用Canvas制作简单的画图工具

今天用Canvas制作了一个画图工具,非常简单,功能也不是很多,主要有背景网格,画线,画圆,画矩形和画圆角矩形,也用到了canvas的一些基本知识,在这里一一列举. 1.线段的绘制: 如何绘制真正的1像素的线段? 如果在像素边界处绘制一条1像素宽的垂直线段,那么canvas的绘图环境对象会试着将半个像素画在边界中线的右边,将另外半个像素画在边界中线的左边.然而,在一个整像素的范围内绘制半个像素宽的线段是不可能的,,所以左右两个方向上的半像素都被扩展为1像素.如图所示 本来我们想要将线段绘制在深灰

Vue+WebSocket+ES6+Canvas 制作「你画我猜」小游戏

Vue+WebSocket+ES6+Canvas 制作「你画我猜」小游戏 转载 来源:jrainlau 链接:https://segmentfault.com/a/1190000005804860 项目地址:https://github.com/jrainlau/draw-something 下载 & 运行 git clone [email protected]:jrainlau/draw-something.git cd draw-something && npm install

canvas制作简单钟表

之前用html+css+JavaScript实现了一个简单钟表,但还是有一些问题,主要是一些css属性不同浏览器支持效果不一样,所以尝试用 canvas实现了一个简单的钟表,效果在下方,当然了,采用canvas同样会有一些浏览器不支持... 这里只讨论canvas的实现方式.^_^ html部分 html部分很简单,写入canvas标签,其id设置为“canvas”,用css设置成居中显示,代码如下: 1 <!doctype html> 2 <html> 3 <head>