Bootstrap 3 Flush footer to bottom. not fixed

前端 未结 13 2616
走了就别回头了
走了就别回头了 2020-12-02 04:07

I am using Bootstrap 3 for a site I am designing.

I want to have a footer like this sample. Sample

Please note that I don\'t want it FIXED so bootstrap navba

相关标签:
13条回答
  • 2020-12-02 04:16

    Use any class and make it's height fixed. It solved my issue.

    <div class="container"></div>
    <footer></footer>
    

    CSS:

    .container{
        min-height: 60vh;
    }
    
    0 讨论(0)
  • 2020-12-02 04:18

    use flexbox as you can use it at your disposal. The solution offered by bootstrap 4 still hunting overlap content in responsive layout, e.g: it will break in mobile view, i come across the most neat trick is to use flexbox solution demo shown at here:(https://philipwalton.github.io/solved-by-flexbox/demos/sticky-footer/) this way we do not have to deal with fixed height issue which is an obsolete solution by now...this solution works for bootstrap 3 and 4 whichever you using.

    <body class="Site">
      <header>…</header>
      <main class="Site-content">…</main>
      <footer>…</footer>
    </body>
    
    .Site {
      display: flex;
      min-height: 100vh;
      flex-direction: column;
    }
    
    .Site-content {
      flex: 1;
    }
    
    0 讨论(0)
  • 2020-12-02 04:22

    For a pure CSS solution, scroll after the 2nd <hr>. The first one is the initial answer (given back in 2016)


    The major flaw of the solutions above is they have a fixed height for the footer.
    And that just doesn't cut it in the real world, where people use a zillion number of devices and have this bad habit of rotating them when you least expect it and **Poof!** there goes your page content behind the footer!

    In the real world, you need a function that calculates the height of the footer and dynamically adjusts the page content's padding-bottom to accommodate that height. And you need to run this tiny function on page load and resize events as well as on footer's DOMSubtreeModified (just in case your footer gets dynamically updated asynchronously or it contains animated elements that change size when interacted with).

    Here's a proof of concept, using jQuery v3.0.0 and Bootstrap v4-alpha, but there is no reason why it shouldn't work on lower versions of each.

    jQuery(document).ready(function($) {
      $.fn.accomodateFooter = function() {
        var footerHeight = $('footer').outerHeight();
        $(this).css({
          'padding-bottom': footerHeight + 'px'
        });
      }
      $('footer').on('DOMSubtreeModified', function() {
        $('body').accomodateFooter();
      })
      $(window).on('resize', function() {
        $('body').accomodateFooter();
      })
      $('body').accomodateFooter();
      window.addMoreContentToFooter = function() {
        var f = $('footer');
        f.append($('<p />', {
            text: "Human give me attention meow flop over sun bathe licks your face wake up wander around the house making large amounts of noise jump on top of your human's bed and fall asleep again. Throwup on your pillow sun bathe. The dog smells bad jump around on couch, meow constantly until given food, so nap all day, yet hiss at vacuum cleaner."
          }))
          .append($('<hr />'));
      }
    });
    body {
      min-height: 100vh;
      position: relative;
    }
    
    footer {
      background-color: rgba(0, 0, 0, .65);
      color: white;
      position: absolute;
      bottom: 0;
      width: 100%;
      padding: 1.5rem;
      display: block;
    }
    
    footer hr {
      border-top: 1px solid rgba(0, 0, 0, .42);
      border-bottom: 1px solid rgba(255, 255, 255, .21);
    }
    <link href="http://v4-alpha.getbootstrap.com/dist/css/bootstrap.min.css" rel="stylesheet">
    <link href="http://v4-alpha.getbootstrap.com/examples/starter-template/starter-template.css" rel="stylesheet">
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.0.0/jquery.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/tether/1.2.0/js/tether.min.js"></script>
    <script src="http://v4-alpha.getbootstrap.com/dist/js/bootstrap.min.js"></script>
    
    <nav class="navbar navbar-toggleable-md navbar-inverse bg-inverse fixed-top">
      <button class="navbar-toggler navbar-toggler-right" type="button" data-toggle="collapse" data-target="#navbarsExampleDefault" aria-controls="navbarsExampleDefault" aria-expanded="false" aria-label="Toggle navigation">
            <span class="navbar-toggler-icon"></span>
          </button>
      <a class="navbar-brand" href="#">Navbar</a>
    
      <div class="collapse navbar-collapse" id="navbarsExampleDefault">
        <ul class="navbar-nav mr-auto">
          <li class="nav-item active">
            <a class="nav-link" href="#">Home <span class="sr-only">(current)</span></a>
          </li>
          <li class="nav-item">
            <a class="nav-link" href="#">Link</a>
          </li>
          <li class="nav-item">
            <a class="nav-link disabled" href="#">Disabled</a>
          </li>
          <li class="nav-item dropdown">
            <a class="nav-link dropdown-toggle" href="http://example.com" id="dropdown01" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Dropdown</a>
            <div class="dropdown-menu" aria-labelledby="dropdown01">
              <a class="dropdown-item" href="#">Action</a>
              <a class="dropdown-item" href="#">Another action</a>
              <a class="dropdown-item" href="#">Something else here</a>
            </div>
          </li>
        </ul>
        <form class="form-inline my-2 my-lg-0">
          <input class="form-control mr-sm-2" type="text" placeholder="Search">
          <button class="btn btn-outline-success my-2 my-sm-0" type="submit">Search</button>
        </form>
      </div>
    </nav>
    
    <div class="container">
      <div class="starter-template">
        <h1>Feed that footer - not a game (yet!)</h1>
        <p class="lead">You will notice the body bottom padding is growing to accomodate the height of the footer as you feed it (so the page contents do not get covered by it).</p><button class="btn btn-warning" onclick="window.addMoreContentToFooter()">Feed that footer</button>
        <hr />
        <blockquote class="lead"><strong>Note:</strong> I used jQuery <code>v3.0.0</code> and Bootstrap <code>v4-alpha</code> but there is no reason why it shouldn't work with lower versions of each.</blockquote>
      </div>
    </div>
    
    <footer>I am a footer with dynamic content.
      <hr />
    </footer>

    Initially, I have posted this solution here but I realized it might help more people if posted under this question.

    Note: I have purposefully wrapped the $([selector]).accomodateFooter() as a jQuery plugin, so it could be run on any DOM element, as in most layouts it is not the $('body')'s bottom-padding that needs adjusting, but some page wrapper element with position:relative (usually the immediate parent of the footer).


    Later edit (3+ years after initial answer):

    At this point I no longer consider acceptable using JavaScript for positioning a dynamic content footer at the bottom of the page. It can be achieved with CSS alone, using flexbox, lightning fast, cross-browser.

    Here it is:

    // Left this in so you could inject content into the footer and test it:
    // (but it's no longer sizing the footer)
    
    function addMoreContentToFooter() {
      var f = $('footer');
      f.append($('<p />', {
          text: "Human give me attention meow flop over sun bathe licks your face wake up wander around the house making large amounts of noise jump on top of your human's bed and fall asleep again. Throwup on your pillow sun bathe. The dog smells bad jump around on couch, meow constantly until given food, so nap all day, yet hiss at vacuum cleaner."
        }))
        .append($('<hr />'));
    }
    .wrapper {
      min-height: 100vh;
      padding-top: 54px;
      display: flex;
      flex-direction: column;
    }
    
    .wrapper>* {
      flex-grow: 0;
    }
    
    .wrapper>main {
      flex-grow: 1;
    }
    
    footer {
      background-color: rgba(0, 0, 0, .65);
      color: white;
      width: 100%;
      padding: 1.5rem;
    }
    
    footer hr {
      border-top: 1px solid rgba(0, 0, 0, .42);
      border-bottom: 1px solid rgba(255, 255, 255, .21);
    }
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
    <script src="https://code.jquery.com/jquery-3.4.1.slim.min.js" integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script>
    
    <div class="wrapper">
      <nav class="navbar navbar-expand-lg navbar-light bg-light fixed-top">
      <a class="navbar-brand" href="#">Navbar</a>
      <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
        <span class="navbar-toggler-icon"></span>
      </button>
    
      <div class="collapse navbar-collapse" id="navbarSupportedContent">
        <ul class="navbar-nav mr-auto">
          <li class="nav-item active">
            <a class="nav-link" href="#">Home <span class="sr-only">(current)</span></a>
          </li>
          <li class="nav-item">
            <a class="nav-link" href="#">Link</a>
          </li>
          <li class="nav-item dropdown">
            <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
              Dropdown
            </a>
            <div class="dropdown-menu" aria-labelledby="navbarDropdown">
              <a class="dropdown-item" href="#">Action</a>
              <a class="dropdown-item" href="#">Another action</a>
              <div class="dropdown-divider"></div>
              <a class="dropdown-item" href="#">Something else here</a>
            </div>
          </li>
          <li class="nav-item">
            <a class="nav-link disabled" href="#" tabindex="-1" aria-disabled="true">Disabled</a>
          </li>
        </ul>
        <form class="form-inline my-2 my-lg-0">
          <input class="form-control mr-sm-2" type="search" placeholder="Search" aria-label="Search">
          <button class="btn btn-outline-success my-2 my-sm-0" type="submit">Search</button>
        </form>
      </div>
    </nav>
      <main>
        <div class="container">
          <div class="starter-template">
            <h1>Feed that footer - not a game (yet!)</h1>
            <p class="lead">Footer won't ever cover the body contents, as its not fixed. It's simply placed at the bottom when the page should be shorter using `min-height:100vh` on container and using flexbox to push it down.</p><button class="btn btn-warning" onclick="addMoreContentToFooter()">Feed that footer</button>
            <hr />
            <blockquote class="lead">
              <strong>Note:</strong> This example uses current latest versions of jQuery (<code>3.4.1.slim</code>) and Bootstrap (<code>4.4.1</code>) (unlike the one above).
            </blockquote>
          </div>
        </div>
      </main>
      <footer>I am a footer with dynamic content.
        <hr />
      </footer>
    </div>

    0 讨论(0)
  • 2020-12-02 04:29

    There is a simplified solution from bootstrap here (where you don't need to create a new class): http://getbootstrap.com/examples/sticky-footer-navbar/

    When you open that page, right click on a browser and "View Source" and open the sticky-footer-navbar.css file (http://getbootstrap.com/examples/sticky-footer-navbar/sticky-footer-navbar.css)

    you can see that you only need this CSS

    /* Sticky footer styles
    -------------------------------------------------- */
    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;
    }
    

    for this HTML

    <html>
        ...
        <body>
            <!-- Begin page content -->
            <div class="container">
            </div>
            ...
    
            <footer class="footer">
            </footer>
        </body>
    </html>
    
    0 讨论(0)
  • 2020-12-02 04:29

    None of these solutions exactly worked for me perfectly because I used navbar-inverse class in my footer. But I did get a solution that worked and Javascript-free. Used Chrome to aid in forming media queries. The height of the footer changes as the screen resizes so you have to pay attention to that and adjust accordingly. Your footer content (I set id="footer" to define my content) should use postion=absolute and bottom=0 to keep it at the bottom. Also width:100%. Here is my CSS with media queries. You'll have to adjust min-width and max-width and add or remove some elements:

    #footer {
      position: absolute;
      color:  #ffffff;
      width: 100%;
      bottom: 0; 
    }
    @media only screen and (min-width:1px) and (max-width: 407px)  {
        body {
            margin-bottom: 275px;
        }
    
        #footer {
            height: 270px; 
        }
    }
    @media only screen and (min-width:408px) and (max-width: 768px)  {
        body {
            margin-bottom: 245px;
        }
    
        #footer {
            height: 240px; 
        }
    }
    @media only screen and (min-width:769px)   {
        body {
            margin-bottom: 125px;
        }
    
        #footer {
            height: 120px; 
        }
    }
    
    0 讨论(0)
  • 2020-12-02 04:30

    This is what worked for me using Flexbox:

    .body-class {
        display: flex;
        min-height: 100vh;
        flex-direction: column;
    }
    
    .body-content {
        flex: 1 0 auto;
        width: 100%;
    }
    
    .footer {
        width: 100%;
        height: 60px;
        background-color: #f5f5f5;
        flex: none;
    }
    

    Source: https://philipwalton.github.io/solved-by-flexbox/demos/sticky-footer/

    0 讨论(0)
提交回复
热议问题