Проблема с полноэкранным режимом Three.js

Я прочитал API Three.js, прочитал вопросы здесь, в StackOverflow, я отладил код с помощью отладчика firebug и chrome, я вырезал все, что мог, но все еще получаю эту раздражающую полноэкранную ошибку , где порт просмотра средства визуализации больше моего экрана, поэтому появляются полосы прокрутки. Это видимая ошибка, которая не влияет на рендеринг или другие операции. Я просто пытаюсь контролировать размер порта просмотра, чтобы он соответствовал доступной площади экрана без появления полос прокрутки.

Я использую Google Chrome 18 в Windows 7, и я только начинаю работать с 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 );

}

Он отображается нормально, я вижу вращающуюся рамку красного каркаса, но я заметил, что порт просмотра средства визуализации слишком большой, он больше, чем мой доступный размер экрана, что вызывает появление полос прокрутки. В коде используются window.innerWidth и window.innerHeight для установки соотношения сторон и ширины / высоты для средства визуализации, но кажется, что он берет где-то от 20 до 30 дополнительных пикселей и добавляет их внизу и справа на странице?

Я попытался настроить CSS для элемента body, чтобы удалить поля и отступы, то же самое для создаваемого элемента холста, но ничего. Я повторил размер экрана на странице и создал функции JavaScript alert() для проверки ширины и высоты окна, а затем смотрел, как они передаются в API Three.js во время выполнения операций, но ошибка остается: объект рендеринга холста изменяет свой размер до немного большего размера, чем размер экрана. Ближе всего к решению проблемы я могу сделать что-то вроде этого:

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());

Он работает, чтобы приблизить размер средства визуализации к границам окна, но только до определенной точки. Если я уменьшу val до менее 7, например 6 или меньше, размер рендерера снова появляется и снова становится больше на 20 пикселей (приблизительно), чем экран, в результате чего появляются полосы прокрутки?

Есть мысли или идеи?


person hypervisor666    schedule 03.05.2012    source источник


Ответы (4)


Просто установите display: block; в элементе холста в вашем CSS.

Элемент <canvas>, согласно сети разработчиков Mozilla, официально является элементом уровня блока < / а>. Что-то среднее между встроенным элементом и блочным элементом. Они пишут:

Браузеры обычно отображают элемент уровня блока с новой строкой как до, так и после элемента.

Но рендеринг элемента может отличаться в зависимости от браузера, поэтому, чтобы убедиться, что вы получаете правильное поведение, лучше явно установить display: inline; или display: block; в вашем CSS.

Поэтому просто установите его отображаемое значение в своем файле CSS на блокировку, чтобы решить проблему.

canvas {
    display: block; /* fix necessary to remove space at bottom of canvas */
}
person Wilt    schedule 26.03.2013
comment
Это должен быть принятый ответ - скрытие переполнения просто маскирует проблему, но это решает ее. Спасибо большое! - person ultrafez; 21.07.2014
comment
Я согласен с ultrafez, более того, при щелчке мышью по окну, даже если полоса прокрутки скрыта, контент все равно прокручивается! ... - person Charles HETIER; 25.09.2014
comment
Поскольку 4 года спустя я все еще получаю ответы на этот вопрос, я принял этот ответ, основываясь на совете ultrafez, и сообщество поддерживает этот ответ, спасибо @Wilt за предоставленный обновленный ответ! - person hypervisor666; 26.07.2016

I. Точность размера области просмотра

Я рекомендую использовать viewportSize.js Тайсона Матанича, поскольку параметры window.innerWidth и window.innerHeight не всегда точны.

Скачать: https://github.com/tysonmatanich/viewportSize

Демо: http://tysonmatanich.github.com/viewportSize/

Вот подробное объяснение автора:

«Большинство людей полагаются на window.innerWidth, document.documentElement.clientWidth или $ (window) .width (), которые не всегда точно сообщают ширину области просмотра, используемую в медиа-запросах CSS. Например, браузеры WebKit изменяют размер своего CSS область просмотра, когда полосы прокрутки видны, в то время как в большинстве других браузеров этого не происходит. Поскольку window.innerWidth остается постоянным независимо от состояния полосы прокрутки, это не лучший вариант для использования с Chrome или Safari. Кроме того, Internet Explorer 6, 7 и 8 не поддерживают window.innerWidth. С другой стороны, document.documentElement.clientWidth изменяется в зависимости от состояния полосы прокрутки и поэтому не подходит для Internet Explorer, Firefox или Opera ».

Пример :

var viewportWidth  = viewportSize.getWidth(),
    viewportHeight = viewportSize.getHeight(),
    viewportAspect = viewportWidth / viewportHeight;

camera = new THREE.PerspectiveCamera( 75, viewportAspect, 1, 10000 );

II. Неуловимые элементы

Обратите внимание на любые элементы, созданные программно (через createElement). Их легко упустить.

Используйте инспектор Chrome или Firebug, чтобы узнать, есть ли другие элементы, которые вы могли пропустить. Часто я вижу что-то, о чем я совершенно забыл, глубоко закопанный в коде прошлой недели, и удивляюсь, как, черт возьми, я это пропустил раньше.

III. Аппаратный сброс

Наконец, чтобы быть внимательным, вы можете попробовать выполнить полный сброс. Классический сброс Эрика Мейера обычно считается наиболее полным (http://meyerweb.com/eric/tools/css/reset/index.html), но лично я предпочитаю «Condensed Meyer Reset» (который появился в сети где-то в прошлом году, автор неизвестен):

body, div, dl, dt, dd, ul, ol, li, h1, h2, h3, h4, h5, h6, 
pre, form, fieldset, input, textarea, p, blockquote, th, td { 
    padding: 0;
    margin: 0;
    }
fieldset, img { 
    border: 0;
    }
table {
    border-collapse: collapse;
    border-spacing: 0;
    }
ol, ul {
    list-style: none;
    }
address, caption, cite, code, dfn, em, strong, th, var {
    font-weight: normal;
    font-style: normal;
    }
caption, th {
    text-align: left;
    }
h1, h2, h3, h4, h5, h6 {
    font-weight: normal;
    font-size: 100%;
    }
q:before, q:after {
    content: '';
    }
abbr, acronym { 
    border: 0;
    }
person David Scott Kirby    schedule 24.03.2013

В css это тоже должно помочь:

canvas {
    vertical-align: top;
}

Естественно нужны также отступы, исправления полей сверху

person ovirta    schedule 15.02.2014

Это исправленная проблема для меня. он всегда будет держать холст в полноэкранном режиме.

canvas {
    width: 100vw;
    height: 100vh;
    display: block;
  }
person paraplu    schedule 14.12.2017