实例介绍
【实例简介】
【实例截图】
【核心代码】
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
<title>2018新地环境抽奖现场</title>
<style>
html,
body {
height: 100%;
}
body {
background-color: rgba(0, 0, 0, 0);
margin: 0;
font-family: Helvetica, sans-serif;
overflow: hidden;
}
#container {
height: 100%;
width: 100%;
background-image: url(image/stars.jpg);
background-repeat: no-repeat;
background-size: 100% 100%;
}
.fly-element {
width: 12px;
height: 7px;
box-shadow: 0px 0px 12px rgba(0, 255, 255, 0.5);
text-align: center;
cursor: default;
background-repeat: no-repeat;
background-size: 100% 100%;
transform: rotate(180deg);
}
.element,
.wins {
width: 120px;
height: 160px;
box-shadow: 0px 0px 12px rgba(0, 255, 255, 0.5);
border: 1px solid rgba(127, 255, 255, 0.25);
text-align: center;
cursor: default;
transform-style: preserve-3d;
}
.wins {
opacity: 0;
z-index: 9;
position: absolute;
top: calc(50% - 80px);
left: calc(50% - 60px);
transform: scale(1);
}
.element>.front,
.wins>.front {
position: absolute;
width: 100%;
height: 100%;
backface-visibility: hidden;
}
.element>.back,
.wins>.back {
width: 100%;
height: 100%;
background-image: url(image/back_logo.png);
background-size: 100% 100%;
background-repeat: no-repeat;
backface-visibility: hidden;
transform: rotateY(180deg);
}
.element p,
.wins p {
color: #8cb513;
font-family: '楷体';
font-size: 35px;
font-style: italic;
text-align: center;
height: 100%;
width: 100%;
font-weight: 900;
writing-mode: vertical-lr;
}
</style>
</head>
<body>
<script src="http://www.jq22.com/jquery/jquery-2.1.1.js"></script>
<script src="https://threejs.org/build/three.js"></script>
<script src="js/tween.min.js"></script>
<script src="js/TrackballControls.js"></script>
<script src="js/CSS3DRenderer.js"></script>
<div id="container"></div>
<script>
var staffs = [];
var wins = [];
var rs, vi, ry;
var camera, scene, renderer, controls;
var objects = [];
var targets = {
table: [],
sphere: [],
helix: [],
grid: [],
bang: [],
};
(function() {
//创建相机
camera = new THREE.PerspectiveCamera(40, window.innerWidth / window.innerHeight, 1, 10000);
camera.position.z = 3000;
//创建场景
scene = new THREE.Scene();
//渲染
renderer = new THREE.CSS3DRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.domElement.style.position = 'absolute';
document.getElementById('container').appendChild(renderer.domElement);
// 鼠标控制
controls = new THREE.TrackballControls(camera, renderer.domElement);
controls.rotateSpeed = 0.5;
controls.minDistance = 500;
controls.maxDistance = 6000;
controls.addEventListener('change', render);
startAnimate(targets.bang, true);
animate();
})();
//添加键盘监听
window.addEventListener('keydown', function(e) {
switch (e.keyCode) {
case 76: //l,幸运奖
startLottery(true);
break;
case 83: //s,开始
startLottery(false);
break;
case 32: //space,停并抽取人员
randomStaff();
lottery();
break;
default:
break;
}
});
window.addEventListener('resize', onWindowResize, false);
function startAnimate(target, rotateYOnly) {
init(target);
if (rotateYOnly) {
scene.rotation.x = 0;
scene.rotation.z = 0;
rotateY();
} else {
if (ry) cancelAnimationFrame(ry);
rotateScene();
}
}
//初始换场景
function init(target) {
if (objects.length) {
transform(objects, target, 2000);
return;
}
getStaff();
// table
for (var i = 0, l = staffs.length; i < l; i ) {
let element = createStaffDom('element', staffs[i].NAME, staffs[i].NUM);
var object = new THREE.CSS3DObject(element);
object.position.x = Math.random() * 4000 - 2000;
object.position.y = Math.random() * 4000 - 2000;
object.position.z = Math.random() * 4000 - 2000;
scene.add(object);
objects.push(object);
// 表格需要坐标进行排序的
var to = new THREE.Object3D();
to.position.x = (staffs[i].p_x * 140) - 1330;
to.position.y = -(staffs[i].p_y * 180) 990;
targets.table.push(to);
//big bang
var bo = new THREE.Object3D();
bo.position.x = object.position.x (Math.random() * 2 - 1) * 2000;
bo.position.y = object.position.y (Math.random() * 2 - 1) * 1000;
bo.position.z = object.position.z (Math.random() * 2 - 1) * 2000;
bo.rotation.x = (Math.random() * 2 - 1) * Math.PI;
bo.rotation.y = (Math.random() * 2 - 1) * Math.PI;
bo.rotation.z = (Math.random() * 2 - 1) * Math.PI;
targets.bang.push(bo);
}
// sphere
var vector = new THREE.Vector3();
var spherical = new THREE.Spherical();
for (var i = 0, l = objects.length; i < l; i ) {
var phi = Math.acos(-1 (2 * i) / l);
var theta = Math.sqrt(l * Math.PI) * phi;
var object = new THREE.Object3D();
spherical.set(800, phi, theta);
object.position.setFromSpherical(spherical);
vector.copy(object.position).multiplyScalar(2);
object.lookAt(vector);
targets.sphere.push(object);
}
// helix
var vector = new THREE.Vector3();
var cylindrical = new THREE.Cylindrical();
for (var i = 0, l = objects.length; i < l; i ) {
var theta = i * 0.225 Math.PI;
var y = -(i * 8) 450;
var object = new THREE.Object3D();
// 参数一 圈的大小 参数二 左右间距 参数三 上下间距
cylindrical.set(800, theta, y);
object.position.setFromCylindrical(cylindrical);
vector.x = object.position.x * 2;
vector.y = object.position.y;
vector.z = object.position.z * 2;
object.lookAt(vector);
targets.helix.push(object);
}
// grid
for (var i = 0; i < objects.length; i ) {
var object = new THREE.Object3D();
object.position.x = ((i % 5) * 400) - 800; // 400 图片的左右间距 800 x轴中心店
object.position.y = (-(Math.floor(i / 5) % 5) * 300) 500; // 500 y轴中心店
object.position.z = (Math.floor(i / 25)) * 200 - 800; // 300调整 片间距 800z轴中心店
targets.grid.push(object);
}
transform(objects, target || targets.helix, 2000);
}
function startLottery(lucky) {
if (lucky)
startAnimate(targets.helix, lucky);
else
startAnimate(targets.sphere, lucky);
$({
s: 1
}).animate({
s: 0
}, {
duration: 600,
step: function(n) {
$('.wins').css({
opacity: n,
transform: `scale(${n*2}) rotateY(${n*360*2}deg)`
});
},
complete: function() {
$('.wins').remove();
}
});
}
function lottery() {
let w = window.innerWidth / 2 - 120 * 1.5;
vibrate();
bigBang();
let t = setTimeout(function() {
var element = createStaffDom('wins', wins[0].NAME, wins[0].NUM, 0.7);
document.getElementById('container').appendChild(element);
$({
s: 0
}).animate({
s: 1
}, {
duration: 1500,
easing: 'swing',
step: function(n) {
$(element).css({
opacity: `${n}`,
transform: `scale(${n*2}) rotateY(${n*360*2}deg)`
})
}
});
wins = [];
clearTimeout(t);
}, 2000)
}
function getStaff() {
let w = ['赵', '钱', '孙', '李', '周', '吴', '郑', '王', '冯', '陈', '褚', '魏', '何', '吕', '施', '张', '蒋', '沈', '韩', '杨', '宇文', '欧阳', '司马', '黄埔', '诸葛', '上官'];
let d = ['大锤', '钢蛋', '铁柱', '狗蛋', '臭'];
for (var i = 0, l = w.length; i < l; i ) {
for (let j = 0, m = d.length; j < m; j) {
let num = i * j j;
staffs.push({
NAME: w[i] d[j],
NUM: num
});
staffs[num].p_x = (num) % 15 1;
staffs[num].p_y = Math.floor((num) / 15) 1;
}
}
}
function randomStaff() {
let r = randomNum(0, staffs.length - 1);
wins.push(staffs[r]);
staffs.splice(r, 1);
}
function randomNum(a, b) {
switch (arguments.length) {
case 1:
return parseInt(Math.random() * a 1);
case 2:
return parseInt(Math.random() * (b - a 1) a);
default:
return 0;
}
}
function createStaffDom(className, staffName, id, opacity) {
opacity = opacity || Math.random() * 0.5 0.25;
var element = document.createElement('div');
element.className = className;
element.style.backgroundColor = 'rgba(0,127,127,' opacity ')';
var front = document.createElement('div');
front.className = 'front';
element.appendChild(front);
var back = document.createElement('div');
back.className = 'back';
element.appendChild(back);
var p = document.createElement('p');
p.innerText = staffName;
front.appendChild(p);
return element;
}
//图形变换
function transform(origin, targets, duration) {
TWEEN.removeAll();
for (var i = 0; i < origin.length; i ) {
var object = origin[i];
var target = targets[i];
new TWEEN.Tween(object.position)
.to({
x: target.position.x,
y: target.position.y,
z: target.position.z
}, Math.random() * duration duration)
.easing(TWEEN.Easing.Exponential.InOut)
.start();
new TWEEN.Tween(object.rotation)
.to({
x: target.rotation.x,
y: target.rotation.y,
z: target.rotation.z
}, Math.random() * duration duration)
.easing(TWEEN.Easing.Exponential.InOut)
.start();
new TWEEN.Tween(object.scale).to({
x: target.scale.x,
y: target.scale.y,
z: target.scale.z
}, Math.random() * duration duration)
.easing(TWEEN.Easing.Exponential.InOut)
.start();
}
new TWEEN.Tween(this)
.to({}, duration * 2)
.onUpdate(render)
.start();
}
//监听窗体大小变化
function onWindowResize() {
if (!camera) return;
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize(window.innerWidth, window.innerHeight);
render();
}
//维持球形
function animate() {
requestAnimationFrame(animate);
TWEEN.update();
controls.update();
// 渲染循环
render();
}
//rotate the scene
function rotateScene() {
// 让场景通过x轴或者y轴旋转 & z
scene.rotation.x = 0.05;
scene.rotation.y = 0.2;
scene.rotation.z = 0.01;
rs = requestAnimationFrame(rotateScene);
controls.update();
// 渲染循环
render();
}
//rotate the scene
function rotateY() {
// 让场景通过x轴或者y轴旋转 & z
scene.rotation.y -= 0.001;
ry = requestAnimationFrame(rotateY);
controls.update();
// 渲染循环
render();
}
//抖动效果
function vibrate() {
scene.traverse(function(e) {
e.rotation.x = ((Math.random() * 0.1 0.1) * (Math.random() >= 0.5 ? 1 : -1));
e.rotation.y = ((Math.random() * 0.1 0.1) * (Math.random() >= 0.5 ? 1 : -1));
e.rotation.z = ((Math.random() * 0.1 0.1) * (Math.random() >= 0.5 ? 1 : -1));
});
vi = requestAnimationFrame(vibrate);
}
//球形爆炸
function bigBang() {
let t1 = setTimeout(function() {
cancelAnimationFrame(vi);
cancelAnimationFrame(rs);
transform(objects, targets.bang, 500);
let t2 = setTimeout(function() {
rotateY();
clearTimeout(t2);
}, 1000)
clearTimeout(t1);
}, 1500)
}
function render() {
renderer.render(scene, camera);
}
</script>
</body>
</html>
好例子网口号:伸出你的我的手 — 分享!
网友评论
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


支持(0) 盖楼(回复)