Предотвращение фиксированного нижнего колонтитула от наложения контента - PullRequest
16 голосов
/ 30 апреля 2010

Я зафиксировал нижний колонтитул DIV в нижней части области просмотра следующим образом:

#Footer
{
    position: fixed;
    bottom: 0;
}

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

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

Ответы [ 4 ]

12 голосов
/ 20 июня 2017

Современное решение «липкий нижний колонтитул» будет использовать flexbox .

tl; dr: : установите контейнер (тело) на display:flex;flex-direction:column и дочерний элемент (нижний колонтитул), который вы хотите переместить на margin-top:auto.

Во-первых, мы настроили тело так, чтобы оно "сгибало" свои элементы по вертикали, следя за тем, чтобы оно имело 100% высоты.

Затем мы устанавливаем flex: 0 0 50px для элемента нижнего колонтитула, что означает: «не расти, не сжиматься и иметь высоту 50 пикселей». На самом деле мы могли бы полностью опустить атрибут flex и просто использовать height:50px.

Мы можем безрассудно установить display:flex на такие вещи, как сам <body>, потому что у потомков гибкого контейнера есть неявное значение flex: 0 1 auto (иначе flex:initial), если оно опущено, что (почти) эквивалентно flex:none (сокращение от flex:0 0 auto):

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

Что касается липкой части, то это нижний колонтитул margin-top:auto дает нам то, что мы хотим. Применяемые в гибком контейнере, автоматические поля приобретают новое значение, вместо обычного «получить равное количество свободного пространства» они означают «поглощать ВСЕ доступное свободное пространство».

Из спецификации ( 8.1. Выравнивание с автоматическими полями ):

До выравнивания через justify-content и align-self, любое положительное свободное пространство распределяется по автоматическим полям в этом измерении.

Заявлено больше просто :

Если вы примените автоматические поля к гибкому элементу, этот элемент будет автоматически расширить указанную границу, чтобы занять дополнительное пространство в flex контейнер

В сторону: «нормальный» подход к макету флексбокса, вероятно, будет заключаться в том, чтобы сгибать среднюю секцию от <div id="main>...</div> до 100% по вертикали, что также сделает нижний колонтитул "прилипшим" к основанию. Этот подход показывает нам, что гибкая блочная модель, на самом деле, достаточно гибкая, чтобы позволить нам изменять размеры / перемещать отдельные элементы.

body {
  display: flex;
  flex-direction: column;
  min-height: 100vh;
}

#footer {
  background-color: #efefef;
  flex: 0 0 50px;/*or just height:50px;*/
  margin-top: auto;
}
<p>we've assumed only that there's random space-taking content above the footer...</p>

<p>lorem ipsum dolor flex...</p>
<div>
  <p>random content.</p><p>random content.</p><p>random content.</p><p>random content.</p>
</div>
<div id="footer">FOOTER</div>
4 голосов
/ 20 июня 2017

Проблема в том, что позиция fixed выводит ее из потока документов.Вы можете добавить margin-bottom к содержанию тела, равному высоте #Footer.Это гарантирует, что за нижним колонтитулом всегда будет свободное пространство, равное его высоте, и оно не будет перекрывать содержимое.

0 голосов
/ 09 июля 2017

Это еще одно решение, которое я использую с помощью jQuery. Чтобы настроить его, вам не нужно много кодировать, а вам нужен только HTML.

<!doctype html>
<html>

<head>
  <meta charset="utf-8">
  <title>Your title</title>
  <link rel="stylesheet" href="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.css">
  <script src="https://code.jquery.com/jquery-1.11.3.min.js"></script>
  <script src="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.js"></script>
</head>

<body>
  <div data-role="page">
    <div data-role="header" data-position="fixed">
      <h1>Your Header</h1>
    </div>
    <div data-role="main" class="ui-content">
      <p style="font-size: 300%;">
         Some text to enable scrolling... 
        Some text to enable scrolling... 
        Some text to enable scrolling... 
        Some text to enable scrolling... 
        Some text to enable scrolling... 
        Some text to enable scrolling... 
        Some text to enable scrolling... 
        Some text to enable scrolling... 
        Some text to enable scrolling... 
        Some text to enable scrolling... 
        Some text to enable scrolling... 
        Some text to enable scrolling... 
        Some text to enable scrolling... 
        Some text to enable scrolling... 
        Some text to enable scrolling... 
        Some text to enable scrolling... 
        Some text to enable scrolling... 
        Some text to enable scrolling... 
        Some text to enable scrolling... 
        Some text to enable scrolling... 
        Some text to enable scrolling... 
        Some text to enable scrolling... 
        Some text to enable scrolling... 
        Some text to enable scrolling... 
        Some text to enable scrolling... 
        Some text to enable scrolling... 
        Some text to enable scrolling... 
        Some text to enable scrolling... 
        Some text to enable scrolling... 
        Some text to enable scrolling... 
        Some text to enable scrolling... 
        Some text to enable scrolling... 
        Some text to enable scrolling... 
        Some text to enable scrolling... 
        Some text to enable scrolling... 
        Some text to enable scrolling... 
        Some text to enable scrolling... 
        Some text to enable scrolling... 
        Some text to enable scrolling... 
        Some text to enable scrolling... 
        Some text to enable scrolling... 
        Some text to enable scrolling... 
        Some text to enable scrolling... 
        Some text to enable scrolling... 
        Some text to enable scrolling... 
        Some text to enable scrolling... 
        Some text to enable scrolling... 
        Some text to enable scrolling... 
        Some text to enable scrolling... 
      </p>
    </div>
    <div data-role="footer" data-position="fixed">
      <h1>Your Footer</h1>
    </div>
  </div>
</body>

</html>

Это из w3schools - фиксированные панели инструментов , но я подумал, что это может быть более полезным, чем некоторые другие ответы.

0 голосов
/ 13 мая 2017

Попробуйте установить статический атрибут вашего положения

position: static;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...