Як створити липкий нижній колонтитул, який добре грає з Bootstrap 3


76

З верхньою навігацією або без неї дуже часто сайти мають липкий нижній колонтитул. Bootstrap має можливість легко створювати фіксовані колонтитули, але такої можливості для створення липких колонтитулів немає - є велика різниця.

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

За іронією долі, сама сторінка документації Bootstrap має липкий нижній колонтитул поряд із стилем bootstrap та фіксованою верхньою панеллю навігації. Це все власний css, а не частина фреймворку. Тож очевидний шлях полягає у використанні та реконструкції їхнього власного стилю, оскільки він, очевидно, добре працює в рамках Bootstrap, але це здається більш болючим, ніж це повинно бути.

Див. Цей plunkr для прикладу сторінки з верхньою панеллю навігації Bootstrap та небажаним, не липким колонтитулом.

Проблема:

(Спасибі Softlayer - за графіку )

Нелипкий нижній колонтитул досить потворний

Бажане рішення:

Внизу завжди є липкий колонтитул

Звичайно, нижній колонтитул також повинен бути чуйним та зручним для перегляду браузера ...


2
Ви насправді пробували використовувати документацію або приклад \ шаблон ? якщо так, опублікуйте свій код ...
Schmalzy

@Schmalzy - Дякую, це допомогло. Я створив plnkr із прикладу, на який ви посилалися вище. plnkr.co/edit/4OH2ZL?p=preview
Роберт Крістіан

Відповіді:


77

Відповідь, як зазначає Шмальзі, можна знайти тут, у розділі прикладів на сайті getbootstrap.

Але цей приклад не включає верхню навігацію. Відомості про фіксовану верхню навігацію з липким колонтитулом див. У цьому plnkr або коді нижче.

Стиль CSS:

/* Styles go here */

/* Sticky footer styles
-------------------------------------------------- */

html,
body {
  height: 100%;
  /* The html and body elements cannot have any padding or margin. */
}

/* Wrapper for page content to push down footer */
#wrap {
  min-height: 100%;
  height: auto;
  /* Negative indent footer by its height */
  margin: 0 auto -60px;
  /* Pad bottom by footer height */
  padding: 0 0 60px;
}

/* Set the fixed height of the footer here */
#footer {
  height: 60px;
  background-color: #f5f5f5;
}


/* Custom page CSS
-------------------------------------------------- */
/* Not required for template or sticky footer method. */

.container {
  width: auto;
  max-width: 680px;
  padding: 0 15px;
}
.container .credit {
  margin: 20px 0;
}

Index.html:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta name="description" content="">
    <meta name="author" content="">
    <link rel="shortcut icon" href="../../docs-assets/ico/favicon.png">

    <title>Sticky Footer Template for Bootstrap</title>

    <!-- Bootstrap core CSS -->
    <link href="//netdna.bootstrapcdn.com/bootstrap/3.0.1/css/bootstrap.min.css" rel="stylesheet">

    <!-- Custom styles for this template -->
    <link href="style.css" rel="stylesheet">

    <!-- Just for debugging purposes. Don't actually copy this line! -->
    <!--[if lt IE 9]><script src="../../docs-assets/js/ie8-responsive-file-warning.js"></script><![endif]-->

    <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
    <!--[if lt IE 9]>
      <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
      <script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script>
    <![endif]-->
  </head>

  <body>

    <!-- Wrap all page content here -->
    <div id="wrap">

<nav class="navbar navbar-default" role="navigation">
  <!-- Brand and toggle get grouped for better mobile display -->
  <div class="navbar-header">
    <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
      <span class="sr-only">Toggle navigation</span>
      <span class="icon-bar"></span>
      <span class="icon-bar"></span>
      <span class="icon-bar"></span>
    </button>
    <a class="navbar-brand" href="#">Brand</a>
  </div>

  <!-- Collect the nav links, forms, and other content for toggling -->
  <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
    <ul class="nav navbar-nav">
      <li class="active"><a href="#">Link</a></li>
      <li><a href="#">Link</a></li>
      <li class="dropdown">
        <a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown <b class="caret"></b></a>
        <ul class="dropdown-menu">
          <li><a href="#">Action</a></li>
          <li><a href="#">Another action</a></li>
          <li><a href="#">Something else here</a></li>
          <li class="divider"></li>
          <li><a href="#">Separated link</a></li>
          <li class="divider"></li>
          <li><a href="#">One more separated link</a></li>
        </ul>
      </li>
    </ul>
    <form class="navbar-form navbar-left" role="search">
      <div class="form-group">
        <input type="text" class="form-control" placeholder="Search">
      </div>
      <button type="submit" class="btn btn-default">Submit</button>
    </form>
    <ul class="nav navbar-nav navbar-right">
      <li><a href="#">Link</a></li>
      <li class="dropdown">
        <a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown <b class="caret"></b></a>
        <ul class="dropdown-menu">
          <li><a href="#">Action</a></li>
          <li><a href="#">Another action</a></li>
          <li><a href="#">Something else here</a></li>
          <li class="divider"></li>
          <li><a href="#">Separated link</a></li>
        </ul>
      </li>
    </ul>
  </div><!-- /.navbar-collapse -->
</nav>

      <!-- Begin page content -->
      <div class="container">

        <div class="page-header">
          <h1>Sticky footer</h1>
        </div>
        <p class="lead">Pin a fixed-height footer to the bottom of the viewport in desktop browsers with this custom HTML and CSS.</p>
        <p>Use <a href="../sticky-footer-navbar">the sticky footer with a fixed navbar</a> if need be, too.</p>
      </div>
    </div><!-- Wrap Div end -->

    <div id="footer">
      <div class="container">
        <p class="text-muted credit">Example courtesy <a href="http://martinbean.co.uk">Martin Bean</a> and <a href="http://ryanfait.com/sticky-footer/">Ryan Fait</a>.</p>
      </div>
    </div>


    <!-- Bootstrap core JavaScript
    ================================================== -->
    <!-- Placed at the end of the document so the pages load faster -->
  </body>
</html>

у когось виникає проблема, коли це працює, але лише після того, як ви прокрутите сторінку вниз ? досить дивно.
Бред

1
Цей нижній колонтитул не реагує! Дивіться відповідь stackoverflow.com/a/23833625/1647737 для повністю адаптивного рішення.
le_m

1
Якщо ви можете використовувати flexbox, я пропоную спробувати це посилання: philipwalton.github.io/solved-by-flexbox/demos/sticky-footer
robodo

24

Рішення з липким колонтитулом, які покладаються на колонтитули з фіксованою висотою, втрачають прихильність завдяки адаптивним підходам (де висота нижнього колонтитулу часто змінюється в різних точках розриву). Найпростіше гнучке рішення липкого колонтитула, яке я бачив, передбачає використання display: tableв контейнері верхнього рівня, наприклад:

http://galengidman.com/2014/03/25/responsive-flex-height-sticky-footers-in-css/

http://timothy-long.com/responsive-sticky-footer/

http://www.visualdecree.co.uk/posts/2013/12/17/responsive-sticky-footers/


дисплей: таблиця - шлях
Лютер

19

Найкращий спосіб зробити наступне:
HTML: Sticky Footer
CSS: CSS для Sticky Footer
Приклад HTML-коду:

<div class="container">
  <div class="page-header">
    <h1>Sticky footer</h1>
  </div>
  <p class="lead">Pin a fixed-height footer to the bottom of the viewport in desktop browsers with this custom HTML and CSS.</p>
  <p>Use <a href="../sticky-footer-navbar">the sticky footer with a fixed navbar</a> if need be, too.</p>
</div>

<footer class="footer">
  <div class="container">
    <p class="text-muted">Place sticky footer content here.</p>
  </div>
</footer>

Зразок коду CSS:

    html {
  position: relative;
  min-height: 100%;
}
body {
  /* Margin bottom by footer height */
  margin-bottom: 60px;
}
.footer {
  position: absolute;
  bottom: 0;
  width: 100%;
  /* Set the fixed height of the footer here */
  height: 60px;
  background-color: #f5f5f5;
}

Ще одна невелика настройка може зробити її більш досконалою (залежить від вашого проекту), тому це не вплине на нижній колонтитул на мобільних поданнях.

@media (max-width:768px){ .footer{position:absolute;width:100%;} }
@media (min-width:768px){ .footer{position:absolute;bottom:0;height:60px;width:100%;}}

4
замінити position: relativeз , position: fixedщоб тримати його в нижній частині при прокручуванні вниз
Макс

14

Я шукав простий спосіб змусити липкий нижній колонтитул працювати. Я щойно застосував class="navbar-fixed-bottom"і це спрацювало моментально. Єдине, про що слід пам’ятати, це налаштування налаштувань нижнього колонтитула для мобільних пристроїв. Вітаємо!


6

Для тих , хто шукає легкий відповідь, ви можете отримати простий приклад працює тут :

html {
    position: relative;
    min-height: 100%;
}
body {
    margin-bottom: 60px /* Height of the footer */
}
footer {
    position: absolute;
    bottom: 0;
    width: 100%;
    height: 60px /* Example value */
}

Просто пограйте з bodyсимволами, margin-bottomщоб додати простір між вмістом і колонтитулом.


2

Я детально розповім про те, що сказав robodo в одному з коментарів вище, дуже швидкий і гарний вигляд, а що важливіше, адаптивний (не фіксований зріст) підхід, який не передбачає жодних хак, - це використовувати flexbox. Якщо ви не обмежені підтримкою браузерів, це чудове рішення.

HTML

<body>
  <div class="site-content">
    Site content
  </div>
  <footer class="footer">
    Footer content
  </footer>
</body>

CSS

html {
  height: 100%;
}
body {
  min-height: 100%;
  display: flex;
  flex-direction: column;
}
.site-content {
  flex: 1;
}

Підтримку браузера можна перевірити тут: http://caniuse.com/#feat=flexbox

Більш розповсюджені рішення проблем за допомогою flexbox: https://github.com/philipwalton/solved-by-flexbox


1

Не впевнений, що ви пробували дотепер, але це досить просто. Просто зробіть це: http://plnkr.co/edit/kmEWh7?p=preview

html, body {
  height: 100%;
}

footer {
  position: absolute;
  bottom: 0;
}

Дякую, це працює, але охоплює не всі випадки. Наприклад, зменшіть область перегляду вертикально і переконайтеся, що нижній колонтитул переміщується між текстом абзацу.
Роберт Крістіан

Звичайно, це так! Вам потрібен липкий нижній колонтитул, тому він буде липким до низу, і якщо ви зменшите область перегляду, він накладе текст. Ось чому вам потрібно встановити переповнення div, що містить ваш вміст: auto; і дайте йому нижню прокладку, принаймні рівну висоті вашого нижнього колонтитула.
Charles Ingalls

@CharlesIngalls Така неправильна відповідь. Питання було про липкий нижній колонтитул, і ця відповідь не наближається до нього.
WeAreRight

1

Оскільки він знаходиться в bootstrap 3, сайт буде використовувати jQuery. Тож рішення також може бути наступним, замість того, щоб намагатись грати зі складним CSS:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <link href="css/bootstrap.min.css" rel="stylesheet" />
    <style>
        .my-footer {
            border-radius : 0px;
            margin : 0px; /* pesky margin below .navbar */
            position : absolute;
            width : 100%;
        }
    </style>
</head>
<body>
    <div class="container-fluid">
        <div class="row">
            <!-- Content of any length -->
            asdfasdfasdfasdfs <br />
            asdfasdfasdfasdfs <br />
            asdfasdfasdfasdfs <br />
        </div>
    </div>

    <div class="navbar navbar-inverse my-footer">
        <div class="container-fluid">
            <div class="row">
                <p class="navbar-text">My footer content goes here...</p>
            </div>
        </div>
    </div>

    <script src="js/jquery-1.11.0.min.js"></script>
    <script src="js/bootstrap.min.js"></script>

    <script type="text/javascript">
        $(document).ready(function () {
            var $docH = $(document).height();
            // The document height will grow as the content on the page grows.
            $('.my-footer').css({
                /*
                The default height of .navbar is 50px with a 1px border,
                change this 52 if you change the height of your footer.
                */
                top: ($docH - 52) + 'px'
            });
        });
    </script>
</body>
</html>

Інший погляд на це, сподіваюся, що це допоможе.

З повагою.



1

Якщо ваш html має (грубу) структуру:

<div class="wrapper">
   <div>....</div>
   ...
   <div>....</div>
</div>
<div class="footer">
   ...
</div>

тоді найпростіший css, який фіксує нижній колонтитул внизу екрана, - це

html, body {
    height: 100%;
}
.wrapper {
  min-height: calc(100vh - 80px);
}
.footer {
   height: 80px;
}

... де висота нижнього колонтитула становить 80 пікселів. calcобчислює висоту обгортки рівною висоті вікна мінус висота нижнього колонтитула (80 пікселів), який знаходиться поза.wrapper


0

У мене спрацювало додавання позиції щодо тегу html.

html {
  min-height:100%;
  position:relative;
}
body {
  margin-bottom:60px;
}
footer {
  position:absolute;
  bottom:0;
  height:60px;
}

-1
   <style type="text/css">

     /* Sticky footer styles
     -------------------------------------------------- */

     html,
     body {
       height: 100%;
       /* The html and body elements cannot have any padding or margin. */
     }

     /* Wrapper for page content to push down footer */
     #wrap {
       min-height: 100%;
       height: auto !important;
       height: 100%;
       /* Negative indent footer by it's height */
       margin: 0 auto -60px;
     }

     /* Set the fixed height of the footer here */
     #push,
     #footer {
       height: 60px;
     }
     #footer {
       background-color: #f5f5f5;
     }

     /* Lastly, apply responsive CSS fixes as necessary */
     @media (max-width: 767px) {
       #footer {
         margin-left: -20px;
         margin-right: -20px;
         padding-left: 20px;
         padding-right: 20px;
       }
     }



     /* Custom page CSS
     -------------------------------------------------- */
     /* Not required for template or sticky footer method. */

     .container {
       width: auto;
       max-width: 680px;
     }
     .container .credit {
       margin: 20px 0;
     }

   </style>


<div id="wrap">

  <!-- Begin page content -->
  <div class="container">
    <div class="page-header">
      <h1>Sticky footer</h1>
    </div>
    <p class="lead">Pin a fixed-height footer to the bottom of the viewport in desktop browsers with this custom HTML and CSS.</p>
    <p>Use <a href="./sticky-footer-navbar.html">the sticky footer</a> with a fixed navbar if need be, too.</p>
  </div>

  <div id="push"></div>
</div>

<div id="footer">
  <div class="container">
    <p class="muted credit">Example courtesy <a href="http://martinbean.co.uk">Martin Bean</a> and <a href="http://ryanfait.com/sticky-footer/">Ryan Fait</a>.</p>
  </div>
</div>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.