Нажмите нижний колонтитул внизу, когда страница не заполнена

Я разрабатываю мобильное веб-приложение. Это основная структура сверху вниз: заголовок div, div меню, div div, нижний колонтитул. Заголовок, меню и нижний колонтитул постоянны, а страницы загружаются в div содержимого с помощью ajax.

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

Этого я хочу достичь: если страница не заполнена содержимым, нижний колонтитул будет внизу страницы. Если страница заполнена и требуется прокрутка, нижний колонтитул будет сразу после содержимого (так что вы прокрутите страницу вниз и, в конце концов, достигнете нижнего колонтитула).

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

Так или иначе, чтобы достичь этого? Благодарю.

Ответы

Ответ 1

Затем вам нужно использовать javascript для этого - рассчитать высоту содержимого - вычесть его из высоты окна и установить верхний край нижнего колонтитула с этого расстояния:

HTML

<div id="header" class="header">Header</div>
<div id="content" class="content">Content</div>
<div id="footer" class="footer">Footer</div>

JS (В этом примере используется jQuery, он должен быть включен перед этим скриптом.)

$('#footer').css('margin-top',
  $(document).height() 
  - ( $('#header').height() + $('#content').height() ) 
  - $('#footer').height()
);

Вы можете поместить окно onresize, которое вызывает эту функцию при любом изменении размера окна.

[edit blag:]

Вот метод onResize (но с min-height а не с margin-top)

Проверьте JSFiddle

 // function to set the height on fly
 function autoHeight() {
   $('#content').css('min-height', 0);
   $('#content').css('min-height', (
     $(document).height() 
     - $('#header').height() 
     - $('#footer').height()
   ));
 }

 // onDocumentReady function bind
 $(document).ready(function() {
   autoHeight();
 });

 // onResize bind of the function
 $(window).resize(function() {
   autoHeight();
 });

Границы, отступы и поля

Если вы хотите иметь границы и дополнения, включенные в расчет, вы можете использовать outerHeight() вместо height(). Альтернативно outerHeight(true) также включает поля.

Ответ 2

CSS Sticky footer должен решить вашу проблему.

Вот пример

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

Ответ 3

    function autoHeight() {
        var h = $(document).height() - $('body').height();
        if (h > 0) {
            $('#footer').css({
                marginTop: h
            });
        }
    }
    $(window).on('load', autoHeight);

Ответ 4

Это решение сработало для меня. Я думаю, что это идеально, если у вас больше, чем только #header и #footer. Он просто подталкивает контент вниз с помощью нижней части, если тело меньше, чем область просмотра.

function autoHeight() {
    var bodyHeight = $("body").height();
    var vwptHeight = $(window).height();
    var gap = vwptHeight - bodyHeight;
    if (vwptHeight > bodyHeight) {
        $("#content").css( "padding-bottom" , gap );
    } else {
        $("#content").css( "padding-bottom" , "0" );
    }
}
$(document).ready(function() {
    autoHeight();
});
$(window).resize(function() {
    autoHeight();   
});

Ответ 5

Следующее решение работает для меня, основываясь на ответе Александра Михайлова. Он находит нижний колонтитул и определяет, меньше ли он высоты документа, и использует верхнее поле в нижнем колонтитуле, чтобы восполнить недостаток. Это решение может вызвать проблемы, если размер вашего контента изменяется на ходу.

$(function () {
    updateFooterPosition();
});

$(window).resize(function () {
    updateFooterPosition();
});

function updateFooterPosition() {
    var bottomOfFooter = $('footer').offset().top + $('footer').outerHeight(true);
    var heightShortage = $(document).height() - bottomOfFooter;
    if (heightShortage < 0) heightShortage = 0;
    $('footer').css('margin-top', heightShortage);
}