JavaScript利用Canvas实现粒子动画倒计时

目录
  • canvas 粒子动画介绍
    • 何为canvas
    • 粒子动画是啥
  • canvas
  • 定义初始变量
  • 初始化canvas和数字文本
  • 创建一定数量的点
  • 倒计时
  • 倒计时文本绘画
  • 循环绘制
  • 点动画
  • 效果图

canvas 粒子动画介绍

何为canvas

canvas是HTML5中新增的一个标签,主要是用于网页实时生成图像并可操作图像,它是用JavaScript操作的bitmap。

粒子动画是啥

粒子动画就是页面上通过发射许多微小粒子来表示不规则模糊物体,比如:用小圆点来模拟下雪、下雨的效果,用模糊线条模拟黑客帝国背景效果等。

canvas

新建一个HTML文件,写入canvas标签用于后续展示倒计时

<canvas id="canvas-number"></canvas>
<canvas id="canvas-dots"></canvas>
  • canvas-number 是用于倒计时数字展示
  • canvas-dots 是用于全屏粒子动画展示

加点样式效果看看吧

body {
  background-color: #24282f;
  margin: 0;
  padding: 0;
}

canvas {
  position: absolute;
  top: 0;
  left: 0;
}

#canvas-number {
  width: 680px;
  height: 420px;
}

主要是定义了 canvas-number 画布大小,canvas-dots 画布大小会在JavaScript中定义

定义初始变量

在JavaScript中定义所需的变量

var numberStage,
  numberStageCtx,
  numberStageWidth = 680,
  numberStageHeight = 420,
  numberOffsetX,
  numberOffsetY,

  stage,
  stageCtx,
  stageWidth = window.innerWidth,
  stageHeight = window.innerHeight,
  stageCenterX = stageWidth / 2,
  stageCenterY = stageHeight / 2,

  countdownFrom = 3,
  countdownTimer = 2800,
  countdownRunning = true,

  number,
  dots = [],
  numberPixelCoordinates,
  circleRadius = 2,
  colors = ['61, 207, 236', '255, 244, 174', '255, 211, 218', '151, 211, 226'];
  • numberStage - stageCenterY 这一块主要是定义画布宽高和坐标
  • countdownFrom 从 10 开始倒计时
  • countdownTimer 数字显示的时长
  • countdownRunning 动起来
  • colors 页面上所有粒子颜色
  • 其他的可以自己理解一下哦~

初始化canvas和数字文本

创建一个init函数,里面会包裹初始化内容

function init() {

  // 初始化canvas-number
  numberStage = document.getElementById("canvas-number");
  numberStageCtx = numberStage.getContext('2d');

  // 设置文字文本的窗口大小
  numberStage.width = numberStageWidth;
  numberStage.height = numberStageHeight;

  // 初始化canvas-dots和窗口大小
  stage = document.getElementById("canvas-dots");
  stageCtx = stage.getContext('2d');
  stage.width = stageWidth;
  stage.height = stageHeight;

  // 设置一定的偏移量,让文字居中
  numberOffsetX = (stageWidth - numberStageWidth) / 2;
  numberOffsetY = (stageHeight - numberStageHeight) / 2;
}

根据代码中的注释可以了解初始化的内容哦~

初始化完成之后,我们需要直接运行方法

init();

init函数结束之后,马上就需要运行该函数了

创建一定数量的点

for (var i = 0; i < 2240; i++) {
    var dot = new Dot(randomNumber(0, stageWidth), randomNumber(0, stageHeight), colors[randomNumber(1, colors.length)], .3);
    dots.push(dot);
    tweenDots(dot, '', 'space');
}
  • 循环创建点,这里循环给的是个固定数据
  • new Dot 是创建点对象的方法
  • tweenDots 是让点动起来的第三方js
function Dot(x, y, color, alpha) {

  var _this = this;

  _this.x = x;
  _this.y = y;
  _this.color = color;
  _this.alpha = alpha;

  this.draw = function () {
    stageCtx.beginPath();
    stageCtx.arc(_this.x, _this.y, circleRadius, 0, 2 * Math.PI, false);
    stageCtx.fillStyle = 'rgba(' + _this.color + ', ' + _this.alpha + ')';
    stageCtx.fill();
  }

}
  • 通过 x、y坐标定位点
  • 通过随机颜色,让点样式更丰富
  • draw 里面的内容都是canvas画图的方法,具体可参考canvas文档

倒计时

function countdown() {

  // 发送倒计时数字
  drawNumber(countdownFrom.toString());

  // 倒计时为 0 时停止
  if (countdownFrom === 0) {
    countdownRunning = false;
    drawNumber('蜡笔小心');
  }

  countdownFrom--;
}

倒计时结束之后,就可以想干啥干啥了,这里我重新输出了额外的文字

countdownFrom 需要做递减的操作

countdown();

我们需要在页面进入时,直接触发倒计时函数

倒计时文本绘画

每一个倒计时都需要用不同的点去绘制

这里通过循环 让每个文本都有四种颜色绘制

function drawNumber(num) {
  numberStageCtx.clearRect(0, 0, numberStageWidth, numberStageHeight);
  numberStageCtx.fillStyle = "#24282f";
  numberStageCtx.textAlign = 'center';
  numberStageCtx.font = "bold 118px Lato";
  numberStageCtx.fillText(num, 250, 300);

  var ctx = document.getElementById('canvas-number').getContext('2d');
  var imageData = ctx.getImageData(0, 0, numberStageWidth, numberStageHeight).data;
  numberPixelCoordinates = [];
  for (var i = imageData.length; i >= 0; i -= 4) {
    if (imageData[i] !== 0) {
      var x = (i / 4) % numberStageWidth;
      var y = Math.floor(Math.floor(i / numberStageWidth) / 4);
      if ((x && x % (circleRadius * 2 + 3) == 0) && (y && y % (circleRadius * 2 + 3) == 0)) {
        numberPixelCoordinates.push({
          x: x,
          y: y
        });
      }
    }
  }
  formNumber();
}

function formNumber() {
  for (var i = 0; i < numberPixelCoordinates.length; i++) {
    tweenDots(dots[i], numberPixelCoordinates[i], '');
  }

  if (countdownRunning && countdownFrom > 0) {
    setTimeout(function () {
      breakNumber();
    }, countdownTimer);
  }
}

function breakNumber() {
  for (var i = 0; i < numberPixelCoordinates.length; i++) {
    tweenDots(dots[i], '', 'space');
  }

  if (countdownRunning) {
    setTimeout(function () {
      countdown();
    }, countdownTimer);
  }

}

循环绘制

function loop() {
  stageCtx.clearRect(0, 0, stageWidth, stageHeight);
  for (var i = 0; i < dots.length; i++) {
    dots[i].draw(stageCtx);
  }
  requestAnimationFrame(loop);
}
loop();

循环绘制,需要进入页面即执行,所以在方法之后马上执行该函数

点动画

在倒计时文本中,我们一直会调用tweenDots方法,就是用于点动画效果的绘制

function tweenDots(dot, pos, type) {
  if (type === 'space') {
    TweenMax.to(dot, (3 + Math.round(Math.random() * 100) / 100), {
      x: randomNumber(0, stageWidth),
      y: randomNumber(0, stageHeight),
      alpha: 0.3,
      ease: Cubic.easeInOut,
      onComplete: function () {
        tweenDots(dot, '', 'space');
      }
    });
  } else {
    TweenMax.to(dot, (1.5 + Math.round(Math.random() * 100) / 100), {
      x: (pos.x + numberOffsetX),
      y: (pos.y + numberOffsetY),
      delay: 0,
      alpha: 1,
      ease: Cubic.easeInOut,
      onComplete: function () {}
    });
  }
}

function randomNumber(min, max) {
  return Math.floor(Math.random() * (max - min) + min);
}
  • 随机移动画布周围的点
  • 让点和文本内容协调展示

效果图

以上就是JavaScript利用Canvas实现粒子动画倒计时的详细内容,更多关于JavaScript Canvas粒子动画倒计时的资料请关注我们其它相关文章!

(0)

相关推荐

  • JavaScript+Canvas模拟实现支付宝画年兔游戏

    目录 动手前的思路 思考1.如何让鼠标只能在特定区域内画画? 思考2.如何让绘制的图画动起来 思考3.如何撤销上一步操作 思考4.如何判断线条绘制完毕 关键步骤 接近过年了,支付宝的集福的活动又开始了,集美们的五福集齐了没有.每年的集福活动都有一些小游戏,今年也不例外,画年画就是其中之一,本篇用canvas来写一个画年兔的游戏. 动手前的思路 画年画游戏规则是:跟着特定轮廓画出线条来. 思考1.如何让鼠标只能在特定区域内画画? 首先要获取到这个轮廓区域所在画布上的位置,判断鼠标绘画的位置是否在指

  • JavaScript+Canvas实现文字粒子流特效

    目录 动手前思考 绘制文字 获取像素点位 渲染粒子 简单的动画效果 1.随机选择四个方向中的某一个方向,生成初始坐标 2.从初始位置运动到实际位置 3.点击文字炸开的特效 动手前思考 首先要在特定的位置生成粒子,要获取到canvas上像素的点位,通过canvas的getImageData函数我们可以得到canvas像素点的信息,获取像素点中透明度大于0的位置. 绘制文字 新建一个canvas画布,在画布上绘制任意的文字 ctx.font = "200px Arial"; ctx.fon

  • JS技巧Canvas 性能优化脏矩形渲染实例详解

    目录 正文 画布该如何更新? 脏矩形渲染原理 脏矩形渲染实现 性能测试 结尾 正文 使用 Canvas 做图形编辑器时,我们需要自己维护自己的图形树,来保存图形的信息,并定义元素之间的关系. 我们改变画布中的某个图形,去更新画布,最简单的是清空画布,然后根据图形树将所有图形再绘制一遍,这在图形较少的情况下是没什么问题的.但如果图形数量很多,那绘制起来可能就出现卡顿了. 那么,有没有什么办法来优化一下?有,脏矩形渲染. 画布该如何更新? 这里我们假设这么一个场景,画布上绘制了随机位置大量的绿球,然

  • JS+Canvas实现满屏爱心和文字动画的制作

    目录 介绍 步骤 介绍 <canvas> 最早由 Apple 引入 WebKit,用于 Mac OS X 的 Dashboard,随后被各个浏览器实现.如今,所有主流的浏览器都支持它.Canvas API 提供了一个通过 JavaScript 和 HTML 的 <canvas> 元素来绘制图形的方式.它可以用于动画.游戏画面.数据可视化.图片编辑以及实时视频处理等方面.Canvas 适合绘制大数据量图形元素的图表(如热力图.地理坐标系或平行坐标系上的大规模线图或散点图等),也适合实

  • 利用JS+Canvas给南方的冬季来一场纷纷扬扬的大雪

    目录 前言 具体实现 1. 页面布局 2. 雪花的实现 3. 实现下雪 总结 前言 今年冬季都快接近尾声了,身处在南方的我,一点小雪花都还没见到.今年感觉也没以往的冬季冷,以往的冬季就不太能见到一场大雪,今年估计更不可能见到一场大雪纷飞的景色了,因此,用代码来实现一场纷纷扬扬的大雪,完成自己今年看雪的愿望. 具体实现 使用Canvas实现雪花纷飞的场景. 1. 页面布局 页面html,body 设置宽100%.高100vh,铺满整个屏幕,并设置一张好看的背景图或者背景色,能够很好地和白色的雪花相

  • JavaScript使用canvas实现flappy bird全流程详解

    目录 简介 游戏规则 游戏素材 开始制作 初始化canvas画布 加载资源 背景 地面 管道 笨鸟 碰撞检测 效果 简介 canvas 是HTML5 提供的一种新标签,它可以支持 JavaScript 在上面绘画,控制每一个像素,它经常被用来制作小游戏,接下来我将用它来模仿制作一款叫flappy bird的小游戏.flappy bird(中文名:笨鸟先飞)是一款由来自越南的独立游戏开发者Dong Nguyen所开发的作品,于2013年5月24日上线,并在2014年2月突然暴红. 游戏规则 玩家只

  • JavaScript利用Canvas实现粒子动画倒计时

    目录 canvas 粒子动画介绍 何为canvas 粒子动画是啥 canvas 定义初始变量 初始化canvas和数字文本 创建一定数量的点 倒计时 倒计时文本绘画 循环绘制 点动画 效果图 canvas 粒子动画介绍 何为canvas canvas是HTML5中新增的一个标签,主要是用于网页实时生成图像并可操作图像,它是用JavaScript操作的bitmap. 粒子动画是啥 粒子动画就是页面上通过发射许多微小粒子来表示不规则模糊物体,比如:用小圆点来模拟下雪.下雨的效果,用模糊线条模拟黑客帝

  • JavaScript利用canvas绘制流星雨效果

    目录 前言 需求分析 实现过程 1.绘制满天繁星 2.满天繁星闪起来 3.绘制流星 4.流星划过夜空 5.流星雨 6.merge视觉盛宴 前言 最近总是梦见一些小时候的故事,印象最深刻的就是夏天坐在屋顶上,看着满天的繁星,一颗,两颗,三颗...不由自主地开始了数星星的过程.不经意间,一颗流星划过夜间,虽然只是转瞬即逝,但它似乎比夜空中的其它繁星更吸引着我.听老人说,看见流星的时候许愿,愿望是可以实现的,此时早已把数星星抛之脑后,开始期待着下一颗流星的出现.但是那天晚上,流星再也没有出现,这也成了

  • JavaScript利用canvas实现鼠标跟随特效

    目录 前言 创建canvas画布 定义鼠标 x / y 初始化canvas 画箭头 循环动画 鼠标事件 前言 canvas是一个很神奇的玩意儿,比如画表格.画海报图都要用canvas去做,前几天有用css去做一个鼠标跟随的恶魔之眼的动画效果,想着能不能用canvas也做一个鼠标跟随的效果呢? 创建canvas画布 canvas画布创建可以直接用canvas标签即可 <canvas></canvas> 也没有过多的样式,基本都是用js去完成画布中的内容的 const canvas =

  • javascript利用canvas实现鼠标拖拽功能

    利用canvas实现鼠标拖拽功能,当在元素上按下鼠标并移动时,元素跟着鼠标移动. 效果: 主要思路: 当鼠标按下时,用isPointInPath方法判断鼠标位置是否在元素上,如果在则鼠标移动时元素跟着移动:当鼠标抬起时,将鼠标移动事件和抬起事件置空. 代码如下: <canvas id="can" width="400" height="400"></canvas> <script type="text/ja

  • iOS中利用CAEmitterLayer实现粒子动画详解

    前言 你肯定见过很酷炫的iOS动画吧,例如微信的表情雨

  • Canvas 绘制粒子动画背景

    效果如下: 代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <style> *{ margin:0px; padding:0px; } body{ background:#000; } canvas{ position:abs

  • JavaScript利用Date实现简单的倒计时实例

    介绍 Date对象,是操作日期和时间的对象.Date对象对日期和时间的操作只能通过方法.Date在js中和Array类似,都是拥有自己的特殊方法的特殊对象. 创建 Date 对象的语法: var myDate=new Date() //Date 对象会自动把当前日期和时间保存为其初始值. 获取倒计时之前,我们不妨先来看怎样获取当前时间吧!!! function time(){ var oDate = new Date(); var year = oDate.getFullYear(); var

  • JavaScript+Canvas实现带跳动效果的粒子动画

    目录 前言 实现过程 运行效果 总结 前言 用 HTML5 的 Canvas 元素实现一个带有跳动效果的粒子动画.会用到 Canvas 的2D渲染上下文,通过 JavaScript 编写绘图代码,实现画布上一系列粒子的随机运动和相互作用.还会使用 CSS3 动画属性,使得画布背景颜色和粒子颜色能够流畅地过渡,达到更加自然的效果. 代码运行效果在底部 实现过程 1.创建 Canvas 元素,并获取其上下文 在实现粒子跳动动画的过程中,第一步需要创建一个 Canvas 元素,并获取其上下文.Canv

  • JavaScript+html5 canvas实现图片破碎重组动画特效

    也许你见过HTML5图片破碎动画特效,实现的原理也挺简单的.但是你应该没有见过视频也可以破碎重组,这个HTML5动画就是利用Canvas的相关特性,实现了点击鼠标让视频破碎重组的效果.在视频区域点击鼠标,即可让该区域的视频破碎,让后经过一段时间后,破碎的区域又可以重组还原,视觉效果非常棒. HTML代码 <div style="display:none"> <video id="sourcevid" autoplay="true"

  • 利用JavaScript实现3D可旋转粒子矩阵效果

    目录 演示 技术栈 dat.gui.min.js 源码 js部分 演示 技术栈 本次使用了dat.gui.min.js这个新库(就是在我文章里没有出现过的那么他们的功能有哪些呢?——可以百度搜搜)不想搜的话就听我简单絮叨两句吧. dat.gui.min.js 就是能调节数据的功能框 使用起来也很简单例如建立一个对象 gui = { lightY:30, //灯光y轴的位置 sphereX:0, //球的x轴的位置 sphereZ:0, //球的z轴的位置 cubeX:25, //立方体的x轴位置

随机推荐