核心代码:

var T$ = function(id) { return document.getElementById(id); }

var $extend = function(des, src) { for (var p in src) { des[p] = src[p]} return des; }

var Bubble = function() {

// 小球随机样式

var clss = ['ball_one', 'ball_two', 'ball_three', 'ball_four', 'ball_five', 'ball_six'];

var Ball = function(radius, clsname) {

var ball = document.createElement('div');

ball.className = clsname;

with(ball.style) {

width = height = (radius || 10) + 'px'; position = 'absolute';

}

return ball;

};

// 屏保主类

var Screen = function(cid, config) {

var self = this;

if (!(self instanceof Screen)) {

return new Screen(cid, config);

}

self.container = T$(cid);

if (!self.container) return;

config = $extend(Screen.Config, config || {});

// 配置属性

self.ballsnum = config.ballsnum;

self.diameter = 55;

self.radius = self.diameter / 2;

self.bounce = config.bounce;

self.spring = config.spring;

self.gravity = config.gravity;

self.balls = [];

self.timer = null;

// 上下左右边界

self.T_bound = 0;

self.B_bound = self.container.clientHeight;

self.L_bound = 0;

self.R_bound = self.container.clientWidth;

};

// 静态属性

Screen.Config = {

ballsnum: 5, // 小球数目

spring: 0.8, // 弹力加速度

bounce: -0.95, // 反弹

gravity: 0.1 // 重力

};

Screen.prototype = {

initialize: function() {

var self = this;

// 生成小球

self.createBalls();

// 侦听碰撞

self.timer = setInterval(function() {

self.hitTest();

}, 32);

},

createBalls: function() {

var self = this, num = self.ballsnum, i = 0;

var frag = document.createDocumentFragment();

for (; i < num; i++) {

var ball = new Ball(self.diameter, clss[Math.floor(Math.random() * (clss.length - 1))]);

ball.radius = self.radius;

ball.diameter = self.diameter;

ball.style.left = (Math.random() * self.B_bound) + 'px';

ball.style.top = (Math.random() * self.R_bound) + 'px';

ball.vx = Math.random() * 6 - 3;

ball.vy = Math.random() * 6 - 3;

frag.appendChild(ball);

self.balls[i] = ball;

}

self.container.appendChild(frag);

},

// 碰撞检测

hitTest: function() {

var self = this, num = self.ballsnum, balls = self.balls;

for (var i = 0; i < num - 1; i++) {

var ball0 = balls[i];

ball0.x = ball0.offsetLeft + ball0.radius;

ball0.y = ball0.offsetTop + ball0.radius;

for (var j = i + 1; j < num; j++) {

var ball1 = balls[j];

ball1.x = ball1.offsetLeft + ball1.radius;

ball1.y = ball1.offsetTop + ball1.radius;

var dx = ball1.x - ball0.x;

var dy = ball1.y - ball0.y;

var dist = Math.sqrt(dx * dx + dy * dy);

var misDist = ball0.radius + ball1.radius;

if (dist < misDist) {

var angle = Math.atan2(dy, dx);

var tx = ball0.x + Math.cos(angle) * misDist;

var ty = ball0.y + Math.sin(angle) * misDist;

var ax = (tx - ball1.x) * self.spring;

var ay = (ty - ball1.y) * self.spring;

ball0.vx -= ax;

ball0.vy -= ay;

ball1.vx += ax;

ball1.vy += ay;

}

}

}

for (var i = 0; i < num; i++) {

self.move(balls[i]);

}

},

// 气泡运动

move: function(ball) {

var self = this;

ball.vy += self.gravity;

ball.style.left = (ball.offsetLeft + ball.vx) + 'px';

ball.style.top = (ball.offsetTop + ball.vy) + 'px';

// 边界检测

var T = self.T_bound, B = self.B_bound, L = self.L_bound, R = self.R_bound, BC = self.bounce;

if (ball.offsetLeft + ball.diameter > R) {

ball.style.left = R - ball.diameter + 'px';

ball.vx *= BC;

} else if (ball.offsetLeft < L) {

ball.style.left = L + 'px';

ball.vx *= BC;

}

if (ball.offsetTop + ball.diameter > B) {

ball.style.top = B - ball.diameter + 'px';

ball.vy *= BC;

} else if (ball.offsetTop < T) {

ball.style.top = T + 'px';

ball.vy *= BC;

}

}

};

return { Screen: Screen }

}();

window.onload = function() {

var sc = null;

T$('start').onclick = function() {

document.getElementById('inner').innerHTML = '';

sc = Bubble.Screen('inner', { ballsnum: 5, spring: 0.8, bounce: -0.95, gravity: 0.1});

sc.initialize();

};

T$('stop').onclick = function() { clearInterval(sc.timer); }

var bound = false

T$('change').onclick = function() {

if (!bound) {

T$('screen').style.backgroundImage = 'url("http://demo.jb51.net/js/bubbling/o_bg1.jpg")';

bound = true;

} else {

T$('screen').style.backgroundImage = 'url("http://demo.jb51.net/js/bubbling/o_bg2.jpg")';

bound = false;

}

}

}

【说明】

程序效率出现了很大瓶颈。需要做的优化还有很多。有时间继续完善。

另:感谢罗浮宫群友逍遥君武和豪情对图片的支持。

【源码下载】

http://www.jb51.net/jiaoben/28295.html

相关标签:气泡屏保

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

php气泡效果,js 模拟气泡屏保效果代码_其他特效相关推荐

  1. C#实现气泡屏保效果(用4个timer)

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  2. Winform中实现自定义屏保效果(附代码下载)

    场景 效果 注: 博客主页: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 获取编程相关电子书.教程推送与免费下载. 实现 新建form ...

  3. html5 滚屏效果 插件,jQuery插件fullPage.js实现全屏滚动效果

    本文实例为大家分享了全屏滚动插件fullPage.js的具体使用方法,供大家参考,具体内容如下 0.01 基本演示  的HTML 布局 以及js 代码 //需要连接 连接的三个文件 //css文件 / ...

  4. 电脑屏保海底世界_一款电脑桌面锁屏软件:梦幻水族馆(好多鱼)

    DreamAquarium是一款非常炫酷的虚拟水族馆和屏幕保护程序,它以无与伦比的逼真度将郁郁葱葱的淡水水族馆的美丽带入您的电脑.该程序展示了这些虚拟居民:鱼的惊人逼真的行为和动作.这些不是真正的鱼! ...

  5. win10 SystemParametersInfo 设置屏保 不好使_抖音爆火的电子时钟罗盘屏保怎么搞呢?!...

    导语: 视频里面出现的就是抖音最近火了的电子罗盘屏保 也是各位粉丝心心念念 希望出教程的 下面和大家 分享一下 首先,各位将打包好的 Word Clock 压缩包下载下来.下载之后,我们将文件进行解压 ...

  6. win10 SystemParametersInfo 设置屏保 不好使_火爆抖音的电子时钟罗盘屏保(老铁,安排上)!...

    最近抖音里火了一个屏保 没错 就是那个 数字罗盘 汉字排列的时间屏保 可还别说 看起来效果还是挺炫酷的 ◆ ◆ ◆  ◆ ◆ 话不多说 下面看安装使用教程 下载解压打开文件夹 找到应用安装程序 双击进 ...

  7. win10 SystemParametersInfo 设置屏保 不好使_黑科技学:抖音最近很火的时间罗盘屏保出电脑版了,实在太帅了...

    自古深情留不住,唯有套路存人心,大家好我是你们的黑科技老师木子李.今天小编想和大家分享一下最近很火的时间罗盘屏保,最近很多教程都是手机版,所以今天小编这出的是电脑版!动画效果那是相当的优秀.有什么需要 ...

  8. win7屏保怎么设置_酷屏保怎么设置?酷开系统不可不知的玩法!

    数码相框,在过去一段时间里很多客厅.卧室都摆放过,时至今日也还有部分家庭仍然使用播放平日的数码照片.今天编辑给大家推荐一款不一样的超大版的"数码相框"--酷开系统7.0内置的酷屏保 ...

  9. html打字并自动滚动效果,js实现键盘自动打字效果

    content="width=device-width,user-scalable=no,initial-scale=1.0,maximum-scale=1.0,minimum-scale= ...

最新文章

  1. 跟无闻学习GO Web 编程(四) -- bee 工具使用
  2. mfc 怎么让键盘上下左右控制图片移动_[源码和文档分享]基于MFC的陨石撞飞机游戏设计与实现...
  3. 使用 Python 制作属于自己的 PDF 电子书
  4. 无法启动此程序,因为计算机中丢失msvcrtd.dll,Win7打开剑灵提示“丢失d3dx10_43.dll、MSVCRTD.dll文件”怎么办?...
  5. 【云周刊】第139期:阿里年会黑科技全揭秘:IoT手环、人脸识别验票、大屏弹幕互动等“十八般武艺”轮番上阵...
  6. SpringCloud Consul自定义服务注册
  7. JVM内存管理------垃圾搜集器参数精解
  8. 利用css进行网页布局
  9. sourceinsight4.0安装破解( 内含sublime text配色方案)
  10. android 两点距离计算公式,Android 计算地球上任意两点(经纬度)距离
  11. littleVGL总结
  12. Arduino 水质检测仪(浊度、TDS、温度、电导率、吸光度、硬度)带18b20温度补偿。
  13. 计算机等级考试准考证打河南,2019年河南牧院计算机等级考试准考证打印时间...
  14. 利用Openlayers4实现地图遮罩效果(三)
  15. 往返多伦多与温莎的交通全攻略!
  16. 越来越卷,教你使用Python实现卷积神经网络(CNN)
  17. Halide学习笔记----Halide tutorial源码阅读3
  18. char s[],char *s,char **s与char *s[]
  19. server.servlet.contextPath 和 spring.mvc.servlet.path 对比
  20. Python绘制加强版K线图:增加均线及成交量

热门文章

  1. OpenAI的模型下载(chatGPT模型)
  2. 【C语言】32个关键字记忆技巧
  3. 使用阿里云的短信服务进行登录实现登录拦截的功能(前后端分离) ---- (Session存储验证码用户信息)
  4. [BZOJ4808] 马(最大独立集,最大流)
  5. 制作大白菜U盘启动盘及4G以上镜像
  6. ubuntu 安装code blocks全记录
  7. 【Houdini18.5/入门】程序化uv01-将uv壳布局在指定范围
  8. pinia的学习和理解
  9. 如何修改个人简历?一些过来人的经验
  10. matlab 堆排序