How to apply margin right to nav bar not affecting the navbar collapse using Bootstrap?

Viewed 637

Goal:

I am aiming to place the nav bar items to this position using padding or margin marked in red:

enter image description here

Problem

I realized if I apply some padding right or margin right, the collapsed (Mobile screen) li items are applied with margin right or padding-right.

Here is a ridiculous example of high padding applied:

enter image description here

Goal:

This is the desired output:

enter image description here

And finally, properly centered collapsed li items in responsive mode:

enter image description here

Code:

* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

html {
  font-size: 20px;
 }

.navbar {
  background-color: black !important;
}

.navbar .navbar-collapse li{
  text-align: center;
  margin-bottom: 20px;
}

.navbar-nav > li{
  padding-right:30px;
}

.navbar li a {
  text-decoration: none;
  text-transform: uppercase;
  font-size: 70%;
  color: #000;
}

.navbar ul li a {
  position: relative;
  z-index: 1;
  padding: 15px;
}
<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title></title>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" integrity="sha384-JcKb8q3iqJ61gNV9KGb8thSsNjpSL0n8PARn9HuZOnIxN0hoP+VmmDGMN5t9UJ0Z" crossorigin="anonymous">
    <link href="https://fonts.googleapis.com/css2?family=Vollkorn&display=swap" rel="stylesheet">
    <script src="https://use.fontawesome.com/releases/v5.0.8/js/all.js"></script>
  </head>
  <body>


    <header>
          <nav class="navbar navbar-expand-lg navbar-dark bg-light">
            <button class="navbar-toggler">
              <span class="navbar-toggler-icon" data-toggle="collapse" data-target="#navbarMenu"></span>
            </button>
            <div class="collapse navbar-collapse justify-content-end" id="navbarMenu">
              <ul class="navbar-nav">
                <li class="nav-item"><a href="#">Home</a></li>
                <li class="nav-item"><a href="#">About me</a></li>
                <li class="nav-item"><a href="#">Projects</a></li>
                <li class="nav-item"><a href="#">Contact me</a></li>
              </ul>
            </div>
          </nav>

    <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js" integrity="sha384-9/reFTGAW83EW2RDu2S0VKaIzap3H66lZH81PoYlFhbGU+6BZp6G7niu735Sk7lN" crossorigin="anonymous"></script>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js" integrity="sha384-B4gt1jrGC7Jh4AgTPSdUtOBvfO8shuf57BaghqFfPlYxofvL8/KUEfYiJOMMV+rV" crossorigin="anonymous"></script>
  </body>
</html>

Question

Whats a good solution to achieve my desired output?

2 Answers

Add these media queries to the end of your css file and you will get the result you want. I added margin-right: 100px; at your discretion. You yourself can specify the number of pixels you need. And also added padding-right: 0; to remove indentation for mobile devices to better center the menu.

@media (min-width: 992px) {
  .navbar-expand-lg .navbar-nav {
      margin-right: 100px;
  }
}

@media (max-width: 992px) {
  .navbar-nav > li {
      padding-right: 0;
  }
}

* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

html {
  font-size: 20px;
 }

.navbar {
  background-color: black !important;
}

.navbar .navbar-collapse li{
  text-align: center;
  margin-bottom: 20px;
}

.navbar-nav > li{
  padding-right:30px;
}

.navbar li a {
  text-decoration: none;
  text-transform: uppercase;
  font-size: 70%;
  color: #000;
}

.navbar ul li a {
  position: relative;
  z-index: 1;
  padding: 15px;
}

@media (min-width: 992px) {
  .navbar-expand-lg .navbar-nav {
      margin-right: 100px;
  }
}

@media (max-width: 992px) {
  .navbar-nav > li {
      padding-right: 0;
  }
}
<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title></title>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" integrity="sha384-JcKb8q3iqJ61gNV9KGb8thSsNjpSL0n8PARn9HuZOnIxN0hoP+VmmDGMN5t9UJ0Z" crossorigin="anonymous">
    <link href="https://fonts.googleapis.com/css2?family=Vollkorn&display=swap" rel="stylesheet">
    <script src="https://use.fontawesome.com/releases/v5.0.8/js/all.js"></script>
  </head>
  <body>


    <header>
          <nav class="navbar navbar-expand-lg navbar-dark bg-light">
            <button class="navbar-toggler">
              <span class="navbar-toggler-icon" data-toggle="collapse" data-target="#navbarMenu"></span>
            </button>
            <div class="collapse navbar-collapse justify-content-end" id="navbarMenu">
              <ul class="navbar-nav">
                <li class="nav-item"><a href="#">Home</a></li>
                <li class="nav-item"><a href="#">About me</a></li>
                <li class="nav-item"><a href="#">Projects</a></li>
                <li class="nav-item"><a href="#">Contact me</a></li>
              </ul>
            </div>
          </nav>

    <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js" integrity="sha384-9/reFTGAW83EW2RDu2S0VKaIzap3H66lZH81PoYlFhbGU+6BZp6G7niu735Sk7lN" crossorigin="anonymous"></script>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js" integrity="sha384-B4gt1jrGC7Jh4AgTPSdUtOBvfO8shuf57BaghqFfPlYxofvL8/KUEfYiJOMMV+rV" crossorigin="anonymous"></script>
  </body>
</html>

There are a few things you could do to achieve this:

  1. As you were suggesting in your question, you can add margin to the right of your navbar, but you can apply this on larger screens only using media queries. The code below adds a media query that will only apply this CSS on screens of 992px or larger (the same point at which your navbar appears full width using Bootstrap's navbar-expand-lg class):
    @media (min-width: 992px) {
        #navbarMenu { margin-right: 200px; }       
    }

See working example:

* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

html {
  font-size: 20px;
 }

.navbar {
  background-color: black !important;
}

.navbar .navbar-collapse li{
  text-align: center;
  margin-bottom: 20px;
}

.navbar-nav > li{
  padding-right:30px;
}

.navbar li a {
  text-decoration: none;
  text-transform: uppercase;
  font-size: 70%;
  color: #000;
}

.navbar ul li a {
  position: relative;
  z-index: 1;
  padding: 15px;
}

@media (min-width: 992px) {
    #navbarMenu { margin-right:200px;}
}
<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title></title>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" integrity="sha384-JcKb8q3iqJ61gNV9KGb8thSsNjpSL0n8PARn9HuZOnIxN0hoP+VmmDGMN5t9UJ0Z" crossorigin="anonymous">
    <link href="https://fonts.googleapis.com/css2?family=Vollkorn&display=swap" rel="stylesheet">
    <script src="https://use.fontawesome.com/releases/v5.0.8/js/all.js"></script>
  </head>
  <body>


    <header>
          <nav class="navbar navbar-expand-lg navbar-dark bg-light">
            <button class="navbar-toggler">
              <span class="navbar-toggler-icon" data-toggle="collapse" data-target="#navbarMenu"></span>
            </button>
            <div class="collapse navbar-collapse justify-content-end" id="navbarMenu">
              <ul class="navbar-nav">
                <li class="nav-item"><a href="#">Home</a></li>
                <li class="nav-item"><a href="#">About me</a></li>
                <li class="nav-item"><a href="#">Projects</a></li>
                <li class="nav-item"><a href="#">Contact me</a></li>
              </ul>
            </div>
          </nav>

    <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js" integrity="sha384-9/reFTGAW83EW2RDu2S0VKaIzap3H66lZH81PoYlFhbGU+6BZp6G7niu735Sk7lN" crossorigin="anonymous"></script>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js" integrity="sha384-B4gt1jrGC7Jh4AgTPSdUtOBvfO8shuf57BaghqFfPlYxofvL8/KUEfYiJOMMV+rV" crossorigin="anonymous"></script>
  </body>
</html>

  1. You could also simply set the max-width on your navbar, so that a variable amount of space gets added to both sides once the screen reaches the maximum with you have set, e.g.

    nav { margin:auto; max-width: 400px; }
    

Because the navbar's background colour is added to nav, you will need to fill the rest of the screen with this colour using a wrapper class, or just use header in there is nothing else in it except the nav. We just need to add the Bootstrap bg-light class to match the nav bar, e.g.

<div class="wrap bg-light">
    <nav class="navbar navbar-expand-lg navbar-dark bg-light">
        [rest of your code here...]
    </nav>
</div>

Using a wrapper has the added advantage of adding equal amount of space to both sides, and increasing the space the wider the screen gets. (Also, it might sound like overkill to add an extra wrapper, but it is actually a standard way of keeping consistent width on all content as you can reuse a wrapper on all your content, and as I said you might be able to use header)

See working example:

* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

html {
  font-size: 20px;
 }

.navbar {
  background-color: black !important;
}

.navbar .navbar-collapse li{
  text-align: center;
  margin-bottom: 20px;
}

.navbar-nav > li{
  padding-right:30px;
}

.navbar li a {
  text-decoration: none;
  text-transform: uppercase;
  font-size: 70%;
  color: #000;
}

.navbar ul li a {
  position: relative;
  z-index: 1;
  padding: 15px;
}

nav { margin:auto; max-width: 400px; }
<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title></title>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" integrity="sha384-JcKb8q3iqJ61gNV9KGb8thSsNjpSL0n8PARn9HuZOnIxN0hoP+VmmDGMN5t9UJ0Z" crossorigin="anonymous">
    <link href="https://fonts.googleapis.com/css2?family=Vollkorn&display=swap" rel="stylesheet">
    <script src="https://use.fontawesome.com/releases/v5.0.8/js/all.js"></script>
  </head>
  <body>


    <header>
        <div class="wrap bg-light">
          <nav class="navbar navbar-expand-lg navbar-dark bg-light">
            <button class="navbar-toggler">
              <span class="navbar-toggler-icon" data-toggle="collapse" data-target="#navbarMenu"></span>
            </button>
            <div class="collapse navbar-collapse justify-content-end" id="navbarMenu">
              <ul class="navbar-nav">
                <li class="nav-item"><a href="#">Home</a></li>
                <li class="nav-item"><a href="#">About me</a></li>
                <li class="nav-item"><a href="#">Projects</a></li>
                <li class="nav-item"><a href="#">Contact me</a></li>
              </ul>
            </div>
          </nav>
        </div>
      </header>

    <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js" integrity="sha384-9/reFTGAW83EW2RDu2S0VKaIzap3H66lZH81PoYlFhbGU+6BZp6G7niu735Sk7lN" crossorigin="anonymous"></script>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js" integrity="sha384-B4gt1jrGC7Jh4AgTPSdUtOBvfO8shuf57BaghqFfPlYxofvL8/KUEfYiJOMMV+rV" crossorigin="anonymous"></script>
  </body>
</html>

Related