本文实例为大家分享了JavaScript实现带粒子效果进度条的具体代码,供大家参考,具体内容如下

<html>
    <head>
        <meta charset="utf8"/>
        <!--
        <meta name="viewport" content="width=device-width,user-scalable=no, initial-scale=1, maximum-scale=1" />
        -->
        <title>粒子效果实战</title>
        <style type="text/css">
            body {
                background:#111;
            }
            #canvas {
                background:transparent;
                border:1px dashed #171717;
                margin:-151px 0 0 -401px;
                position:absolute;
                left:50%;
                top:50%;
            }
        </style>
    </head>
    <body onload="init()">
        <canvas id="canvas" width="800px" height="300px">浏览器不支持canvas</canvas>
        <script type="text/javascript">

            //判断是否支持canvaas
            function isSupportCanvas(canvas) {
                return !!(canvas.getContext && canvas.getContext("2d"));
            }

            //requestAnimationFrame会自动使用最优的帧率进行渲染
            function setupRAF() {
                window.lastTime = 0;

                //兼容各个浏览器,Internet Explorer11、Google Chrome(Microsoft Edge)、Mozilla Firefox、Opera
                var vendors = ["ms", "moz", "webkit", "o"];
                for(var i=0; i<vendors.length; i  ) {
                    window.requestAnimationFrame = window[vendors[i]   "RequestAnimationFrame"];
                    window.cancelAnimationFrame = window[vendors[i]   "CancelAnimationFrame"] || window[vendors[i]   "CancelRequestAnimationFrame"];

                    //测试浏览器支持哪一张
                    if(window.requestAnimationFrame) {
                        console.log(vendors[i]   "requestAnimationFrame");
                    }
                    if(window[vendors[i]   "CancelAnimationFrame"]) {
                        console.log(vendors[i]   "CancelAnimationFrame");
                    }
                    if(window[vendors[i]   "CancelRequestAnimationFrame"]) {
                        console.log(vendors[i]   "CancelRequestAnimationFrame");
                    }
                }

                //回退机制
                if(!window.requestAnimationFrame) {
                    window.requestAnimationFrame = function(callback, element) {
                        var currentTime = new Date().getTime();
                        var timeToCall = Math.max(0, 16-(currentTime-window.lastTime));
                        var callTime = currentTime   timeToCall;
                        var id = window.setTimeout(function() {
                            callback(callTime);
                        }, timeToCall);
                        window.lastTime = callTime;
                        return id;
                    };
                }

                //回退机制
                if(!window.cancelAnimationFrame) {
                    window.cancelAnimationFrame = function(id) {
                        clearTimeout(id);
                    }
                }
            }

            //在[min, max]中随机取一个数
            function rand(min, max) {
                return Math.random() * (max - min   1)   min;
            }

            //判断两碰撞盒是否相交
            function isHit(x1, y1, w1, h1, x2, y2, w2, h2) {
                return !( x1   w1 < x2 || x2   w2 < x1 || y1   h1 < h2 || y2   h2 < h1);
            }

            //判断点是否在指定区域内
            function isInRect(x, y, rx, ry, rw, rh) {
                return !(x < rx || x > rx   rw || y < ry || y > ry   rh);
            }

            //将数限制在某个范围之内
            function limit(value, min, max) {
                if(value < min) {
                    return min;
                } else if(value > max) {
                    return max;
                }
                return value;
            }

            var CanvasController = function(canvas) {
                var ctx = canvas.getContext("2d");

                //进度条对象
                var Loader = function() {
                    //进度条宽度
                    this.width = canvas.width - 80;
                    //进度条高度
                    this.height = 20;
                    //进度条X坐标
                    this.x = (canvas.width - this.width) / 2;
                    //进度条Y坐标
                    this.y = (canvas.height - this.height) / 2;
                    //进度条当前值
                    this.value = 0;
                    //进度条最大值
                    this.maxValue = 100;
                    //进度条更新速度
                    this.speed = .5;
                    //加深的颜色
                    this.lighterColor = "#222";

                    //HSL(Hue:色相,Saturation:饱和度,Lightness:饱和度)
                    this.hue = 0;
                    this.hueStart = 0;
                    this.hueEnd = 360;

                    //获取当前值对应的X坐标
                    this.currentPosX = function() {
                        return this.x   this.width * this.value / 100; 
                    }

                    //更新进度条
                    this.update = function() {
                        this.value  = this.speed;
                        if(this.value > this.maxValue) {
                            this.value = 0;
                        }
                    }

                    //渲染进度条
                    this.render = function() {
                        ctx.globalCompositeOperation = "source-over";
                        var currentWidth = this.width * this.value / 100;
                        this.hue = this.hueStart   (this.hueEnd - this.hueStart) * this.value / 100;
                        //ctx.fillStyle = "hsl("   this.hue   ", 100%, 40%)";
                        var linearGradient = ctx.createLinearGradient(this.x, this.y, this.x   currentWidth, this.y);
                        linearGradient.addColorStop(0, "hsl("   this.hueStart   ", 100%, 40%)");
                        linearGradient.addColorStop(1, "hsl("   this.hue   ", 100%, 40%)");
                        ctx.fillStyle = linearGradient;
                        ctx.fillRect(this.x, this.y, currentWidth, this.height);
                        ctx.fillStyle = this.lighterColor;
                        ctx.globalCompositeOperation = "lighter";                   
                        ctx.fillRect(this.x, this.y, currentWidth, this.height/2);
                    }
                }

                //单个粒子对象
                var Particle = function(x, y, hue, minX, maxX) {
                    //粒子的X坐标
                    this.x = x;
                    //粒子的Y坐标
                    this.y = y;
                    //粒子的宽度
                    this.width = rand(1,3);
                    //粒子的高度
                    this.height = rand(1,2);
                    //粒子的HSL颜色的hue分量
                    this.hue = limit(hue   rand(-15,15), 0, 360);
                    //粒子在X方向上的速度
                    this.velocityX = rand(-1,1);
                    //粒子在Y方向上的速度
                    this.velocityY = rand(-30,-20);
                    //粒子在X方向上的加速度
                    this.accelerationX = -.5;
                    //粒子在Y方向上的加速度
                    this.accelerationY = 4;
                    //单位时间
                    this.unitTime = .2;

                    //更新粒子位置
                    this.update = function() {
                        this.x  = (this.velocityX * this.unitTime);
                        this.y  = (this.velocityY * this.unitTime);
                        this.velocityX  = (this.accelerationX * this.unitTime * rand(-1,1));
                        this.velocityY  = (this.accelerationY * this.unitTime);
                    }

                    //渲染粒子
                    this.render = function() {
                        ctx.fillStyle = "hsl("   this.hue   ", 100%, 40%)"
                        ctx.globalCompositeOperation = "source-over";
                        ctx.fillRect(this.x, this.y, this.width, this.height);
                    }
                }

                //所有粒子效果的对象
                var Particles = function(minX, maxX) {
                    //存放生成的所有粒子对象
                    this.values = [];
                    //粒子生成速率
                    this.rate = 3;

                    //生成粒子
                    this.generate = function(x, y, hue) {
                        for(var i=0; i<this.rate; i  ) {
                            this.values.push(new Particle(x, y, hue, minX, maxX));
                        }
                    }

                    //更新进度值
                    this.update = function() {
                        for(var i = this.values.length-1; i >= 0; i--) {
                            this.values[i].update();
                            if(!isInRect(this.values[i].x, this.values[i].y, 0, 0, canvas.width, canvas.height)) {
                                this.values.splice(i, 1);
                            }
                        }
                    }

                    //渲染进度条
                    this.render = function() {
                        for(var i =0; i<this.values.length; i  ) {
                            this.values[i].render();
                        }
                    }
                }

                //清空画布
                function clearCanvas() {
                    //默认值,表示图形将绘制在现有画布之上
                    ctx.globalCompositeOperation = "source-over";
                    ctx.clearRect(0, 0, canvas.width, canvas.height);
                }

                //初始化函数
                this.init = function() {
                    var loader = new Loader();
                    var particles = new Particles(loader.x, loader.x   loader.width);
                    var loop = function() {
                        requestAnimationFrame(loop, canvas);

                        clearCanvas();

                        loader.update();
                        loader.render();

                        particles.generate(loader.currentPosX()-3, loader.y   loader.height/2, loader.hue);
                        particles.update();
                        particles.render();
                    }
                    loop();
                }
            }

            function init() {
                var canvas = document.getElementById("canvas");
                if(!isSupportCanvas(canvas)) {
                    return;
                }
                setupRAF();
                var canvasController = new CanvasController(canvas);
                canvasController.init();
            }
        </script>
    </body>
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持Devmax。

JavaScript实现带粒子效果的进度条的更多相关文章

  1. html5 拖拽及用 js 实现拖拽功能的示例代码

    这篇文章主要介绍了html5 拖拽及用 js 实现拖拽,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  2. amaze ui 的使用详细教程

    这篇文章主要介绍了amaze ui 的使用详细教程,本文通过多种方法给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  3. swift皮筋弹动发射飞机ios源码

    这是一个款采用swift实现的皮筋弹动发射飞机游戏源码,游戏源码比较详细,大家可以研究学习一下吧。

  4. Swift与Js通过WebView交互

    开发环境:Swfit2.3XCode8.2基础概念jscontext,jscontext是代表JS的执行环境,通过-evaluateScript:方法就可以执行一JS代码JSValue,JSValue封装了JS与ObjC中的对应的类型,以及调用JS的API等JSExport,JSExport是一个协议,遵守此协议,就可以定义我们自己的协议,在协议中声明的API都会在JS中暴露出来,才能调用Swif

  5. JSCore swift

    如果双方相互引用,会造成循环引用,而导致内存泄露。以上是Jscore的基本使用,比较简单

  6. Swift WKWebView的js调用swift

    最近项目需求,需要用到JavaScriptCore和WebKit,但是网上的资源有限,而且比较杂,都是一个博客复制另外一个博客,都没有去实际敲代码验证,下面给大家分享一下我的学习过程。

  7. Swift WKWebView的swift调用js

    不多说,直接上代码:在html里面要添加的的代码,显示swift传过去的参数:这样就实现了swift给js传参数和调用!

  8. 在 Swift 專案中使用 Javascript:編寫一個將 Markdown 轉為 HTML 的編輯器

    你有強烈的好奇心,希望在你的iOS專案中使用JavaScript。jscontext中的所有值都是JSValue對象,JSValue類用於表示任意類型的JavaScript值。因此,我們既需要寫Swift代碼也要寫JavaScript代碼。此外,我們還會在JavaScript中按照這個類的定義來創建一個對象并對其屬性進行賦值。從Swift中呼叫JavaScript就如介紹中所言,JavaScriptCore中最主要的角色就是jscontext類。一個jscontext對象是位於JavaScript環境和本

  9. swift - WKWebView JS 交互

    本文介绍WKWebView怎么与js交互,至于怎么用WKWebView这里就不介绍了HTML代码APP调JS代码结果JS给APP传参数首先注册你需要监听的js方法名2.继承WKScriptMessageHandler并重写userContentController方法,在该方法里接收JS传来的参数3.结果

  10. swift 开发UIWebView跟JS的交互

    前言作为小白的我,才开始入门IOS,选择了swift来进行入门学习,学习做着公司一个简单的小小项目,该项目需要进行跟H5进行交互,然后我就开始研究了UIWebView的使用,其实基本原理跟Android的一样,因为我是Android开发的,所以就顺水推舟了。))//这里设置你需要加载的地址}overridefuncdidReceiveMemoryWarning(){super.didReceiveMemoryWarning()//disposeofanyresourcesthatcanberecreate

随机推荐

  1. js中‘!.’是什么意思

  2. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  4. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. AngularJs上传前预览图片的实例代码

    使用AngularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,怎么实现这样的功能呢?今天小编给大家分享AugularJs上传前预览图片的实现代码,需要的朋友参考下吧

  6. JavaScript面向对象编程入门教程

    这篇文章主要介绍了JavaScript面向对象编程的相关概念,例如类、对象、属性、方法等面向对象的术语,并以实例讲解各种术语的使用,非常好的一篇面向对象入门教程,其它语言也可以参考哦

  7. jQuery中的通配符选择器使用总结

    通配符在控制input标签时相当好用,这里简单进行了jQuery中的通配符选择器使用总结,需要的朋友可以参考下

  8. javascript 动态调整图片尺寸实现代码

    在自己的网站上更新文章时一个比较常见的问题是:文章插图太宽,使整个网页都变形了。如果对每个插图都先进行缩放再插入的话,太麻烦了。

  9. jquery ajaxfileupload异步上传插件

    这篇文章主要为大家详细介绍了jquery ajaxfileupload异步上传插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. React学习之受控组件与数据共享实例分析

    这篇文章主要介绍了React学习之受控组件与数据共享,结合实例形式分析了React受控组件与组件间数据共享相关原理与使用技巧,需要的朋友可以参考下

返回
顶部