Подтвердить что ты не робот

Css calc и min-height не могут объединиться

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

HTML:

<div id="body"><div id="content">
content
</div>
</div>
<div id="footer">
    abc
</div>

CSS

#footer{
    position: absolute;
    bottom: 0;
    width: 100%;
    background: #ddd;
}
#body{
    padding: 60px 50px 70px 50px;
    position: relative;
    min-height: calc(100% - 130px);
}
#content{
    font-family: verdana;
    margin-left: 200px;
    border-left: 5px solid #ddd;
    padding: 0 0 0 10px;
    min-height: 100%;
    min-width: 500px;
}
body{
    margin:0;
    overflow-y:scroll;
    height:100%;
    position:relative;
}
html{
    height:100%;
}

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

если я изменяю min-height на height, когда содержимое короткое, я получаю то, что я хотел, но когда контент длинный, я получаю этот раздражающий макет

Кажется, что calc не может прочитать атрибут height, если он не указан (используя min-height), но если указан height, то я не могу получить динамическую высоту, есть ли какое-либо другое решение для достижения это?

PS: то, что я пытаюсь сделать, это сделать границу #content растягивается в соответствии с ее содержанием с минимальной высотой высоты страницы

примечание

Еще один странный факт: на самом деле мой текущий код работает с последними версиями хром и IE, но есть проблема с последними версиями firefox и opera. Я пытался воспроизвести проблему с помощью jsfiddle, и, к моему благоговению, у всех браузеров такая же проблема, я включил все связанные html и css (скопировали сгенерированные html и css) в jsfiddle только для того, чтобы найти, что мой код не работает вообще, я очень смущен

4b9b3361

Ответ 1

Почему бы не использовать flex boxes? Похоже, что вам нужен липкий нижний колонтитул, то есть нижний колонтитул находится внизу окна просмотра, когда контент не очень высок, но он находится внизу контента, когда содержимое превышает высоту видового экрана. Это очень похоже на дизайн святого Грааля. Вот решение HTML5 + CSS3, которое не использует JavaScript:

* {
    /* personal preference */
    margin: 0;
    padding: 0;
}
html {
    /* make sure we use up the whole viewport */
    width: 100%;
    height: 100%;
    /* for debugging, a red background lets us see any seams */
    background-color: red;
}
body {
    /* make the body a vertical flex container */
    /* https://css-tricks.com/snippets/css/a-guide-to-flexbox/ */
    display: flex;
    flex-direction: column;
    /* make sure we use the full width but allow for more height */
    width: 100%;
    min-height: 100%; /* this helps with the sticky footer */
}
main {
    /* Allow the content to grow but not shrink */
    flex-grow: 1;
    flex-shrink 0;
    /* for debugging, a blue background lets us see the content */
    background-color: skyblue;
}
footer {
    /* do not allow the footer to shrink */
    flex-shrink: 0;
    /* for debugging, a gray background lets us see the footer */
    background-color: gray;
}
<main>
    <p>This is the content. Resize the viewport vertically to see how the footer behaves.</p>
    <p>This is the content.</p>
    <p>This is the content.</p>
    <p>This is the content.</p>
    <p>This is the content.</p>
    <p>This is the content.</p>
    <p>This is the content.</p>
    <p>This is the content.</p>
    <p>This is the content.</p>
    <p>This is the content.</p>
</main>
<footer>
    <p>This is the footer. Resize the viewport horizontally to see how the height behaves when text wraps.</p>
    <p>This is the footer.</p>
</footer>

Ответ 2

В нашем conv вы можете установить min-height, чтобы он заполнил область просмотра для нижнего колонтитула, но по мере того, как контент растет, содержимое div должно также - нажатие нижнего колонтитула вниз.

* { box-sizing: border-box } 
html,body { height: 100%; padding: 0; margin: 0 }
#content { min-height: 90%; outline: 1px solid blue } 
#footer { background: gray; height: 10%; }

Требуется установка минимальной высоты с использованием процентов. Я использую режим определения размера коробки с полями, с которым легче работать, но не требуется, если вы заботитесь о более старом IE

fiddle