iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >使用Canvas怎么实现一个炫丽的粒子运动效果
  • 212
分享到

使用Canvas怎么实现一个炫丽的粒子运动效果

2023-06-09 21:06:43 212人浏览 八月长安
摘要

使用canvas怎么实现一个炫丽的粒子运动效果?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。html 代码<!DOCTYPE html>&

使用canvas怎么实现一个炫丽的粒子运动效果?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

html 代码

<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Canvas 实现炫丽的粒子运动效果-云库前端</title><style>* {    margin: 0;    padding: 0;}html,body {    width: 100%;    height: 100%;}canvas {    display: block;    background: #000;}body::-WEBkit-scrollbar{    display: none;}.operator-box{    position: fixed;    top: 0;    left: 50%;    border: 1px solid #fff;    background: rgba(255,255,255,0.5);    padding: 20px 10px;    -webkit-transfORM: translateX(-50%);    transform: translateX(-50%);}.back-type,.back-animate{    margin-right: 20px;}.flex-box{    display: flex;    justify-content: center;    align-items: center;}#input-text{    line-height: 35px;    width: 260px;    height: 35px;    background: rgba(0, 0, 0,0.7);    color: #fff;    font-size: 16px;    border: none;    outline: none;    text-indent: 12px;    box-shadow: inset 0 0 12px 1px rgba(0,0,0,0.7);}#input-text::placeholder{    color: #ccc;    line-height: 55px;    height: 55px;}select{    -webkit-appearance: none;    -moz-appearance: none;    appearance: none;    border: none;    padding: 0px 20px 0px 6px;    height: 35px;    color: #fff;    text-align: left;    background: rgba(0, 0, 0,0.7) url(data:image/png;base64,iVBORw0KGGoAAAANSUhEUgAAAAUAAAaiCAYAAAAx8TU7AAAAOUlEQ&hellip;R4gPgWEIMAiOYBCS4C8ZDAIrBq4gigNkztQEFMi6AuQHESAPMeXiEMiWfpAAAAAElFTkSuQmCC) no-repeat 190px 12px;    background-size: 5px 8px;    box-shadow: inset 0 0 12px 1px rgba(0,0,0,0.7);}</style></head><body><div class="operator-box"><div class="flex-box">    <div class="back-type">散开类型:        <select name="" id="selectType">            <option value="back">归位</option>            <option value="auto">随机</option>        </select>    </div>    <div class="back-animate">散开效果(对归位有效):       <select class="back-dynamics" id="selectDynamics">           <option value="spring">dynamics.spring</option>           <option value="bounce">dynamics.bounce</option>           <option value="forceWithGravity">dynamics.forceWithGravity</option>           <option value="gravity">dynamics.gravity</option>           <option value="easeInOut">dynamics.easeInOut</option>           <option value="easeIn">dynamics.easeIn</option>           <option value="easeOut">dynamics.easeOut</option>           <option value="linear">dynamics.linear</option>       </select>    </div>    <div class="input-box"><input type="text" placeholder="输入汉字后回车" id="input-text"></div></div></div><script src="dynamics.min.js"></script><script src="index.js"></script><script>var iCircle = new Circle();</script></body></html>

HTML 代码不多,只要是几个操作元素。这里一看就明白。不费过多口舌。我们来看看本文的主角 javascript 代码,不过,在看代码前,我们不妨先听听实现这个效果的思路:

  1. 首先,我们得先生成一堆群众演员(粒子);

  2. 把每个粒子的相关参数挂到自身的一些属性上,因为第个粒子都会有自己的运动轨迹;

  3. 接着得让它们各自运动起来。运动有两种(自由运动和生成文字的运动);

JavaScript 代码中使用了三个 Canvas 画布,this.iCanvas(主场)、this.iCanvasCalculate(用来计算文字宽度)、this.iCanvasPixel(用于画出文字,并从中得到文字对应的像素点的位置坐标)。

this.iCanvasCalculate 和 this.iCanvasPixel 这两个无需在页面中显示出来,只是辅助作用。

下面就献上棒棒的 JS 实现代码

function Circle() {    var This = this;    this.init();    this.generalRandomParam();    this.drawCircles();    this.ballAnimate();    this.getUserText();    // 窗口改变大小后,生计算并获取画面    window.onresize = function(){        This.stateW = document.body.offsetWidth;        This.stateH = document.body.offsetHeight;        This.iCanvasW = This.iCanvas.width = This.stateW;        This.iCanvasH = This.iCanvas.height = This.stateH;        This.ctx = This.iCanvas.getContext("2d");    }}// 初始化Circle.prototype.init = function(){    //父元素宽高    this.stateW = document.body.offsetWidth;    this.stateH = document.body.offsetHeight;    this.iCanvas = document.createElement("canvas");    // 设置Canvas 与父元素同宽高    this.iCanvasW = this.iCanvas.width = this.stateW;    this.iCanvasH = this.iCanvas.height = this.stateH;    // 获取 2d 绘画环境    this.ctx = this.iCanvas.getContext("2d");    // 插入到 body 元素中    document.body.appendChild(this.iCanvas);    this.iCanvasCalculate = document.createElement("canvas");    // 用于保存计算文字宽度的画布    this.mCtx =  this.iCanvasCalculate.getContext("2d");    this.mCtx.font = "128px 微软雅黑";    this.iCanvasPixel = document.createElement("canvas");    this.iCanvasPixel.setAttribute("style","position:absolute;top:0;left:0;");    this.pCtx = null; // 用于绘画文字的画布    // 随机生成圆的数量    this.ballNumber = ramdomNumber(1000, 2000);    // 保存所有小球的数组    this.balls = [];    // 保存动画中最后一个停止运动的小球    this.animte = null;    this.imageData = null;    this.textWidth = 0; // 保存生成文字的宽度    this.textHeight = 150; // 保存生成文字的高度    this.inputText = ""; // 保存用户输入的内容    this.actionCount = 0;    this.ballActor = []; // 保存生成文字的粒子    this.actorNumber = 0; // 保存生成文字的粒子数量    this.backType = "back"; // 归位    this.backDynamics = ""; // 动画效果    this.isPlay = false; // 标识(在生成文字过程中,不能再生成)}// 渲染出所有圆Circle.prototype.drawCircles = function () {    for(var i=0;i<this.ballNumber;i++){        this.renderBall(this.balls[0]);    }}// 获取用户输入文字Circle.prototype.getUserText = function(){    This = this; // 保存 this 指向    ipu = document.getElementById("input-text");    ipu.addEventListener("keydown",function(event){        if(event.which === 13){ // 如果是回车键            ipu.value = ipu.value.trim(); // 去头尾空格            var pat = /[\u4e00-\u9fa5]/; // 中文判断            var isChinese = pat.test(ipu.value);            if(ipu.value.length !=0 && isChinese){                This.inputText = ipu.value;            }else{                alert("请输入汉字");                return;            }            if(This.isPlay){                return            }            This.getAnimateType();            This.getTextPixel();            This.isPlay = true;        }    });}// 计算文字的宽Circle.prototype.calculateTextWidth = function () {    this.textWidth = this.mCtx.measureText(this.inputText).width;}// 获取文字像素点Circle.prototype.getTextPixel = function () {    if(this.pCtx){        this.pCtx.clearRect(0,0,this.textWidth,this.textHeight);    }    this.calculateTextWidth(this.inputText);    this.iCanvasPixel.width = this.textWidth;    this.iCanvasPixel.height = this.textHeight;    this.pCtx =  this.iCanvasPixel.getContext("2d");    this.pCtx.font = "128px 微软雅黑";    this.pCtx.fillStyle = "#FF0000";    this.pCtx.textBaseline = "botom";    this.pCtx.fillText(this.inputText,0,110);    this.imageData = this.pCtx.getImageData(0,0,this.textWidth,this.textHeight).data;    this.getTextPixelPosition(this.textWidth,this.textHeight);}// 获取文字粒子像素点位置Circle.prototype.getTextPixelPosition = function (width,height) {    var left = (this.iCanvasW - width)/2;    var top = (this.iCanvasH - height)/2;    var space = 4;    this.actionCount = 0;    for(var i=0;i<this.textHeight;i+=space){        for(var j=0;j<this.textWidth;j+=space){            var index = j*space+i*this.textWidth*4;            if(this.imageData[index] == 255){                if(this.actionCount<this.ballNumber){                    this.balls[this.actionCount].status = 1;                    this.balls[this.actionCount].targetX = left+j;                    this.balls[this.actionCount].targetY = top+i;                    this.balls[this.actionCount].backX = this.balls[this.actionCount].x;                    this.balls[this.actionCount].backY = this.balls[this.actionCount].y;                    this.ballActor.push(this.balls[this.actionCount]);                    this.actionCount++;                }            }        }        this.actorNumber = this.ballActor.length;    }    this.animateToText();}// 粒子运动到指定位置Circle.prototype.animateToText = function(){    for(var i=0;i<This.actorNumber;i++){        dynamics.animate(This.ballActor[i], {          x: this.ballActor[i].targetX,          y: this.ballActor[i].targetY        },{            type: dynamics.easeIn,            duration: 1024,        });    }    setTimeout(function(){        This.ballbackType();    },3000);}// 粒子原路返回Circle.prototype.ballBackPosition = function(){    for(var i=0;i<This.actorNumber;i++){        var ball = This.ballActor[i];        dynamics.animate(ball, {          x: ball.backX,          y: ball.backY        },{            type: dynamics[this.backDynamics],            duration: 991,            complete:this.changeStatus(ball)        });    }}// 获取类型|动画效果Circle.prototype.getAnimateType = function() {    var selectType = document.getElementById("selectType");    var selectDynamics = document.getElementById("selectDynamics");    this.backType = selectType.options[selectType.options.selectedIndex].value;    this.backDynamics = selectDynamics.options[selectDynamics.options.selectedIndex].value;}// 复位散开Circle.prototype.ballbackType = function(){    if(this.backType == "back"){        this.ballBackPosition();    }else{        this.ballAutoPosition();    }    this.ballActor = [];}// 随机散开Circle.prototype.ballAutoPosition = function(ball){    for(var i=0;i<this.actorNumber;i++){        this.changeStatus(this.ballActor[i])    }}// 更改小球状态Circle.prototype.changeStatus = function(ball){    ball.status = 0;    if(this.isPlay == true){        this.isPlay = false;    }}// 随机生成每个圆的相关参数Circle.prototype.generalRandomParam = function(){    for(var i=0;i<this.ballNumber;i++){        var ball = {};        ball.size = 1; // 随机生成圆半径        // 随机生成圆心 x 坐标        ball.x = ramdomNumber(0+ball.size, this.iCanvasW-ball.size);        ball.y = ramdomNumber(0+ball.size, this.iCanvasH-ball.size);        ball.speedX = ramdomNumber(-1, 1);        ball.speedY = ramdomNumber(-1, 1);        this.balls.push(ball);        ball.status = 0;        ball.targetX = 0;        ball.targetY = 0;        ball.backX = 0;        ball.backY = 0;    }}// 改变圆的位置Circle.prototype.changeposition = function(){    for(var i=0;i<this.ballNumber;i++){        if( this.balls[i].status == 0){            this.balls[i].x += this.balls[i].speedX;            this.balls[i].y += this.balls[i].speedY;        }    }}// 画圆Circle.prototype.renderBall = function(ball){    this.ctx.fillStyle = "#fff";    this.ctx.beginPath(); // 这个一定要加    this.ctx.arc(ball.x, ball.y, ball.size, 0, 2 * Math.PI);    this.ctx.closePath(); // 这个一定要加    this.ctx.fill();}// 小球碰撞判断Circle.prototype.collision = function(ball){    for(var i=0;i<this.ballNumber;i++){       if(ball.x>this.iCanvasW-ball.size || ball.x<ball.size){            if(ball.x>this.iCanvasW-ball.size){                ball.x = this.iCanvasW-ball.size;            }else{                ball.x = ball.size;            }            ball.speedX = - ball.speedX;       }       if(ball.y>this.iCanvasH-ball.size || ball.y<ball.size){            if(ball.y>this.iCanvasH-ball.size){                ball.y = this.iCanvasH-ball.size;            }else{                ball.y = ball.size;            }            ball.speedY = - ball.speedY;       }    }}// 开始动画Circle.prototype.ballAnimate = function(){    var This = this;    var animateFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame;    (function move(){        animte = animateFrame(move);        This.ctx.clearRect(0, 0, This.iCanvasW, This.iCanvasH);        This.changeposition();        for(var i=0;i<This.ballNumber;i++){           This.collision(This.balls[i]);           This.renderBall(This.balls[i]);        }    })();}// 生成一个随机数function ramdomNumber(min, max) {    return Math.random() * (max - min) + min;}

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网精选频道,感谢您对编程网的支持。

--结束END--

本文标题: 使用Canvas怎么实现一个炫丽的粒子运动效果

本文链接: https://www.lsjlt.com/news/257874.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 使用Canvas怎么实现一个炫丽的粒子运动效果
    使用Canvas怎么实现一个炫丽的粒子运动效果?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。html 代码<!DOCTYPE html>&...
    99+
    2023-06-09
  • 使用canvas怎么实现一个粒子动效
    本篇文章为大家展示了使用canvas怎么实现一个粒子动效,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。绘制刻度此例为小时刻度的绘制:表盘上共有12个小时,Math.PI为180&deg;,每...
    99+
    2023-06-09
  • 使用CSS3怎么实现一个粒子动画效果
    本篇文章给大家分享的是有关使用CSS3怎么实现一个粒子动画效果,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。按钮点击粒子动画<div class="b...
    99+
    2023-06-08
  • 使用jQuery怎么实现一个动态粒子效果
    使用jQuery怎么实现一个动态粒子效果?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。<!DOCTYPE html><html lan...
    99+
    2023-06-14
  • 使用canvas怎么实现一个粒子动画背景
    使用canvas怎么实现一个粒子动画背景?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。创建canvas首先需要在需要展示粒子背景的父元素中创建一个canvas标签, 指定wid...
    99+
    2023-06-09
  • 怎么使用JavaScript+Canvas实现带跳动效果的粒子动画
    这篇“怎么使用JavaScript+Canvas实现带跳动效果的粒子动画”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么使...
    99+
    2023-07-05
  • 怎么在JavaScript中使用canvas实现一个随机粒子特效
    本篇文章给大家分享的是有关怎么在JavaScript中使用canvas实现一个随机粒子特效,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Java的特点有哪些Java的特点有哪些...
    99+
    2023-06-14
  • 如何在HTML5中实现一个超炫酷粒子效果的进度条
    如何在HTML5中实现一个超炫酷粒子效果的进度条?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。JavaScript代码  var lightL...
    99+
    2023-06-09
  • 怎么用HTML5的canvas实现一个炫酷时钟效果
    小编给大家分享一下怎么用HTML5的canvas实现一个炫酷时钟效果,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!对于H5来说,canvas可以说是它最有特色的一...
    99+
    2023-06-09
  • 怎么在Html5中使用canvas实现一个粒子时钟
    这篇文章将为大家详细讲解有关怎么在Html5中使用canvas实现一个粒子时钟,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。首先要创建一个html文件并添加一个canvas画布,如下:<...
    99+
    2023-06-09
  • vue particles.js怎么实现炫酷的粒子动效登录背景
    本文小编为大家详细介绍“vue particles.js怎么实现炫酷的粒子动效登录背景”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue particles.js怎么实现炫酷的粒子动效登录背景”文章能帮助大家解决疑惑,下面跟着小编的思路...
    99+
    2023-07-04
  • 使用canvas怎么实现一个github404动态效果
    使用canvas怎么实现一个github404动态效果?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。文件目录文件资源文件源码与图片在文章末尾给出代码网页的body部分这里给...
    99+
    2023-06-09
  • 使用canvas怎么实现一个扭蛋机动画效果
    使用canvas怎么实现一个扭蛋机动画效果?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。布局扭蛋机的布局比较简单,只需要在基础背景上添加一些元素就可以,最主要的是canvas标...
    99+
    2023-06-09
  • 使用canvas怎么实现一个探照灯效果
    这期内容当中小编将会给大家带来有关使用canvas怎么实现一个探照灯效果,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。</iframe><button id="btn...
    99+
    2023-06-09
  • 使用canvas怎么实现一个数字雨效果
    使用canvas怎么实现一个数字雨效果?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。效果图:代码:<!DOCTYPE html><h...
    99+
    2023-06-09
  • 使用canvas怎么实现一个流水灯效果
    使用canvas怎么实现一个流水灯效果?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。具体内容如下<!DOCTYPE html>  ...
    99+
    2023-06-15
  • 使用canvas怎么实现一个下雨效果的示例
    本篇文章为大家展示了使用canvas怎么实现一个下雨效果的示例,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。<!doctype html><html lang=...
    99+
    2023-06-09
  • 使用Canvas怎么实现一个图片分割效果
    本篇文章为大家展示了使用Canvas怎么实现一个图片分割效果,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。首先我们要初始化一些变量,比如图片的宽高,矩形的个数,剪切的尺寸等,然后再计算每个矩形的坐标...
    99+
    2023-06-09
  • 使用canvas怎么实现一个手写签名效果
    这期内容当中小编将会给大家带来有关使用canvas怎么实现一个手写签名效果,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。HTML代码:<!--手写区-->   &...
    99+
    2023-06-09
  • 使用canvas怎么实现一个图片马赛克效果
    本篇文章为大家展示了使用canvas怎么实现一个图片马赛克效果,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1. 原生canvas实现用到的API1) getContext(contextID) -...
    99+
    2023-06-09
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作