如何解决div里面不能放three.js动画
当我将使用three.js 完成的动画放在body
上时,效果非常好。
当我尝试将动画放入 div
时出现问题。我整天都在尝试,但无法正常工作。与将动画放在 body
上的那个版本相比,我在 js 文件中唯一更改的是这一行:从 document.body.appendChild(container);
到 document.getElementById('for_three').appendChild(container);
。如果我在 js 文件中将 document.getElementById('for_three').appendChild(container);
改回 document.body.appendChild(container);
并切出这个 <div id="for_three"></div>
的 html 文件,那么动画会放在 body
上并且工作得很好。但我不希望它在 body
上,我希望它在 div
内。
我无法用代码片段(完整的three.js文件)发布这个问题,因为帖子太长了。但是代码和this one完全一样。
html 文件:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Three.js animation</title>
<style>
body { margin: 0; }
</style>
<link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
<script src="three.js"></script>
<div id="for_three"></div>
</body>
</html>
css 文件:
#for_three {
position: absolute;
width: 50%;
height: 50%;
margin-top: 10%;
margin-left: 25%;
background-color: bisque;
}
js文件:
// three.js - https://github.com/mrdoob/three.js
var SEPARATION = 100,AMOUNTX = 100,AMOUNTY = 70;
var container;
var camera,scene,renderer;
var particles,particle,count = 0;
var mouseX = 85,mouseY = -342;
var windowHalfX = window.innerWidth / 2;
var windowHalfY = window.innerHeight / 2;
init();
animate();
function init() {
container = document.createElement('div');
document.getElementById('for_three').appendChild(container);
camera = new THREE.PerspectiveCamera(120,window.innerWidth / window.innerHeight,1,10000);
camera.position.z = 1000;
scene = new THREE.Scene();
particles = new Array();
var PI2 = Math.PI * 2;
var material = new THREE.ParticleCanvasMaterial({
color: 0x000000,program: function(context) {
context.beginPath();
context.arc(0,.6,PI2,true);
context.fill();
}
});
var i = 0;
for (var ix = 0; ix < AMOUNTX; ix++) {
for (var iy = 0; iy < AMOUNTY; iy++) {
particle = particles[i++] = new THREE.Particle(material);
particle.position.x = ix * SEPARATION - ((AMOUNTX * SEPARATION) / 2);
particle.position.z = iy * SEPARATION - ((AMOUNTY * SEPARATION) / 2);
scene.add(particle);
}
}
renderer = new THREE.CanvasRenderer();
renderer.setSize(window.innerWidth,window.innerHeight);
container.appendChild(renderer.domElement);
document.addEventListener('mousemove',onDocumentMouseMove,false);
document.addEventListener('touchstart',onDocumentTouchStart,false);
document.addEventListener('touchmove',onDocumentTouchMove,false);
window.addEventListener('resize',onWindowResize,false);
}
function onWindowResize() {
windowHalfX = window.innerWidth / 2;
windowHalfY = window.innerHeight / 2;
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize(window.innerWidth,window.innerHeight);
}
function onDocumentMouseMove(event) {
mouseX = event.clientX - windowHalfX;
mouseY = event.clientY - windowHalfY;
}
function onDocumentTouchStart(event) {
if (event.touches.length === 1) {
event.preventDefault();
mouseX = event.touches[0].pageX - windowHalfX;
mouseY = event.touches[0].pageY - windowHalfY;
}
}
function onDocumentTouchMove(event) {
if (event.touches.length === 1) {
event.preventDefault();
mouseX = event.touches[0].pageX - windowHalfX;
mouseY = event.touches[0].pageY - windowHalfY;
}
}
function animate() {
requestAnimationFrame(animate);
render();
}
function render() {
camera.position.x += (mouseX - camera.position.x) * .05;
camera.position.y += (-mouseY - camera.position.y) * .05;
camera.lookAt(scene.position);
var i = 0;
for (var ix = 0; ix < AMOUNTX; ix++) {
for (var iy = 0; iy < AMOUNTY; iy++) {
particle = particles[i++];
particle.position.y = (Math.sin((ix + count) * 0.3) * 50) + (Math.sin((iy + count) * 0.5) * 50);
particle.scale.x = particle.scale.y = (Math.sin((ix + count) * 0.3) + 1) * 2 + (Math.sin((iy + count) * 0.5) + 1) * 2;
}
}
renderer.render(scene,camera);
count += 0.1;
}
提前致谢。
解决方法
问题在于您正在之前在文档中创建 <div id="for_three"></div>
之前执行脚本。因此,当您的脚本尝试查找 div 时,它还不存在。这是因为浏览器从上到下读取您的 HTML。只需更改顺序,使您的 <script>
标记位于文档末尾:
<body>
<div id="for_three"></div>
<script src="three.js"></script>
</body>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。