我的编程空间,编程开发者的网络收藏夹
学习永远不晚

jQuery实现动态粒子效果

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

jQuery实现动态粒子效果

本文实例为大家分享了jQuery实现动态粒子效果的具体代码,供大家参考,具体内容如下

效果图

代码


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

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script class="lazy" data-src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>
  <div id="jsi-particle-container" class="container"></div>
  <style>
    html,
    body {
      width: 100%;
      height: 100%;
      margin: 0;
      padding: 0;
      overflow: hidden;
    }
    
    .container {
      width: 100%;
      height: 100%;
      margin: 0;
      padding: 0;
      background-color: #000000;
    }
  </style>
</head>

<body>
  <script>
    var RENDERER = {
      PARTICLE_COUNT: 1000,
      PARTICLE_RADIUS: 1,
      MAX_ROTATION_ANGLE: Math.PI / 60,
      TRANSLATION_COUNT: 500,

      init: function(strategy) {
        this.setParameters(strategy);
        this.createParticles();
        this.setupFigure();
        this.reconstructMethod();
        this.bindEvent();
        this.drawFigure();
      },
      setParameters: function(strategy) {
        this.$window = $(window);

        this.$container = $('#jsi-particle-container');
        this.width = this.$container.width();
        this.height = this.$container.height();

        this.$canvas = $('<canvas />').attr({
          width: this.width,
          height: this.height
        }).appendTo(this.$container);
        this.context = this.$canvas.get(0).getContext('2d');

        this.center = {
          x: this.width / 2,
          y: this.height / 2
        };

        this.rotationX = this.MAX_ROTATION_ANGLE;
        this.rotationY = this.MAX_ROTATION_ANGLE;
        this.strategyIndex = 0;
        this.translationCount = 0;
        this.theta = 0;

        this.strategies = strategy.getStrategies();
        this.particles = [];
      },
      createParticles: function() {
        for (var i = 0; i < this.PARTICLE_COUNT; i++) {
          this.particles.push(new PARTICLE(this.center));
        }
      },
      reconstructMethod: function() {
        this.setupFigure = this.setupFigure.bind(this);
        this.drawFigure = this.drawFigure.bind(this);
        this.changeAngle = this.changeAngle.bind(this);
      },
      bindEvent: function() {
        this.$container.on('click', this.setupFigure);
        this.$container.on('mousemove', this.changeAngle);
      },
      changeAngle: function(event) {
        var offset = this.$container.offset(),
          x = event.clientX - offset.left + this.$window.scrollLeft(),
          y = event.clientY - offset.top + this.$window.scrollTop();

        this.rotationX = (this.center.y - y) / this.center.y * this.MAX_ROTATION_ANGLE;
        this.rotationY = (this.center.x - x) / this.center.x * this.MAX_ROTATION_ANGLE;
      },
      setupFigure: function() {
        for (var i = 0, length = this.particles.length; i < length; i++) {
          this.particles[i].setAxis(this.strategies[this.strategyIndex]());
        }
        if (++this.strategyIndex == this.strategies.length) {
          this.strategyIndex = 0;
        }
        this.translationCount = 0;
      },
      drawFigure: function() {
        requestAnimationFrame(this.drawFigure);

        this.context.fillStyle = 'rgba(0, 0, 0, 0.2)';
        this.context.fillRect(0, 0, this.width, this.height);

        for (var i = 0, length = this.particles.length; i < length; i++) {
          var axis = this.particles[i].getAxis2D(this.theta);

          this.context.beginPath();
          this.context.fillStyle = axis.color;
          this.context.arc(axis.x, axis.y, this.PARTICLE_RADIUS, 0, Math.PI * 2, false);
          this.context.fill();
        }
        this.theta++;
        this.theta %= 360;

        for (var i = 0, length = this.particles.length; i < length; i++) {
          this.particles[i].rotateX(this.rotationX);
          this.particles[i].rotateY(this.rotationY);
        }
        this.translationCount++;
        this.translationCount %= this.TRANSLATION_COUNT;

        if (this.translationCount == 0) {
          this.setupFigure();
        }
      }
    };
    var STRATEGY = {
      SCATTER_RADIUS: 150,
      CONE_ASPECT_RATIO: 1.5,
      RING_COUNT: 5,

      getStrategies: function() {
        var strategies = [];

        for (var i in this) {
          if (this[i] == arguments.callee || typeof this[i] != 'function') {
            continue;
          }
          strategies.push(this[i].bind(this));
        }
        return strategies;
      },
      createSphere: function() {
        var cosTheta = Math.random() * 2 - 1,
          sinTheta = Math.sqrt(1 - cosTheta * cosTheta),
          phi = Math.random() * 2 * Math.PI;

        return {
          x: this.SCATTER_RADIUS * sinTheta * Math.cos(phi),
          y: this.SCATTER_RADIUS * sinTheta * Math.sin(phi),
          z: this.SCATTER_RADIUS * cosTheta,
          hue: Math.round(phi / Math.PI * 30)
        };
      },
      createTorus: function() {
        var theta = Math.random() * Math.PI * 2,
          x = this.SCATTER_RADIUS + this.SCATTER_RADIUS / 6 * Math.cos(theta),
          y = this.SCATTER_RADIUS / 6 * Math.sin(theta),
          phi = Math.random() * Math.PI * 2;

        return {
          x: x * Math.cos(phi),
          y: y,
          z: x * Math.sin(phi),
          hue: Math.round(phi / Math.PI * 30)
        };
      },
      createCone: function() {
        var status = Math.random() > 1 / 3,
          x,
          y,
          phi = Math.random() * Math.PI * 2,
          rate = Math.tan(30 / 180 * Math.PI) / this.CONE_ASPECT_RATIO;

        if (status) {
          y = this.SCATTER_RADIUS * (1 - Math.random() * 2);
          x = (this.SCATTER_RADIUS - y) * rate;
        } else {
          y = -this.SCATTER_RADIUS;
          x = this.SCATTER_RADIUS * 2 * rate * Math.random();
        }
        return {
          x: x * Math.cos(phi),
          y: y,
          z: x * Math.sin(phi),
          hue: Math.round(phi / Math.PI * 30)
        };
      },
      createVase: function() {
        var theta = Math.random() * Math.PI,
          x = Math.abs(this.SCATTER_RADIUS * Math.cos(theta) / 2) + this.SCATTER_RADIUS / 8,
          y = this.SCATTER_RADIUS * Math.cos(theta) * 1.2,
          phi = Math.random() * Math.PI * 2;

        return {
          x: x * Math.cos(phi),
          y: y,
          z: x * Math.sin(phi),
          hue: Math.round(phi / Math.PI * 30)
        };
      }
    };
    var PARTICLE = function(center) {
      this.center = center;
      this.init();
    };
    PARTICLE.prototype = {
      SPRING: 0.01,
      FRICTION: 0.9,
      FOCUS_POSITION: 300,
      COLOR: 'hsl(%hue, 100%, 70%)',

      init: function() {
        this.x = 0;
        this.y = 0;
        this.z = 0;
        this.vx = 0;
        this.vy = 0;
        this.vz = 0;
        this.color;
      },
      setAxis: function(axis) {
        this.translating = true;
        this.nextX = axis.x;
        this.nextY = axis.y;
        this.nextZ = axis.z;
        this.hue = axis.hue;
      },
      rotateX: function(angle) {
        var sin = Math.sin(angle),
          cos = Math.cos(angle),
          nextY = this.nextY * cos - this.nextZ * sin,
          nextZ = this.nextZ * cos + this.nextY * sin,
          y = this.y * cos - this.z * sin,
          z = this.z * cos + this.y * sin;

        this.nextY = nextY;
        this.nextZ = nextZ;
        this.y = y;
        this.z = z;
      },
      rotateY: function(angle) {
        var sin = Math.sin(angle),
          cos = Math.cos(angle),
          nextX = this.nextX * cos - this.nextZ * sin,
          nextZ = this.nextZ * cos + this.nextX * sin,
          x = this.x * cos - this.z * sin,
          z = this.z * cos + this.x * sin;

        this.nextX = nextX;
        this.nextZ = nextZ;
        this.x = x;
        this.z = z;
      },
      rotateZ: function(angle) {
        var sin = Math.sin(angle),
          cos = Math.cos(angle),
          nextX = this.nextX * cos - this.nextY * sin,
          nextY = this.nextY * cos + this.nextX * sin,
          x = this.x * cos - this.y * sin,
          y = this.y * cos + this.x * sin;

        this.nextX = nextX;
        this.nextY = nextY;
        this.x = x;
        this.y = y;
      },
      getAxis3D: function() {
        this.vx += (this.nextX - this.x) * this.SPRING;
        this.vy += (this.nextY - this.y) * this.SPRING;
        this.vz += (this.nextZ - this.z) * this.SPRING;

        this.vx *= this.FRICTION;
        this.vy *= this.FRICTION;
        this.vz *= this.FRICTION;

        this.x += this.vx;
        this.y += this.vy;
        this.z += this.vz;

        return {
          x: this.x,
          y: this.y,
          z: this.z
        };
      },
      getAxis2D: function(theta) {
        var axis = this.getAxis3D(),
          scale = this.FOCUS_POSITION / (this.FOCUS_POSITION + axis.z);

        return {
          x: this.center.x + axis.x * scale,
          y: this.center.y - axis.y * scale,
          color: this.COLOR.replace('%hue', this.hue + theta)
        };
      }
    };
    $(function() {
      RENDERER.init(STRATEGY);
    });
  </script>
</body>

</html>

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

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

jQuery实现动态粒子效果

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

下载Word文档

猜你喜欢

使用jQuery怎么实现一个动态粒子效果

使用jQuery怎么实现一个动态粒子效果?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
2023-06-14

Python粒子烟花动态效果实现

这篇文章主要介绍了Python实现粒子烟花动态效果,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
2023-01-03

CSS实现粒子动态按钮效果的示例

这篇文章将为大家详细讲解有关CSS实现粒子动态按钮效果的示例,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。按钮(button)可能是网页中最常见的组件之一了,大部分都平淡无奇,如果你碰到的是一个这样的按钮
2023-06-08

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

这篇文章主要为大家详细介绍了如何通过JavaScript和Canvas实现带跳动效果的粒子动画,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下
2023-03-14

Android实现粒子中心扩散动画效果

Android粒子中心扩散动画本文详细介绍如何在Android中实现粒子中心扩散动画效果,该效果可模拟爆炸、涟漪等现象。实现步骤包括创建粒子类、粒子系统类,并在自定义View中更新粒子位置和绘制粒子。通过设置粒子数量、半径、速度和角度,即可初始化粒子系统。代码示例提供了一个完整实现,展示了如何创建粒子并管理其运动和绘制。扩展选项包括添加随机性、使用不同形状和颜色变化,以增强效果。
Android实现粒子中心扩散动画效果
2024-04-02

使用CSS3怎么实现一个粒子动画效果

本篇文章给大家分享的是有关使用CSS3怎么实现一个粒子动画效果,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。按钮点击粒子动画
2023-06-08

ThingJS粒子特效如何实现雨雪效果

这篇文章主要介绍了ThingJS粒子特效如何实现雨雪效果,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。使用ThingJS可以快速编写粒子效果,比如:下雨、下雪(可以控制雨雪大
2023-06-15

怎么使用JavaScript+Canvas实现带跳动效果的粒子动画

这篇“怎么使用JavaScript+Canvas实现带跳动效果的粒子动画”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么使
2023-07-05

Android实现粒子爆炸效果的方法

本文实例讲述了Android实现粒子爆炸效果的方法。分享给大家供大家参考。具体如下: 1. Explosion.java文件:package net.obviam.particles.model; import android.graphi
2022-06-06

Android粒子线条效果实现过程与代码

这篇文章主要介绍了Android粒子线条效果的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
2023-02-09

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

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

如何实现基于three.js的3D粒子动效

小编给大家分享一下如何实现基于three.js的3D粒子动效,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、背景粒子特效是为模拟现实中的水、火、雾、气等效果由各
2023-06-02

JavaScript如何实现带粒子效果的进度条

这篇文章主要讲解了“JavaScript如何实现带粒子效果的进度条”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript如何实现带粒子效果的进度条”吧!具体代码如下
2023-07-02

编程热搜

目录