js 模擬氣泡屏保效果代碼
更新時間:2010年07月10日 01:52:40 作者:
用JavaScript實現(xiàn)的模擬氣泡屏保效果代碼,包括氣泡的碰撞效果,喜歡的朋友可以參考下。
核心代碼:
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;
};
// 靜態(tài)屬性
Screen.Config = {
ballsnum: 5, // 小球數(shù)目
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;
}
}
}
【說明】
程序效率出現(xiàn)了很大瓶頸。需要做的優(yōu)化還有很多。有時間繼續(xù)完善。
另:感謝羅浮宮群友逍遙君武和豪情對圖片的支持。
【源碼下載】
http://www.dbjr.com.cn/jiaoben/28295.html
復制代碼 代碼如下:
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;
};
// 靜態(tài)屬性
Screen.Config = {
ballsnum: 5, // 小球數(shù)目
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;
}
}
}
【說明】
程序效率出現(xiàn)了很大瓶頸。需要做的優(yōu)化還有很多。有時間繼續(xù)完善。
另:感謝羅浮宮群友逍遙君武和豪情對圖片的支持。
【源碼下載】
http://www.dbjr.com.cn/jiaoben/28295.html
相關文章
Web網(wǎng)頁對話框可拖動、關閉(自動)文字循環(huán)變化
由Js實現(xiàn)的網(wǎng)頁WEB對話框,鼠標可隨意拖動改變位置,類似于有些軟件初次運行時候彈出的每日提示,里面有文字在循環(huán)變化,時間到自動關閉,多么強大的一個web對話框啊,有興趣的朋友可以參考下啊2012-12-12javascript實現(xiàn)div的拖動并調整大小類似qq空間個性編輯模塊
qq空間的個性編輯模塊可以隨意的拖動頁面上的元素并且調動大小實現(xiàn)動態(tài)布局;這種效果的確很酷,那么我們也來實現(xiàn)一個吧2012-12-12百度手寫板代碼JavaScript遠程調用的實現(xiàn)(鼠標輸入法)
百度手寫板代碼JavaScript遠程調用的實現(xiàn),其實沒什么可參考的,引用百度的Js文件,如果大家想使用這個類的話,自己下載就行了,正好可參考一下本演示,幫你快速入題。2010-09-09