Guapo
Guapo

Reputation: 3482

Making a navbar with 2 rows collapsible

I am using bootstrap5 to make a navbar with 2 rows that is collapsible when it goes into mobile/smaller window.

Its all working but I don't think its the best way to achieve it and on top of that I have a bug when I forget to toggle it off and resize the window the menu stay.

See this GIF for what it looks like right now:

looks like this

I had to create a secondary hidden menu in order to show/hide after it collapse past certain screen size, which does not look ideal.

Is there a proper way to achieve this navbar with bootstrap without having all these hacks I had to use or a proper way to achieve it?

With exception to the bug of the menu staying if u don't toggle it off it all looks the way I want it to.

I believe there is a better way to do this, but I am not experienced enough to figure it out by myself.

This is my current code:

<header>
    <nav class="navbar navbar-expand-md navbar-dark bg-dark container container flex-column">
        <div class="container">
            <a href="#" class="navbar-brand">My LOGO HERE</a>

            <button id="navbarCollapseBtn" type="button" class="navbar-toggler" data-bs-toggle="collapse" data-bs-target="#navbarCollapse" aria-expanded="true">
                <span class="navbar-toggler-icon"></span>
            </button>

            <div class="navbar-collapse collapse show" id="navbarCollapse" style="visibility: hidden;">
                <div class="navbar-nav">
                    <a href="#" class="nav-item nav-link active">Home</a>
                    <a href="#" class="nav-item nav-link">Categories</a>
                    <a href="#" class="nav-item nav-link">Tags</a>
                    <a href="#" class="nav-item nav-link">Contact Us</a>
                    
                    <a href="#" class="nav-item nav-link"><i class="fa-solid fa-user"></i> Sign Up</a>
                    <a href="#" class="nav-item nav-link"><i class="fa-sharp fa-solid fa-arrow-right-to-bracket"></i> Login</a>
                </div>
            </div>

            <form class="d-flex justify-content-between">
                <div class="input-group">
                    <input type="text" class="form-control" placeholder="Search">
                    <button type="button" class="btn btn-secondary"><i class="fas fa-search"></i></button>
                </div>
            </form>
        </div>

        <div class="navbar-collapse container mt-2 d-none d-md-block">
            <div class="navbar-nav">
                <a href="#" class="nav-item nav-link active">Home</a>
                <a href="#" class="nav-item nav-link">Categories</a>
                <a href="#" class="nav-item nav-link">Tags</a>
                <a href="#" class="nav-item nav-link">Contact Us</a>
            </div>
            <div class="navbar-nav">
                <a href="#" class="nav-item nav-link"><i class="fa-solid fa-user"></i> Sign Up</a>
                <a href="#" class="nav-item nav-link"><i class="fa-sharp fa-solid fa-arrow-right-to-bracket"></i> Login</a>
            </div>
        </div>
    </nav>
</header>

I had to further add this javascript to make it all work

$(document).ready(function()
{
    $('#navbarCollapseBtn').click(function ()
    {
        if ($('#navbarCollapse').css('visibility') === 'hidden')
        {
            $('#navbarCollapse').css('visibility', 'visible', 'important');
            $("#navbarCollapse").collapse("show");
        }
        else
        {
            $('#navbarCollapse').css('visibility', 'hidden', 'important');
            $("#navbarCollapse").collapse("hide");
        }
        return false;
    });
});

Upvotes: 0

Views: 1857

Answers (1)

Rok Benko
Rok Benko

Reputation: 23060

Here you go...

.navbar-nav {
  width: calc(100vw - 24px);
}

.navbar-brand {
  position: absolute;
  top: calc(0px + 8px);
  padding: 8px;
}

@media screen and (max-width: 767px) {
  .navbar-brand {
    position: relative;
    top: 0;
  }
}
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM" crossorigin="anonymous"></script>

<nav class="navbar navbar-light navbar-expand-md">
  <div class="container-fluid">
    <a class="navbar-brand" href="#">Logo</a>
    <button class="navbar-toggler" data-bs-toggle="collapse" data-bs-target="#navbar">
      <span class="visually-hidden">Toggle navigation</span>
      <span class="navbar-toggler-icon"></span>
    </button>
    <div id="navbar" class="collapse navbar-collapse">
      <div class="row ms-auto">
        <div class="col-12 ps-0">
          <ul class="navbar-nav float-none float-md-end d-flex justify-content-start">
            <li class="nav-item">
              <a class="nav-link active" href="#">Home</a>
            </li>
            <li class="nav-item">
              <a class="nav-link" href="#">Categories</a>
            </li>
            <li class="nav-item">
              <a class="nav-link" href="#">Tags</a>
            </li>
            <li class="nav-item">
              <a class="nav-link" href="#">
                <i class="fa-solid fa-user"></i> Sign Up
              </a>
            </li>
            <li class="nav-item">
              <a class="nav-link" href="#">
                <i class="fa-sharp fa-solid fa-arrow-right-to-bracket"></i> Login
              </a>
            </li>
          </ul>
        </div>
        <div class="col-12 ps-0 order-md-first">
          <ul class="navbar-nav d-flex justify-content-end">
            <li class="nav-item">
              <div class="input-group">
                <input type="text" class="form-control" aria-describedby="basic-addon2">
                <div class="input-group-append">
                  <button class="btn btn-outline-secondary" type="button">Search</button>
                </div>
              </div>
            </li>
          </ul>
        </div>
      </div>
    </div>
  </div>
</nav>


EDIT

.navbar-nav {
  width: calc(100vw - 24px);
}

.navbar-brand {
  position: absolute;
  top: calc(0px + 8px);
  padding: 8px;
}

.move-right a {
  display: inline-block;
}

@media screen and (max-width: 767px) {
  .navbar-brand {
    position: relative;
    top: 0;
  }
  
  .move-right a {
    display: block;
  }
}
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM" crossorigin="anonymous"></script>

<nav class="navbar navbar-light navbar-expand-md">
  <div class="container-fluid">
    <a class="navbar-brand" href="#">Logo</a>
    <button class="navbar-toggler" data-bs-toggle="collapse" data-bs-target="#navbar">
      <span class="visually-hidden">Toggle navigation</span>
      <span class="navbar-toggler-icon"></span>
    </button>
    <div id="navbar" class="collapse navbar-collapse">
      <div class="row ms-auto">
        <div class="col-12 ps-0">
          <ul class="navbar-nav float-none float-md-end d-flex justify-content-start">
            <li class="nav-item">
              <a class="nav-link active" href="#">Home</a>
            </li>
            <li class="nav-item">
              <a class="nav-link" href="#">Categories</a>
            </li>
            <li class="nav-item">
              <a class="nav-link" href="#">Tags</a>
            </li>
            <li class="nav-item ms-md-auto move-right">
              <a class="nav-link" href="#">
                <i class="fa-solid fa-user"></i> Sign Up
              </a>
              <a class="nav-link" href="#">
                <i class="fa-sharp fa-solid fa-arrow-right-to-bracket"></i> Login
              </a>
            </li>
          </ul>
        </div>
        <div class="col-12 ps-0 order-md-first">
          <ul class="navbar-nav d-flex justify-content-end">
            <li class="nav-item">
              <div class="input-group">
                <input type="text" class="form-control" aria-describedby="basic-addon2">
                <div class="input-group-append">
                  <button class="btn btn-outline-secondary" type="button">Search</button>
                </div>
              </div>
            </li>
          </ul>
        </div>
      </div>
    </div>
  </div>
</nav>

Upvotes: 1

Related Questions