Фиксированный верхний/нижний колонтитул + высота содержимого 100% вызывают нежелательную вертикальную прокрутку

Я пытаюсь создать сайт с горизонтальной прокруткой с фиксированным верхним и нижним колонтитулом.

Цели: 1. Исправлены верхний и нижний колонтитулы. 2. Нет вертикальной прокрутки. 3. Раздел содержимого заполняет все пространство между верхним и нижним колонтитулами.

Я использовал position: absolute в содержимом, чтобы убедиться, что высота: 100% занимает область между заголовком и нижним колонтитулом. (моя третья цель) Однако это также приводит к появлению вертикальной полосы прокрутки.

живая демонстрация: http://jsfiddle.net/wQ2XR/230/

как я могу достичь своих целей без появления вертикальной полосы прокрутки?

Заранее большое спасибо!

HTML-код:

    <div id="total">
        <header id="1">
            <div id="a">
                    <h1>Header</h1>

            </div>
        </header>

        <div id="2">
            <div id="b">
                <div id="bb">
                    <h2>Post Title Example One</h2> 
                <p>hello world! Have you thoroughly searched for an answer before asking your question? </p>
                </div>
            </div>
        </div>
        <footer id="3">
            <div id="c">
                    <h1>footer</h1>

            </div>
        </footer>
    </div>

CSS:

body, html {
    height: 100%;
    padding: 0;
    margin: 0;
}
body {
    width: 100%;
}

header {
}

#a {
    position: fixed;
    height: 50px;
    top: 0;
    width: 100%;
    background-color: blue;
}

 #2 {
    position: relative;
    padding: 50px 0 25px 0;
}

#b {
    height: 100%;
    position: absolute;
}

#bb {
    position: relative;
    height: 100%;
    margin: 50px 0 0 0;
    width: 2000px;
    background-color: yellow;
}

 footer {
}

#c {
    position: fixed;
    height: 25px;
    bottom: 0;
    width: 100%;
    background-color: green;
}

person user2676260    schedule 13.08.2013    source источник


Ответы (2)


Хм, проблема в том, что обертки вокруг вашего контента между верхним и нижним колонтитулами занимают высоту области просмотра с height:100%. Таким образом, когда вы применяете поле для вертикального смещения этих оберток контента (чтобы заголовок стал видимым), они перемещаются намного ниже области просмотра (50 пикселей, высота заголовка). В результате вы получаете вертикальную полосу прокрутки, так как обертки содержимого занимают всю высоту области просмотра и сдвинуты вниз, поэтому они не помещаются на экране.

Как этого избежать? Что ж, если высота нижнего колонтитула и верхнего колонтитула не будет динамической (т. е. вы всегда будете контролировать их высоту с помощью CSS), вы можете добиться этого довольно простым способом с помощью position:absolute.

Вашу структуру я немного изменил; Я удалил элементы #2 и #b, так как похоже, что они были там только для правильного позиционирования/размера #bb, фактического элемента, содержащего контент:

<div id="total">
    <header id="1">
        <div id="a">
            <h1>Header</h1>
        </div>
    </header>
    <div id="bb">
        <h2>Post Title Example One</h2> 
        <p>hello world! Have you thoroughly searched for an answer before asking your question?</p>
    </div>
    <footer id="3">
        <div id="c">
            <h1>footer</h1>
        </div>
    </footer>
</div>

Теперь с помощью вашего CSS я удалил определения стилей #2 и #b. Кроме того, я изменил #bb CSS, чтобы он читался как:

#bb {
    position: absolute;
    top: 50px;
    bottom: 25px;
    width: 2000px;
    background-color: yellow;
}

Вот обновленный JSFiddle, чтобы продемонстрировать, чего можно добиться. Кроме того, вот JSFiddle, реализующий ваш макет с несколькими строками, который вы дали в качестве комментария в одном из ответов. .

Причина, по которой overflow:hidden не совсем работает, заключается в том, что #bb на самом деле все еще простирается ниже области просмотра - просто не будет создана вертикальная полоса прокрутки, потому что эта область переполнения игнорируется браузером. Однако, когда вы используете высоту в процентах, становится очевидным, что высота #bb не та, которая видна. В любом случае, надеюсь, что это поможет! Если это не то, что вы искали, дайте мне знать, и я буду рад помочь в дальнейшем. Удачи!

person Serlite    schedule 13.08.2013
comment
Точно! Спасибо. Параллельно с вами я придумал следующее решение. Который на самом деле длиннее и отличается: jsfiddle.net/wQ2XR/237. Работа с отступами (таким образом, необходимо установить 100% высоты bb) и удаление цвета фона. Это работает только тогда, когда вы применяете рамку к bb. Вы знаете, почему это (особенно бордюр)? В любом случае я реализую ваше решение, так как оно короче;) - person user2676260; 13.08.2013
comment
Рад, что смог помочь! И это интересное решение с использованием рамки. Причина, по которой это работает, заключается в том, что при установке box-sizing:border-box на #bb это означает, что его отступ вычисляется в его высоте, поэтому height:100% позволяет ему быть высотой окна просмотра, даже с отступом. Когда вы вставляете свои элементы .row, доступная высота для их расширения равна высоте #bb минус его отступы. Отступ #bb скрыт за нижним колонтитулом и заголовком, а элементы .row расширяются, чтобы заполнить пространство между ними. Надеюсь, это было понятно! Комментариев немного мало для ответов... - person Serlite; 13.08.2013
comment
Я понял ваше объяснение. Это явно то, что он делает. Рамка имени для меня предполагает, что это рамка вокруг границы, поэтому моя интуиция подсказывает мне, что она помещает рамку за пределами заполнения (где проходит граница). Эффективное поле, которое остается (после вызова этого в моем css), - это поле - это все внутри заполнения (как вы упомянули). Явно не то, что вы ожидаете из первых рук. Я рад, что это работает так, как оно работает, если честно, это может пригодиться когда-нибудь. Спасибо за вашу помощь! Вы спасли день. - person user2676260; 14.08.2013

Чтобы скрыть полосу прокрутки, используйте:

overflow: hidden;

Однако текст должен куда-то идти (иначе он будет скрыт), поэтому вам нужно увеличить контейнер или использовать текстовые столбцы.

Собираетесь ли вы добиться чего-то вроде пользовательского интерфейса Windows 8 Metro для прокрутки?

person Sorin    schedule 13.08.2013
comment
Спасибо за ответ! Ваше предложение решило часть моей проблемы, но чтобы показать вам остальное, мы должны копнуть немного глубже. Я обновил свой пример для вас: jsfiddle.net/wQ2XR/234 ‹br› Как видите я как бы собираюсь использовать пользовательский интерфейс в стиле Metro (вы правильно догадались!) с 3 строками с высотой, установленной на 33%. Полоса прокрутки исчезла. Но нижняя строка, хотя в css установлена ​​высота: 33%, не будет отставать от других строк. Решение этого полностью решит мою проблему! Вы знаете, как это сделать? - person user2676260; 13.08.2013