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


у меня есть следующая структура:

<body>
    <div id="main-wrapper">
        <header>
        </header>
        <nav>
        </nav>
        <article>
        </article>
        <footer>
        </footer>
    </div>
</body>

Я динамически загружаю содержимое в <article> С помощью javascript. Из-за этого, высота <article> блок может меняться.

Я хочу <footer> блок, чтобы быть в нижней части страницы, когда есть много контента, или в нижней части окна браузера, когда существует только несколько строк контента.

на данный момент я могу сделать одно или другое... но не оба.

так кто-нибудь знает, как я можете это сделать-получите <footer> придерживаться нижней части страницы/контента или нижней части экрана, в зависимости от того, что ниже.

4 73

4 ответа:

липкий нижний колонтитул Райана Фейта очень приятно, однако я считаю, что его основная структура отсутствует*.

моя базовая структура выбор:

<div class="page">
  <div class="page__inner">
    <header class="header">
      <div class="header__inner">
      </div>
    </header>
    <nav class="nav">
      <div class="nav__inner">
      </div>
    </nav>
    <main class="wrapper">
      <div class="wrapper__inner">
        <div class="content">
          <div class="content__inner">
          </div>
        </div>
        <div class="sidebar">
          <div class="sidebar__inner">
          </div>
        </div>
      </div>
    </main>
    <footer class="footer">
      <div class="footer__inner">
      </div>
    </footer>
  </div>
</div>

что не так уж далеко от:

<div id="main-wrapper">
    <header>
    </header>
    <nav>
    </nav>
    <article>
    </article>
    <footer>
    </footer>
</div>

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

HTML:
<div id="main-wrapper">
    ...
    <footer>
    </footer>
</div>
CSS:
#main-wrapper {
    padding: 0 0 100px;
    position: relative;
}

footer {
    bottom: 0;
    height: 100px;
    left: 0;
    position: absolute;
    width: 100%;
}

#main-wrapper {
  padding: 0 0 100px;
  position: relative;
}

footer {
  bottom: 0;
  height: 100px;
  left: 0;
  position: absolute;
  width: 100%;
}

header {
  background-color: #F00;
}
nav {
  background-color: #FF0;
}
article {
  background-color: #0F0;
}
footer {
  background-color: #00F;
}
<div id="main-wrapper">
   <header>
     here be header
   </header>
   <nav>
   </nav>
   <article>
     here be content
   </article>
   <footer>
     here be footer
   </footer>
</div>

с нижним колонтитулом, привязанным к #main-wrapper, теперь нужно #main-wrapper быть по крайней мере высотой страницы, если ее дочерние элементы не длиннее. Это делается путем создания #main-wrapper есть min-height на 100%. Вы также должны помнить, что его родители,html и body нужно быть таким же высоким, как страницы как что ж.

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

#main-wrapper {
    min-height: 100%;
    padding: 0 0 100px;
    position: relative;
}

footer {
    bottom: 0;
    height: 100px;
    left: 0;
    position: absolute;
    width: 100%;
}

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

#main-wrapper {
  min-height: 100%;
  padding: 0 0 100px;
  position: relative;
}

footer {
  bottom: 0;
  height: 100px;
  left: 0;
  position: absolute;
  width: 100%;
}

header {
  background-color: #F00;
}
nav {
  background-color: #FF0;
}
article {
  background-color: #0F0;
}
footer {
  background-color: #00F;
}
 <div id="main-wrapper">
   <header>
     here be header
   </header>
   <nav>
   </nav>
   <article>
     here be content
   </article>
   <footer>
     here be footer
   </footer>
</div>

конечно, вы должны подвергать сомнению мое мнение, так как этот код заставляет нижний колонтитул падать с нижней части страницы, даже когда нет контента. Последний трюк заключается в изменении модели коробки, используемой #main-wrapper так что min-height на 100% включает в себя 100px обивка.

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

#main-wrapper {
    box-sizing: border-box;
    min-height: 100%;
    padding: 0 0 100px;
    position: relative;
}

footer {
    bottom: 0;
    height: 100px;
    left: 0;
    position: absolute;
    width: 100%;
}

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

#main-wrapper {
  box-sizing: border-box;
  min-height: 100%;
  padding: 0 0 100px;
  position: relative;
}

footer {
  bottom: 0;
  height: 100px;
  left: 0;
  position: absolute;
  width: 100%;
}

header {
  background-color: #F00;
}
nav {
  background-color: #FF0;
}
article {
  background-color: #0F0;
}
footer {
  background-color: #00F;
}
 <div id="main-wrapper">
   <header>
     here be header
   </header>
   <nav>
   </nav>
   <article>
     here be content
   </article>
   <footer>
     here be footer
   </footer>
</div>

и там у вас есть это, липкий нижний колонтитул с оригинальной структурой HTML. Просто убедитесь, что footer ' s height равна #main-wrapper ' s padding-bottom, и вы должны быть установлены.


Версия Flexbox

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

трюк, чтобы получить нижние колонтитулы, чтобы придерживаться дна с flexbox должен иметь другие элементы в том же контейнере flex вертикально. Все, что требуется, это полноразмерный элемент обертки с display: flex и по крайней мере один брат с flex значение больше 0:

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

#main-wrapper {
  display: flex;
  flex-direction: column;
  min-height: 100%;
}

article {
  flex: 1;
}

html,
body {
  height: 100%;
  margin: 0;
  padding: 0;
}
#main-wrapper {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
      -ms-flex-direction: column;
          flex-direction: column;
  min-height: 100%;
}
article {
  -webkit-box-flex: 1;
      -ms-flex: 1;
          flex: 1;
}
header {
  background-color: #F00;
}
nav {
  background-color: #FF0;
}
article {
  background-color: #0F0;
}
footer {
  background-color: #00F;
}
<div id="main-wrapper">
   <header>
     here be header
   </header>
   <nav>
   </nav>
   <article>
     here be content
   </article>
   <footer>
     here be footer
   </footer>
</div>

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

липкий нижний колонтитул Райана Фейта простое решение, которое я использовал несколько раз в прошлом.

базовый HTML:

<div class="wrapper">
    <div class="header">
        <h1>CSS Sticky Footer</h1>
    </div>
    <div class="content"></div>
    <div class="push"></div>
</div>
<div class="footer"></div>

CSS:

* {
    margin: 0;
}
html, body {
    height: 100%;
}
.wrapper {
    min-height: 100%;
    height: auto !important;
    height: 100%;
    margin: 0 auto -142px; /* the bottom margin is the negative value of the footer's height */
}
.footer, .push {
    height: 142px; /* .push must be the same height as .footer */
}

/*

Sticky Footer by Ryan Fait
http://ryanfait.com/

*/

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

HTML:

<body>
    <div class="wrapper">
        <header>
        </header>
        <nav>
        </nav>
        <article>
        </article>
        <div class="push"></div>
    </div>
    <footer>
    </footer>
</body>

CSS:

* {
    margin: 0;
}
html, body {
    height: 100%;
}
.wrapper {
    min-height: 100%;
    height: auto !important;
    height: 100%;
    margin: 0 auto -142px; /* the bottom margin is the negative value of the footer's height */
}
footer, .push {
    height: 142px; /* .push must be the same height as .footer */
}

просто не забудьте обновить негатив на поле обертки чтобы соответствовать высоте вашего нижнего колонтитула и нажмите div. Удачи вам!

Я думаю, что ниже 2 строк в css должно быть достаточно, чтобы получить то, что вы хотите.

#footer 
{ 
    position: relative ;
    bottom: 0;
}

это сработало для меня.

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