Search code examples
htmlcsstwitter-bootstrapbootstrap-4background-image

Bootstrap 4 background image full-height with navbar no scrolling


I have a page with a navbar. I want to add a responsive background image to the page (not the navbar).

If I set the page to 100% height it overflows the page with a scrollbar.

How should this be accomplished? I have no idea.

.bg { 
    /* The image used */
    background-image: url("http://via.placeholder.com/350x150");


    /* Center and scale the image nicely */
    background-position: center;
    background-repeat: no-repeat;
    background-size: cover;
}
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" rel="stylesheet"/>

<nav class="navbar navbar-expand-lg navbar-light bg-light">
  <a class="navbar-brand" href="#">Navbar</a>
  <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
    <span class="navbar-toggler-icon"></span>
  </button>
  <div class="collapse navbar-collapse" id="navbarNav">
    <ul class="navbar-nav">
      <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="#">Features</a>
      </li>
      <li class="nav-item">
        <a class="nav-link" href="#">Pricing</a>
      </li>
      <li class="nav-item">
        <a class="nav-link disabled" href="#">Disabled</a>
      </li>
    </ul>
  </div>
</nav>

<div class="main-page">
  <div class="bg"></div>
  <div class="data">
    bla bla bla
  </div>

</div>

Edit: jsfiddle - JSFIDDLE


Solution

  • You can use the Bootstrap 4 flexbox utils, and add flex:1 1 auto to the main-page so it fills the height (with no scrolling).

    https://www.codeply.com/go/isN2cS0m0q

    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
    <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" ></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script>
        
    <style>
    body {
        min-height: 100vh;
    }
    .flex-fill {
       flex: 1 1 auto;
    }  
    .bg { 
        background-image: url("http://placehold.it/350x150");
        background-position: center;
        background-repeat: no-repeat;
        background-size: cover;
    }
    </style>
    <body class="d-flex flex-column">
    <nav class="navbar navbar-expand-lg navbar-light bg-light">
        <a class="navbar-brand" href="#">Navbar</a>
        <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
            <span class="navbar-toggler-icon"></span>
        </button>
        <div class="collapse navbar-collapse" id="navbarNav">
            <ul class="navbar-nav">
                <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="#">Features</a>
                </li>
                <li class="nav-item">
                    <a class="nav-link" href="#">Pricing</a>
                </li>
                <li class="nav-item">
                    <a class="nav-link disabled" href="#">Disabled</a>
                </li>
            </ul>
        </div>
    </nav>
    <div class="main-page d-flex flex-column flex-fill">
        <div class="bg flex-fill"></div>
        <div class="data">
            bla bla bla
        </div>
    </div>
    </body>

    Note: The flex-fill class will be included in Bootstrap 4.1 so the extra CSS for flex-fill will no longer be needed when 4.1 is released.


    Related questions:
    Bootstrap 4 Navbar and content fill height flexbox
    Bootstrap 4: How to make the row stretch remaining height?