Колонтитул внизу сторінки або вмісту, залежно від того, що нижче


92

У мене така структура:

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

Я динамічно завантажую вміст за <article>допомогою JavaScript. Через це висота <article>блоку може змінюватися.

Я хочу, щоб <footer>блок знаходився внизу сторінки, коли багато вмісту, або внизу вікна браузера, коли існує лише кілька рядків вмісту.

На даний момент я можу зробити те чи інше ... але не те й інше.

Тож хто-небудь знає, як я можу це зробити - нехай <footer>дотримується нижньої частини сторінки / вмісту або нижньої частини екрана, залежно від того, яка нижча.


Чи хотіли б люди прокоментувати, чому вони проголосували за 2-річне питання?
Буде

Давай, минуло майже 6 років ...
Буде

Відповіді:


99

Клейкий нижній колонтитул Райана Фейта дуже приємний, проте я вважаю, що його основної структури бракує *.


Версія Flexbox

Якщо вам пощастило, що ви можете використовувати flexbox, не потребуючи підтримки старих браузерів, липкі колонтитули стають тривіально простими та підтримують нижній колонтитул динамічного розміру.

Фокус у тому, щоб колонтитули прилипали до дна за допомогою flexbox, полягає в тому, щоб інші елементи в тому ж контейнері згиналися вертикально. Для цього потрібен лише елемент обгортки на всю висоту з 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;
}


Якщо ви не можете використовувати flexbox, моя основна структура вибору:

<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, тепер вам потрібно #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%;
}

Звичайно, ви повинні поставити під сумнів моє судження, оскільки цей код змушує нижній колонтитул падати внизу сторінки, навіть коли вмісту немає. Останній фокус полягає в тому, щоб змінити модель коробки, яка використовується таким #main-wrapperчином, щоби min-heightof 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. Просто переконайтесь, що footer's heightдорівнює #main-wrapper' padding-bottom, і ви повинні бути встановлені.


* Причиною того, що я виявляю недолік у структурі Fait, є те, що вона встановлює елементи .footerand .headerна різні ієрархічні рівні, додаючи непотрібний .pushелемент.


Мені потрібно було додати #main-wrapper *:first-child { margin-top: 0; }, інакше сторінка була б занадто довгою на верхньому полі першої дитини (спричиняючи непотрібну смугу прокрутки на коротких сторінках).
Флоріан Брукер

Дякую, @zzzzBov за це ґрунтовне пояснення, і особливо за згадку про flex-direction (хоч би я знайшов це раніше - заощадив би пару годин! :)
ea0723,

Версія Flexbox не працює для мене в IE11, але інший підхід мені підходить! Дякую та +1!
Matt

@Matt, вам потрібно використовувати префікси браузера, щоб змусити flexbox працювати в IE11. використовуйте такий інструмент, як автопрефікс, і вам ніколи не доведеться турбуватися про додавання їх вручну.
zzzzBov

2
Здається, липке посилання на нижній колонтитул порушено через перетворення його сайту на повідомлення In Memoriam для нього. Крім того, немає кешованих версій через налаштування robots.txt
tzrlk

13

Клейкий колонтитул Райана Фейта - це просте рішення, яке я використовував кілька разів раніше.

Основний 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. Удачі!


4
Мені подобається те, як він розмістив коментар внизу, що підходить для нижнього колонтитулу: D
Привид

Не потрібно змінювати розмітку для цього конкретного стилю.
zzzzBov

@zzzzBov У мене зараз не так багато часу, щоб розглянути це, але що саме ти маєш на увазі?
Джош Мейн,

Я перебуваю у своєму мобільному банкоматі, тому не можу написати повну відповідь, інакше я б це вже зробив. Коментар був більше, тому я не забуду додати відповідь пізніше.
zzzzBov

@JoshMein, я додав відповідь, яка пояснює, як закріпити нижній колонтитул, не заважаючи наданій структурі.
zzzzBov

0

Я прагнув вирішити цю проблему, не додаючи жодної додаткової розмітки, тому в підсумку застосував таке рішення:

article {
  min-height: calc(100vh - 150px); /* deduct the height or margins of any other elements within wrapping container*/
}

footer {
  height: 50px;
}

header {
   height: 50px;
}

nav {
  height: 50px;
}
<body>
  <div id="main-wrapper">
    <header>
    </header>
    <nav>
    </nav>
    <article>
    </article>
    <footer>
    </footer>
  </div>
</body>

Ви повинні знати висоту верхнього, нижнього та нижнього колонтитулів, щоб мати можливість встановити мінімальну висоту для статті. Таким чином, якщо стаття має лише кілька рядків вмісту, нижній колонтитул буде прилипати до нижньої частини вікна браузера, інакше він буде опускатися нижче всього вмісту.

Ви можете знайти це та інші рішення, розміщені вище тут: https://css-tricks.com/couple-takes-sticky-footer/

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.