基于three.js实现特定Div容器的粒子特效封装

   本文基于three.js实现特定容器的粒子特效效果,支持用户传入特定的dom对象以及粒子颜色。

  



  效果图

  移入库

<script src="jquery-1.11.3.min.js" type="text/javascript"> </script>
<script src="three.min.js" type="text/javascript"></script>
<script src="bodong.js" type="text/javascript"></script> 

  Html页面指定容器

<!-- 波动动画 -->
<div id="particles" style="width:100%; overflow:hidden; height:200px;background:#383232;"></div>

  创建波动示例并完成容器绑定

<srcipt>
    $(function(){
    //构造波动对象,指定dom元素,指定粒子颜色字符串
    var BodongObj=new Bodong($(‘#particles‘),‘#c0cbff‘);
    BodongObj.init();
    BodongObj.animate();
    })

</script>

  第三方库下载链接

  http://v.bootstrapmb.com/2019/4/u0d54217/dom01/three.min.js

  核心代码(bodong.js)

  1 function Bodong(domElement,color) {
  2     var SEPARATION = 100,
  3         AMOUNTX = 50,
  4         AMOUNTY = 50;
  5     var container;
  6     var camera, scene, renderer;
  7     var particles, particle, count = 0;
  8     var mouseX = -660,
  9         mouseY = -210;
 10     var windowHalfX = domElement.innerWidth() / 2;
 11     var windowHalfY = domElement.innerHeight() / 1;
 12
 13     this.init = function() {
 14         container = document.createElement("div");
 15         container.id = "banner-canvas";
 16         document.getElementById("particles").appendChild(container);
 17         camera = new THREE.PerspectiveCamera(75, domElement.innerWidth() / domElement.innerHeight(), 1, 10000);
 18         camera.position.z = 1000;
 19         scene = new THREE.Scene();
 20         particles = new Array();
 21         var e = Math.PI * 2;
 22         var d = new THREE.ParticleCanvasMaterial({
 23             color: color||"#46c37b",
 24             program: function(f) {
 25                 f.beginPath();
 26                 f.arc(0, 0, 1, 0, e, true);
 27                 f.fill()
 28             }
 29         });
 30         var a = 0;
 31         for (var b = 0; b < AMOUNTX; b++) {
 32             for (var c = 0; c < AMOUNTY; c++) {
 33                 particle = particles[a++] = new THREE.Particle(d);
 34                 particle.position.x = b * SEPARATION - ((AMOUNTX * SEPARATION) / 2);
 35                 particle.position.z = c * SEPARATION - ((AMOUNTY * SEPARATION) / 2);
 36                 scene.add(particle)
 37             }
 38         }
 39         renderer = new THREE.CanvasRenderer();
 40         renderer.setSize(domElement.innerWidth(), domElement.innerHeight());
 41         container.appendChild(renderer.domElement);
 42         document.addEventListener("mousemove", this.onDocumentMouseMove, false);//整个页面监听鼠标移动事件
 43         domElement.on("resize", this.onWindowResize, false);
 44     }
 45
 46     this.onWindowResize = function() {
 47         windowHalfX = domElement.innerWidth() / 2;
 48         windowHalfY = domElement.innerHeight() / 2;
 49         camera.aspect = domElement.innerWidth() / domElement.innerHeight();
 50         camera.updateProjectionMatrix();
 51         renderer.setSize(domElement.innerWidth(), domElement.innerHeight())
 52     }
 53
 54     this.onDocumentMouseMove = function(a) {
 55         mouseX = a.clientX - windowHalfX;//水平移动距离
 56         mouseY = a.clientY - windowHalfY;//竖直移动距离
 57         mouseY=mouseY>0?-mouseY:mouseY;//防止视角上扬
 58     }
 59
 60     this.onDocumentTouchStart = function(a) {
 61         if (a.touches.length === 1) {
 62             a.preventDefault();
 63             mouseX = a.touches[0].pageX - windowHalfX;
 64             mouseY = a.touches[0].pageY - windowHalfY
 65         }
 66     }
 67
 68     this.onDocumentTouchMove = function(a) {
 69         if (a.touches.length === 1) {
 70             a.preventDefault();
 71             mouseX = a.touches[0].pageX - windowHalfX;
 72             mouseY = a.touches[0].pageY - windowHalfY
 73         }
 74     }
 75
 76     this.animate = function() {
 77         requestAnimationFrame(this.animate.bind(this));//绑定this
 78         this.render()
 79     }
 80
 81     this.render = function() {
 82         camera.position.x += (mouseX - camera.position.x) * 0.05;
 83         camera.position.y += (-mouseY - camera.position.y) * 0.05;
 84         camera.lookAt(scene.position);
 85         var a = 0;
 86         for (var b = 0; b < AMOUNTX; b++) {
 87             for (var c = 0; c < AMOUNTY; c++) {
 88                 particle = particles[a++];
 89                 particle.position.y = (Math.sin((b + count) * 0.3) * 50) + (Math.sin((c + count) * 0.5) * 50);
 90                 particle.scale.x = particle.scale.y = (Math.sin((b + count) * 0.3) + 1) * 2 + (Math.sin((c + count) * 0.5) + 1) * 2
 91             }
 92         }
 93         renderer.render(scene, camera);
 94         count += 0.08
 95     };
 96
 97 }
 98
 99 /*--------------------测试数据------------------------*/
100
101 //var BodongObj=new Bodong($(‘#particles‘),‘#c0cbff‘);
102 //BodongObj.init();
103 //BodongObj.animate();

bodong.js

  在线Dome效果链接(以整个网页为容器,本文在此基础上进行封装)

  http://v.bootstrapmb.com/2019/4/u0d54217/

原文地址:https://www.cnblogs.com/giserjobs/p/11875729.html

时间: 2024-08-29 23:06:40

基于three.js实现特定Div容器的粒子特效封装的相关文章

基于slideout.js实现的移动端侧边栏滑动特效

HTML5现在本领太大了,PC端已经无法满足它的胃口了,它将强势攻入移动端,所以移动端中各种特效也得基于HTML5实现,看看我们将要介绍的slideout.js,能帮我们实现怎么样的侧边栏滑动特效呢~~ 先看下运行效果: 一.准备资料 只需要准备slideout.js库即可: https://github.com/Mango/slideout/blob/master/dist/slideout.js 小图标: 1)menu.png 2)happy.png 二.实现代码 HTML代码: <!doc

用jQuery基于原生js封装的轮播

我发现轮播在很多网站里面都用到过,一个绚丽的轮播可以为网页增色不少,最近闲来无事,也用原生js封装了一个轮播,可能不像网上的插件那么炫,但是也有用心去做.主要用了闭包的思想.需要传递的参数有:图片地址的数组,图片宽度,上一页,下一页的id,图片列表即ul的id(这儿使用无序列表排列的图片),自动轮播间隔的时间.功能:实现了轮播的自动轮播,可以点击上一页,下一页进行切换. 下面是html中的代码,只需要把存放的容器写好,引入jquery即可: <!DOCTYPE html><html>

基于Three.js的360X180度全景图预览插件

基于Three.js的360X180度全景图预览插件 时间 2015-08-12 10:01:10  HTML5中国 原文  http://www.html5cn.org/article-8621-1.html 主题 Three.js 简要教程 Photo Sphere Viewer是一款基于Three.js的360X180度全景图预览js插件.该js插件可以360度旋转查看全景图,也可以上下180度查看图片.使用该插件的唯一要求是浏览器支持canvas或WebGL. 查看演示      下载插

基于Three.js的360度全景--photo-sphere-viewer--简介

这个是基于three.js的全景插件  photo-sphere-viewer.js  ---------------------------------------- 1.能添加热点: 2.能调用陀螺仪: 3.功能比较完善,能满足大多数人的需求了: 4.最主要的是操作简单,提供一长全景图片即可(大多数手机都可以拍摄). 直接上代码: var photosphere = document.getElementById('photosphere'); var PSV = new PhotoSphe

基于vue.js的简单用户管理

功能描述:添加.修改.搜索过滤 效果图: 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <title>简单用户管理</title> 5 <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"

《基于Node.js实现简易聊天室系列之详细设计》

一个完整的项目基本分为三个部分:前端.后台和数据库.依照软件工程的理论知识,应该依次按照以下几个步骤:需求分析.概要设计.详细设计.编码.测试等.由于缺乏相关知识的储备,导致这个Demo系列的文章层次不是很清楚,索性这一章将所有的过程(前后端以及数据库)做一个介绍,下一章写完总结就OK了吧. (1)前端部分 涉及到的技术:html.css.bootstrap.jquery.jquery UI 登录/注册界面使用的是bootstrap响应式布局,即支持不同尺寸的客户端,以此提高用户的体验.在这之前

基于Ascensor.js全屏切换页面插件

今天给大家分享一款基于Ascensor.js全屏切换页面插件,这款实例 适用浏览器:IE8.360.FireFox.Chrome.Safari.Opera.傲游.搜狗.世界之窗.效果图如下: 在线预览   源码下载 实现的代码. html代码: <div id="general"> <div id="content"> <!--Contenu1--> <div> <div class="contenu&

利用修改div的位置+js对象存储div信息 实现简单的div自定义布局功能

利用修改div的位置+js对象存储div信息 实现简单的div自定义布局功能1.在界面上添加几个checkbox和一个接收动态添加div的容器 <div> 功能区域 <br /> <input id="1" type="checkbox" value="新闻" name="11" />新闻 <input id="2" type="checkbox"

基于zepto.js的模仿手机QQ空间的大图查看组件ImageView.js

调用方式 :ImageView(index,imgData)  --index参数 为图片默认显示的索引值,类型 为Number  --imaData参数 为图片url数组 ,类型为Array 使用之前要先引入 zepto.js 文件 ImageView.js具体代码如下: /* * ImageView v1.0.0 * --口袋蓝房网 基于zepto.js的大图查看 * --调用方法 ImageView(index,imgDada) * --index 图片默认值显示索引,Number --i