Divi 5 Mobile Menu FIX (Collapsible Submenus + Smooth Animation)

Divi 5 Mobile Menu Fix – Collapsible Submenus with Smooth Animation

If you’re using Divi 5 and noticed that your mobile menu submenus are not collapsible or lack smooth animation — you’re not alone.

By default, Divi doesn’t provide a clean way to collapse and expand submenu items on mobile. This can hurt user experience and make navigation feel cluttered.

In this guide, I’ll show you how to create a fully functional mobile menu with collapsible submenus, smooth animations, and properly positioned toggle icons — step by step.


📺 Video Tutorial

Watch the full step-by-step tutorial below:


🧩 What This Solution Does

  • ✅ Collapsible mobile submenus
  • ✅ Smooth open / close animation
  • ✅ Clean toggle (+ / −) buttons
  • ✅ Parent links remain clickable
  • ✅ Works only on mobile (does not affect desktop)

⚙️ Where to Add the Code

CSS:
Divi → Theme Options → Custom CSS

JavaScript:
Divi → Theme Options → Integration → Add code to the <body>


🎨 CSS Code


/* START - Divi 5 Mobile Menu Collapsible Submenus */

@media only screen and (max-width: 980px) {

  .et_mobile_menu li.menu-item-has-children.mobile-submenu-parent {
    position: relative !important;
  }

  .et_mobile_menu li.menu-item-has-children.mobile-submenu-parent > a {
    padding-right: 56px !important;
  }

  .et_mobile_menu li.menu-item-has-children.mobile-submenu-parent > .submenu-toggle {
    position: absolute !important;
    top: 0 !important;
    right: 0 !important;
    width: 56px !important;
    height: 50px !important;
    display: flex !important;
    align-items: center !important;
    justify-content: center !important;
    border: 0 !important;
    background: transparent !important;
    cursor: pointer !important;
    z-index: 1000 !important;
    padding: 0 !important;
    margin: 0 !important;
    box-shadow: none !important;
    appearance: none !important;
  }

  .et_mobile_menu li.menu-item-has-children.mobile-submenu-parent > .submenu-toggle::before {
    content: "+";
    color: #ffffff;
    font-size: 24px;
    font-weight: 700;
    line-height: 1;
    display: block;
  }

  .et_mobile_menu li.menu-item-has-children.mobile-submenu-parent.submenu-open > .submenu-toggle::before {
    content: "−";
  }

  .et_mobile_menu li.menu-item-has-children.mobile-submenu-parent > ul.sub-menu {
    overflow: hidden;
    transition: max-height 0.35s ease, opacity 0.25s ease;
  }

  .et_mobile_menu li.menu-item-has-children.mobile-submenu-parent > ul.sub-menu li a {
    padding-left: 20px !important;
  }
}

/* END - Divi 5 Mobile Menu Collapsible Submenus */
  

💻 JavaScript Code


<script>
/* START - Divi 5 Mobile Menu Collapsible Submenus */

(function () {
  function isMobile() {
    return window.innerWidth <= 980;
  }

  function getDirectChild(item, selector) {
    for (var i = 0; i < item.children.length; i++) {
      if (item.children[i].matches(selector)) {
        return item.children[i];
      }
    }
    return null;
  }

  function closeSubmenu(item, submenu, toggle) {
    item.classList.remove('submenu-open');
    toggle.setAttribute('aria-expanded', 'false');

    submenu.style.maxHeight = submenu.scrollHeight + 'px';
    submenu.style.opacity = '1';
    submenu.style.visibility = 'visible';
    submenu.style.display = 'block';

    requestAnimationFrame(function () {
      submenu.style.maxHeight = '0px';
      submenu.style.opacity = '0';
    });

    setTimeout(function () {
      if (!item.classList.contains('submenu-open')) {
        submenu.style.visibility = 'hidden';
      }
    }, 350);
  }

  function openSubmenu(item, submenu, toggle) {
    item.classList.add('submenu-open');
    toggle.setAttribute('aria-expanded', 'true');

    submenu.style.display = 'block';
    submenu.style.visibility = 'visible';
    submenu.style.opacity = '1';
    submenu.style.maxHeight = 'none';

    var height = submenu.scrollHeight;

    submenu.style.maxHeight = '0px';

    requestAnimationFrame(function () {
      submenu.style.maxHeight = height + 'px';
    });
  }

  function toggleSubmenu(item, submenu, toggle) {
    if (item.classList.contains('submenu-open')) {
      closeSubmenu(item, submenu, toggle);
    } else {
      openSubmenu(item, submenu, toggle);
    }
  }

  function setupMenu(menu) {
    if (!menu || !isMobile()) return;

    var items = menu.querySelectorAll('li.menu-item-has-children');

    items.forEach(function (item) {
      var link = getDirectChild(item, 'a');
      var submenu = getDirectChild(item, 'ul.sub-menu');

      if (!link || !submenu) return;

      item.classList.add('mobile-submenu-parent');

      var toggle = getDirectChild(item, '.submenu-toggle');

      if (!toggle) {
        toggle = document.createElement('button');
        toggle.type = 'button';
        toggle.className = 'submenu-toggle';
        toggle.setAttribute('aria-label', 'Toggle submenu');
        toggle.setAttribute('aria-expanded', 'false');
        item.appendChild(toggle);

        toggle.addEventListener('click', function (e) {
          e.preventDefault();
          e.stopPropagation();
          toggleSubmenu(item, submenu, toggle);
        });
      }

      if (!item.classList.contains('submenu-open')) {
        submenu.style.display = 'block';
        submenu.style.maxHeight = '0px';
        submenu.style.opacity = '0';
        submenu.style.visibility = 'hidden';
      }
    });
  }

  function initMenus() {
    if (!isMobile()) return;
    document.querySelectorAll('.et_mobile_menu').forEach(setupMenu);
  }

  function refreshOpenMenus() {
    if (!isMobile()) return;

    document.querySelectorAll('.et_mobile_menu li.submenu-open').forEach(function (item) {
      var submenu = getDirectChild(item, 'ul.sub-menu');
      if (submenu) {
        submenu.style.maxHeight = submenu.scrollHeight + 'px';
      }
    });
  }

  document.addEventListener('DOMContentLoaded', function () {
    initMenus();

    setTimeout(initMenus, 300);
    setTimeout(initMenus, 800);
    setTimeout(initMenus, 1400);

    document.addEventListener('click', function (e) {
      if (
        e.target.closest('.mobile_menu_bar') ||
        e.target.closest('.et_pb_menu__icon') ||
        e.target.closest('.et_pb_menu__menu-toggle')
      ) {
        setTimeout(initMenus, 250);
        setTimeout(initMenus, 700);
      }
    });

    window.addEventListener('resize', refreshOpenMenus);
  });
})();

/* END - Divi 5 Mobile Menu Collapsible Submenus */
</script>
  

⚠️ Common Issues & Fixes

  • Submenu not opening?
    Remove any old CSS using display: none !important; on submenus.
  • Toggle works but nothing happens?
    Clear cache (Divi, browser, caching plugins).
  • Desktop menu looks broken?
    Make sure all styles are inside @media (max-width: 980px).

🚀 Final Tip

Always test your menu on a real mobile device — not just browser preview. Divi sometimes behaves differently depending on how the mobile menu is rendered.


💬 Need Help?

If you need help optimizing your website, improving conversions, or running high-performing ads — feel free to contact me.

I build fast, modern websites and marketing systems that actually generate results.

0 Comments

Submit a Comment

Your email address will not be published. Required fields are marked *

REQUEST A QUOTE

Pin It on Pinterest