Three.js全屏问题

hyp*_*666 25 javascript html5 fullscreen three.js html5-canvas

我已经阅读了Three.js API,仔细阅读StackOverflow上的问题,我使用firebug和chrome的调试器调试了代码,我已经删除了所有可能的内容,但是我仍然遇到这个令人恼火的全屏错误,渲染器视图端口大于我的屏幕,从而导致滚动条出现.这是一个可见的错误,不会影响渲染或其他操作,我只是试图控制视图端口的大小,以便它匹配可用的屏幕空间而不会出现滚动条.

我在Windows 7上使用谷歌Chrome 18,我刚刚开始使用Three.js API,但我过去使用过像OpenGL这样的东西,所以图形API并不陌生.

当我尝试运行此代码时(这是github主页上显示的默认示例):

var camera, scene, renderer,
geometry, material, mesh;

init();
animate();

function init() {

    scene = new THREE.Scene();

    camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 1, 10000 );
    camera.position.z = 1000;
    scene.add( camera );

    geometry = new THREE.CubeGeometry( 200, 200, 200 );
    material = new THREE.MeshBasicMaterial( { color: 0xff0000, wireframe: true } );

    mesh = new THREE.Mesh( geometry, material );
    scene.add( mesh );

    renderer = new THREE.CanvasRenderer();
    renderer.setSize( window.innerWidth, window.innerHeight );

    document.body.appendChild( renderer.domElement );

}

function animate() {

    // note: three.js includes requestAnimationFrame shim
    requestAnimationFrame( animate );
    render();

}

function render() {

    mesh.rotation.x += 0.01;
    mesh.rotation.y += 0.02;

    renderer.render( scene, camera );

}
Run Code Online (Sandbox Code Playgroud)

它渲染得很好,我看到红色线框框旋转,但我注意到渲染器视图端口太大,它比我可用的屏幕尺寸大,这会导致滚动条出现.代码使用window.innerWidthwindow.innerHeight设置渲染器的宽高比和宽度/高度,但似乎它在某处拾取了20到30个额外像素并将它们添加到页面的底部和右侧?

我已经尝试调整body元素的CSS以删除边距和填充,对于创建的canvas元素也是如此,但没有.我已经回显了页面的屏幕大小,并使JavaScript alert()函数检查窗口的宽度和高度,然后观察它们在运行时操作期间传递给Three.js API,但错误仍然存​​在:画布渲染对象是将自身调整为略大于屏幕尺寸.我最接近纠正问题是做这样的事情:

var val = 7;
//Trims the window size by val
function get_width(){return window.innerWidth - val;}
function get_height(){return window.innerHeight - val;}

//... Code omitted for brevity

camera = new THREE.PerspectiveCamera( 75, get_width() / get_height(), 1, 10000 );

//... Code omitted for brevity 

render.setSize(get_width(), get_height());
Run Code Online (Sandbox Code Playgroud)

它可以将渲染器大小放在窗口的边界内,但仅限于一个点.如果我降低val到小于7,例如6或更小,渲染器大小弹出并再次比屏幕大20 px(大约),导致滚动条出现?

有什么想法或想法吗?

Wil*_*ilt 56

只需设置display:block; 在CSS中的canvas元素上

<canvas>元素是根据mozilla开发者网络正式的块级元素.内联元素和块元素之间的东西.他们写:

浏览器通常在元素之前和之后使用换行符显示块级元素.

但是,元素的呈现可能因浏览器而异,因此为了确保您获得正确的行为,最好明确设置display: inline;display: block;在CSS中.

因此,只需在CSS文件中设置其显示值即可阻止,以解决问题.

canvas {
    display: block; /* fix necessary to remove space at bottom of canvas */
}
Run Code Online (Sandbox Code Playgroud)

  • 这应该是接受的答案 - 隐藏溢出只是掩盖问题,但这解决了它.非常感谢! (4认同)
  • 由于四年后我仍然对这个问题感兴趣,我根据 ultrafez 的建议接受了这个答案,并且社区对此答案的投票,感谢@Wilt 提供更新的答案! (2认同)

Jua*_*ado 7

删除CSS正文边距并隐藏溢出:

body{
  margin: 0px;
  overflow: hidden;
}
Run Code Online (Sandbox Code Playgroud)

  • 你也可以将body padding设置为0:padding:0; (2认同)