(过年)烟花html,可保存本地运行

<!DOCTYPE html>
<html lang="cn">


<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>新年快乐</title>
    <style>
        body {
            margin: 0;
            padding: 0;
            overflow: hidden;
        }


        .city {
            width: 100%;
            position: fixed;
            bottom: 0px;
            z-index: 100;
        }


        .city img {
            width: 100%;
        }
    </style>
</head>


<body>


    <canvas id="cas" style="background-color:rgba(0,5,24,1)" width="1235" height="680">浏览器不支持canvas</canvas>
    <div class="city">
        <img src="http://ox2ualtw3.bkt.clouddn.com/canvas-firework-city.png" alt="">
    </div>
    <img src="http://ox2ualtw3.bkt.clouddn.com/canvas-firework-moon.png" alt="" id="moon" style="visibility: hidden;">
   
    <div style="display:none">
        <div class="shape">新年快乐</div>
        <div class="shape">阖家欢乐</div>
        <div class="shape">万事如意</div>
        <div class="shape">心想事成</div>
    </div>


       <script>
        var canvas = document.getElementById("cas");
        var ocas = document.createElement("canvas");
        var octx = ocas.getContext("2d");
        var ctx = canvas.getContext("2d");
        ocas.width = canvas.width = window.innerWidth;
        ocas.height = canvas.height = window.innerHeight;
        var bigbooms = [];


        window.onload = function () {
            initAnimate()
        }


        function initAnimate() {
            drawBg();


            lastTime = new Date();
            animate();
        }


        var lastTime;


        function animate() {
            ctx.save();
            ctx.fillStyle = "rgba(0,5,24,0.1)";
            ctx.fillRect(0, 0, canvas.width, canvas.height);
            ctx.restore();


            var newTime = new Date();
            if (newTime - lastTime > 500 + (window.innerHeight - 767) / 2) {
                var random = Math.random() * 100 > 2 ? true : false;
                var x = getRandom(canvas.width / 5, canvas.width * 4 / 5);
                var y = getRandom(50, 200);
                if (random) {
                    var bigboom = new Boom(getRandom(canvas.width / 3, canvas.width * 2 / 3), 2, "#FFF", {
                        x: x,
                        y: y
                    });
                    bigbooms.push(bigboom)
                } else {
                    var bigboom = new Boom(getRandom(canvas.width / 3, canvas.width * 2 / 3), 2, "#FFF", {
                        x: canvas.width / 2,
                        y: 200
                    }, document.querySelectorAll(".shape")[parseInt(getRandom(0, document.querySelectorAll(
                        ".shape").length))]);
                    bigbooms.push(bigboom)
                }
                lastTime = newTime;
            }


            stars.foreach(function () {
                this.paint();
            })


            drawMoon();


            bigbooms.foreach(function (index) {
                var that = this;
                if (!this.dead) {
                    this._move();
                    this._drawLight();
                } else {
                    this.booms.foreach(function (index) {
                        if (!this.dead) {
                            this.moveTo(index);
                        } else if (index === that.booms.length - 1) {
                            bigbooms[bigbooms.indexOf(that)] = null;
                        }
                    })
                }
            });


            raf(animate);
        }


        function drawMoon() {
            var moon = document.getElementById("moon");
            var centerX = canvas.width - 200,
                centerY = 100,
                width = 80;
            if (moon.complete) {
                ctx.drawImage(moon, centerX, centerY, width, width)
            } else {
                moon.onload = function () {
                    ctx.drawImage(moon, centerX, centerY, width, width)
                }
            }
            var index = 0;
            for (var i = 0; i < 10; i++) {
                ctx.save();
                ctx.beginPath();
                ctx.arc(centerX + width / 2, centerY + width / 2, width / 2 + index, 0, 2 * Math.PI);
                ctx.fillStyle = "rgba(240,219,120,0.005)";
                index += 2;
                ctx.fill();
                ctx.restore();
            }


        }


        Array.prototype.foreach = function (callback) {
            for (var i = 0; i < this.length; i++) {
                if (this[i] !== null) callback.apply(this[i], [i])
            }
        }


        var raf = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame ||
            window.oRequestAnimationFrame || window.msRequestAnimationFrame || function (callback) {
                window.setTimeout(callback, 1000 / 60);
            };


        canvas.onclick = function () {
            var x = event.clientX;
            var y = event.clientY;
            var bigboom = new Boom(getRandom(canvas.width / 3, canvas.width * 2 / 3), 2, "#FFF", {
                x: x,
                y: y
            });
            bigbooms.push(bigboom)
        }


        var Boom = function (x, r, c, boomArea, shape) {
            this.booms = [];
            this.x = x;
            this.y = (canvas.height + r);
            this.r = r;
            this.c = c;
            this.shape = shape || false;
            this.boomArea = boomArea;
            this.theta = 0;
            this.dead = false;
            this.dx = this.boomArea.x - this.x;
            this.dy = this.boomArea.y - this.y;
            this.d = 10;
        }
        Boom.prototype = {
            _paint: function () {
                ctx.save();
                ctx.beginPath();
                ctx.arc(this.x, this.y, this.r, 0, 2 * Math.PI);
                ctx.fillStyle = this.c;
                ctx.fill();
                ctx.restore();
            },
            _move: function () {
                var g = Math.max(Math.log10((1 + (1 / this.d))).toFixed(3), 0.01);
                this.x += this.dx * g;
                this.y += this.dy * g;
                this.d += 1;


                if (this.y < this.boomArea.y) {
                    if (this.shape) {
                        this._shapBoom();
                    } else this._boom();
                    this.dead = true;
                } else {
                    this._paint();
                }
            },
            _drawLight: function () {
                ctx.save();
                ctx.fillStyle = "rgba(255,228,150,0.3)";
                ctx.beginPath();
                ctx.arc(this.x, this.y, this.r + 3 * Math.random() + 1, 0, 2 * Math.PI);
                ctx.fill();
                ctx.restore();
            },
            _boom: function () {
                var fragNum = getRandom(30, 200);
                var style = getRandom(0, 10) >= 5 ? 1 : 2;
                var color;
                if (style === 1) {
                    color = {
                        a: parseInt(getRandom(128, 255)),
                        b: parseInt(getRandom(128, 255)),
                        c: parseInt(getRandom(128, 255))
                    }
                }


                var fanwei = parseInt(getRandom(300, 400));
                for (var i = 0; i < fragNum; i++) {
                    if (style === 2) {
                        color = {
                            a: parseInt(getRandom(128, 255)),
                            b: parseInt(getRandom(128, 255)),
                            c: parseInt(getRandom(128, 255))
                        }
                    }
                    var a = getRandom(-Math.PI, Math.PI);
                    var x = getRandom(0, fanwei) * Math.cos(a) + this.x;
                    var y = getRandom(0, fanwei) * Math.sin(a) + this.y;
                    var radius = getRandom(0, 2)
                    var frag = new Frag(this.x, this.y, radius, color, x, y);
                    this.booms.push(frag);
                }
            },
            _shapBoom: function () {
                var that = this;
                putValue(ocas, octx, this.shape, 5, function (dots) {
                    var dx = canvas.width / 2 - that.x;
                    var dy = canvas.height / 2 - that.y;
                    for (var i = 0; i < dots.length; i++) {
                        color = {
                            a: dots[i].a,
                            b: dots[i].b,
                            c: dots[i].c
                        }
                        var x = dots[i].x;
                        var y = dots[i].y;
                        var radius = 1;
                        var frag = new Frag(that.x, that.y, radius, color, x - dx, y - dy);
                        that.booms.push(frag);
                    }
                })
            }
        }


        function putValue(canvas, context, ele, dr, callback) {
            context.clearRect(0, 0, canvas.width, canvas.height);
            var img = new Image();
            if (ele.innerHTML.indexOf("img") >= 0) {
                img.src = ele.getElementsByTagName("img")[0].src;
                imgload(img, function () {
                    context.drawImage(img, canvas.width / 2 - img.width / 2, canvas.height / 2 - img.width / 2);
                    dots = getimgData(canvas, context, dr);
                    callback(dots);
                })
            } else {
                var text = ele.innerHTML;
                context.save();
                var fontSize = 200;
                context.font = fontSize + "px ̎ͥ bold";
                context.textAlign = "center";
                context.textBaseline = "middle";
                context.fillStyle = "rgba(" + parseInt(getRandom(128, 255)) + "," + parseInt(getRandom(128, 255)) + "," +
                    parseInt(getRandom(128, 255)) + " , 1)";
                context.fillText(text, canvas.width / 2, canvas.height / 2);
                context.restore();
                dots = getimgData(canvas, context, dr);
                callback(dots);
            }
        }


        function imgload(img, callback) {
            if (img.complete) {
                callback.call(img);
            } else {
                img.onload = function () {
                    callback.call(this);
                }
            }
        }


        function getimgData(canvas, context, dr) {
            var imgData = context.getImageData(0, 0, canvas.width, canvas.height);
            context.clearRect(0, 0, canvas.width, canvas.height);
            var dots = [];
            for (var x = 0; x < imgData.width; x += dr) {
                for (var y = 0; y < imgData.height; y += dr) {
                    var i = (y * imgData.width + x) * 4;
                    if (imgData.data[i + 3] > 128) {
                        var dot = {
                            x: x,
                            y: y,
                            a: imgData.data[i],
                            b: imgData.data[i + 1],
                            c: imgData.data[i + 2]
                        };
                        dots.push(dot);
                    }
                }
            }
            return dots;
        }


        function getRandom(a, b) {
            return Math.random() * (b - a) + a;
        }




        var maxRadius = 1,
            stars = [];


        function drawBg() {
            for (var i = 0; i < 100; i++) {
                var r = Math.random() * maxRadius;
                var x = Math.random() * canvas.width;
                var y = Math.random() * 2 * canvas.height - canvas.height;
                var star = new Star(x, y, r);
                stars.push(star);
                star.paint()
            }


        }


        var Star = function (x, y, r) {
            this.x = x;
            this.y = y;
            this.r = r;
        }
        Star.prototype = {
            paint: function () {
                ctx.save();
                ctx.beginPath();
                ctx.arc(this.x, this.y, this.r, 0, 2 * Math.PI);
                ctx.fillStyle = "rgba(255,255,255," + this.r + ")";
                ctx.fill();
                ctx.restore();
            }
        }


        var focallength = 250;
        var Frag = function (centerX, centerY, radius, color, tx, ty) {
            this.tx = tx;
            this.ty = ty;
            this.x = centerX;
            this.y = centerY;
            this.dead = false;
            this.centerX = centerX;
            this.centerY = centerY;
            this.radius = radius;
            this.color = color;
        }


        Frag.prototype = {
            paint: function () {
                ctx.save();
                ctx.beginPath();
                ctx.arc(this.x, this.y, this.radius, 0, 2 * Math.PI);
                ctx.fillStyle = "rgba(" + this.color.a + "," + this.color.b + "," + this.color.c + ",1)";
                ctx.fill()
                ctx.restore();
            },
            moveTo: function (index) {
                this.ty = this.ty + 0.3;
                var dx = this.tx - this.x,
                    dy = this.ty - this.y;
                this.x = Math.abs(dx) < 0.1 ? this.tx : (this.x + dx * 0.1);
                this.y = Math.abs(dy) < 0.1 ? this.ty : (this.y + dy * 0.1);
                if (dx === 0 && Math.abs(dy) <= 80) {
                    this.dead = true;
                }
                this.paint();
            }
        }
    </script>


</body>


</html>

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

专家-郭老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值