JSFiddle - React, Tailwind, and code Playground

by Suliman123

HTML

<div style="width: 60%; background-color: black; padding-left: 50px; padding-right: 50px">

<nav>
    <ul class="nav-menu">

        <li class="dropdown">
            <a href="#" data-toggle="dropdown">About</a>
            <ul class="dropdown-menu">
              <li><a href="/foo.html">Foo</a></li>
              <li><a href="/bar.html">Bar</a></li>
              <li><a href="/bar.html">Some long text here</a></li>
            </ul>
       </li>
       
        <li class="dropdown">
            <a href="#" data-toggle="dropdown">Company</a>
            <ul class="dropdown-menu">
              <li><a href="/foo.html">AAA</a></li>
              <li><a href="/bar.html">BBB</a></li>
              <li><a href="/bar.html">CCCCCCCC</a></li>
            </ul>
       </li>       

    </ul>
</nav>

</div>

CSS

nav {
   width:unset;

 }
   

.nav-menu {
   background-color: orange;
   display: flex;
   flex-direction: row;
 }
 
 .dropdown {
    position: relative;
    width:100%;
  }
   
  
  a[data-toggle="dropdown"] {
    display: flex;
    align-items: center;
    background: transparent;
    color: blue;
    padding: 10px 15px;
    border-radius: 4px;
    transition: background 0.3s ease;
    white-space: nowrap;
  }
  
  a[data-toggle="dropdown"]:hover {
    color: black;
  }

.nav-menu {
    display: flex;
    flex-wrap: wrap; 
    gap: 10px;
    list-style-type: none;
    
    padding: 0;
    margin: 0;
    align-items: center;
    width: 100%;
    
}


  .dropdown-menu {
    list-style: none;
    padding: 10px 15px;
    margin: 0;
    position: absolute;
    top: 100%;
    left: 0;

    background: #ffffff;
    box-shadow: 0 4px 10px rgba(0, 0, 0, 0.15);
    border-radius: 6px;
    overflow: hidden;
    transform: scaleY(0);
    transform-origin: top;
    opacity: 0;
    transition: transform 0.3s ease, opacity 0.3s ease;
    z-index: 1000;
  }
  
  
    
  .dropdown-menu.show {
    transform: scaleY(1);
    opacity: 1;
  }
  
  .dropdown-menu:before {
    /* content: ""; */
    display: block;
    position: absolute;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
    clip-path: inset(0 0 0 0);
  }

JavaScript

let buttonIdCounter = 0;
  

    const dropdowns = document.querySelectorAll('.dropdown');
    dropdowns.forEach((dropdown) => {
      const button = dropdown.querySelector('a[data-toggle="dropdown"]');
      const menu = dropdown.querySelector('.dropdown-menu');

      const buttonId = `dropdown-button-${buttonIdCounter}`;
      const menuId = `dropdown-menu-${buttonIdCounter}`;
      buttonIdCounter++;
  
      button.dataset.buttonId = buttonId;
      menu.dataset.menuId = buttonId; 
     document.querySelector('nav').style.width=`${menu.offsetWidth}px`;
  

    });
    document.addEventListener('click', (event) => {
      const clickedButton = event.target.closest('a[data-toggle="dropdown"]');
      const openMenus = document.querySelectorAll('.dropdown-menu.show');

      openMenus.forEach(menu => {
        const menuId = menu.dataset.menuId;
        const relatedButton = document.querySelector(`a[data-button-id="${menuId}"]`);
        const arrow = relatedButton?.querySelector('.icon-arrow');
  
        if (arrow) {
          arrow.style.transform = "rotate(0)"; 
        }
  
        menu.classList.remove('show'); 
      });

      if (!clickedButton) return;

      const buttonId = clickedButton.dataset.buttonId;
      const relatedMenu = document.querySelector(`.dropdown-menu[data-menu-id="${buttonId}"]`);
      const arrow = clickedButton.querySelector('.icon-arrow');
  
      if (relatedMenu) {
        const isMenuOpen = relatedMenu.classList.toggle('show');
  
        if (arrow) {
          arrow.style.transform = isMenuOpen ? "rotate(180deg)" : "rotate(0)";
        }
      }
  
      event.preventDefault();
    });
    document.addEventListener('click', (event) => {
      if (!event.target.closest('.dropdown')) {
        const openMenus = document.querySelectorAll('.dropdown-menu.show');
        openMenus.forEach(menu => {
          const menuId = menu.dataset.menuId;
          const relatedButton =...