как получить ориентацию: портретный режим с мета-окном просмотра с фиксированной высотой

время для моего первого собственного stackoverflowquestion, так как эта штука сводит меня с ума весь день. Сегодня я одолжил iPad, чтобы протестировать сайт, который поставляется с дополнительными телефонными и планшетными версиями. (на нем только сафари) макет представляет собой полностью статичную вещь с некоторой графикой, и они хотят, чтобы это было 1: 1. так что я узнал о мобильных устройствах, добавил

<meta name="viewport" content="width=x" />

и получил идеальную версию для телефона. но когда дело дошло до планшета, у меня возникли проблемы.

Планшет у меня вертикальный. в данном случае он имеет 477x656 пикселей. поэтому он должен подходить по высоте и хорошо отображаться на каждом планшете, покрывая весь дисплей в портретном режиме и располагаясь по центру по горизонтали в альбомном режиме.

так что я подумал, что просто поставил

<meta name="viewport" content="height=656" />

в коде, и браузер отображает это так же, как в мобильной версии, только с нашей высотой как viewport-master вместо ширины. это было бы идеальным универсальным решением, удовлетворяющим потребности клиентов так же, как и телефонная версия. (ну, конечно, разница в том, что в телефонной версии вы будете прокручивать вверх и вниз, в то время как в версии для планшета будет немного пустого места слева и справа, особенно в ландшафтном режиме.)

в основном css:

body {
    margin:0 auto;
    width:477px;
    height:656px;
}

и результат - полный провал:

  • в альбомном режиме страница отображается по вертикали больше, чем доступное пространство в браузере. (кажется, что высота здесь игнорируется)
  • в портретном режиме к тегу html добавляется огромное количество ширины, так что тег body можно увидеть только наполовину.

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

поэтому я подумал, я заставляю html-width

html { max-width:477px !important; }

или около того, но не помогло. поэтому я подумал, хорошо, забудьте об этом и обойти портретную версию, используя

html { margin:0 auto; }
@media (orientation:portrait) { html { margin:0; }}

Итак, после долгого отчаяния я обнаружил, что: добавление viewport-meta height = x переводит страницу в альбомный режим

это в основном (я думаю) из-за того, что safari вычисляет ширину области просмотра в соответствии с заданной высотой и пропорциями экрана (в ландшафтном режиме) вместо заданного html. в результате получаются альбомные пропорции даже в портретном режиме ... как ни странно. и да - это не то, что вы ожидаете, мне кажется, это ошибка браузера. или я здесь совершенно не прав, неправильно понимая всю эту штуку с окном просмотра?

so

  • как заставить браузер работать правильно? рассчитать ширину html в соответствии с моим html / css на основе моей заданной высоты?
  • и как мне отобразить всю страницу в альбомной ориентации? какого черта он больше?

любые подсказки высоко ценятся! (Я действительно физически измотан сейчас ... оказывается, что я больше не привык к программам, которые не делают то, что я ожидаю)

ммм, так вот мои тестовые сценарии, с которыми можно повозиться:

<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="height=656" />
<style>
html { background-color:#8b8b8b; }
html { width:477px !important; }

@media (orientation:landscape){
    html { margin:0 auto; background-color:#e1006e; }
    #p { display:none; }
}
@media (orientation:portrait){
    html { background-color:#8f9d6a; }
    #l { display:none; }
}

body {
    position:relative;
    background-color:#000;
    margin:0 auto;
    padding:0;
    width:477px;
    height:656px;
}
.container {
    margin:0 auto;
    width:477px;
    height:656px;
    background-color:#232529;
    color:#9bbe0a;
}
.content { padding:250px 0 0 45px; }

.footer { position:absolute; left:22px; bottom:2px; }
.footer, .footer a, .footer a:link, .footer a:visited, .footer a:hover, .footer a:active { color:#9bbe0a; }
</style>
</head>
<body>
<div class="container">
    <div class="content">
        <p>stuff</p>
        <div id="l"><b>Landscape</b></div>
        <div id="p"><b>Portrait</b></div>
        <pre>
<script type="text/javascript">
document.write(
    '\r\rw.orientation: '+window.orientation+
    '\rscreen: '+screen.width+'x'+screen.height+
    '\rbody.client: '+document.body.clientWidth+'x'+document.body.clientHeight+
    '\rw.outer: '+ window.outerWidth+'x'+window.outerHeight+
    '\rw.inner: '+ window.innerWidth+'x'+window.innerHeight+
    '\rdocEl.client: '+document.documentElement.clientWidth+'x'+document.documentElement.clientHeight
);
</script>
        </pre>
    </div>
</div>
<div class="footer"><a href="#">blah</a> | <a href="#"">blah</a></div>
</body>
</html>

person nïkö    schedule 13.03.2013    source источник


Ответы (1)


так что я устал от этого и написал javascript-хак. что возможно, так как у меня также есть фиксированная ширина на этом макете. не мой тип решения, но, черт возьми, да ... (и он не работает в Opera-mini на ipad, который я получил, так как он не предоставляет никаких полезных размеров ... - я мог бы протестировать сафари, дельфина и операмини)

document.body.style.marginLeft = Math.floor((window.innerWidth - 477) / 2) + 'px';

на всякий случай следует использовать css:

html { width:100%; }

Меня все еще интересует реальное решение. (или кто-то говорит мне, что я ошибаюсь в понимании области просмотра ... или подтверждая, что это ошибка браузера)

person nïkö    schedule 14.03.2013