Search code examples
htmlcssclip-path

How to make a submenu visible while using clip-path on the parent element


is there are way i can make a submenu visible while using clip-path on the parent element or it is impossible to achieve it?, without using clip-path the submenu is visible but with clip-path it is hidden. i tried setting visiblity to hidden on the third ul element but it was still not visible

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

.nav {
  width: 50%;
}

.nav ul {
  display: flex;
  justify-content: space-between;
  background-color: #000;
}

.nav ul li {
  list-style: none;
  padding: 5px;
  position: relative;
}

.nav ul li a {
  text-decoration: none;
  text-transform: uppercase;
  color: #fff;
  display: block;
}

.nav ul li ul {
  position: absolute;
  top: 100%;
  width: 150px;
  padding-top: 20px;
  display: flex;
  flex-direction: column;
  text-align: center;
  clip-path: polygon(0% 10%, 10% 10%, 10% 0%, 20% 10%, 100% 10%, 100% 100%, 0% 100%);
  overflow: visible;
}

.nav ul li ul li ul {
  position: absolute;
  left: 100%;
  top: 0;
  width: 150px;
  text-align: center;
  background-color: green;
}
<nav class="nav">
  <ul>
    <li><a href="#">menu1</a></li>
    <li><a href="#">menu2</a>
      <ul>
        <li><a href="">submenu1</a></li>
        <li><a href="">submenu2</a></li>
        <li><a href="">submenu3</a>
          <ul>
            <li><a href="">sub1</a></li>
            <li><a href="">sub2</a></li>
          </ul>
        </li>
        <li><a href="">submenu4</a></li>
      </ul>
    </li>
    <li><a href="#">menu3</a></li>
    </li>
    <li><a href="#">menu5</a></li>
  </ul>
</nav>


Solution

  • Update the percentage of the clip-path to cover a bigger area like below. Notice the use of 1000% instead of 100%

    * {
      margin: 0;
      padding: 0;
      box-sizing: border-box;
    }
    
    .nav {
      width: 50%;
    }
    
    .nav ul {
      display: flex;
      justify-content: space-between;
      background-color: #000;
    }
    
    .nav ul li {
      list-style: none;
      padding: 5px;
      position: relative;
    }
    
    .nav ul li a {
      text-decoration: none;
      text-transform: uppercase;
      color: #fff;
      display: block;
    }
    
    .nav ul li ul {
      position: absolute;
      top: 100%;
      width: 150px;
      padding-top: 20px;
      display: flex;
      flex-direction: column;
      text-align: center;
      clip-path: 
       polygon(0% 10%, 10% 10%, 10% 0%, 20% 10%, 1000% 10%, 1000% 1000%, 0% 1000%);
      overflow: visible;
    }
    
    .nav ul li ul li ul {
      position: absolute;
      left: 100%;
      top: 0;
      width: 150px;
      text-align: center;
      background-color: green;
    }
    <nav class="nav">
      <ul>
        <li><a href="#">menu1</a></li>
        <li><a href="#">menu2</a>
          <ul>
            <li><a href="">submenu1</a></li>
            <li><a href="">submenu2</a></li>
            <li><a href="">submenu3</a>
              <ul>
                <li><a href="">sub1</a></li>
                <li><a href="">sub2</a></li>
              </ul>
            </li>
            <li><a href="">submenu4</a></li>
          </ul>
        </li>
        <li><a href="#">menu3</a></li>
        </li>
        <li><a href="#">menu5</a></li>
      </ul>
    </nav>

    To understand the trick add a big box-shadow to notice the clipped area and the visible area since the shadow is also clipped by the clip-path:

    * {
      margin: 0;
      padding: 0;
      box-sizing: border-box;
    }
    
    .nav {
      width: 50%;
    }
    
    .nav ul {
      display: flex;
      justify-content: space-between;
      background-color: #000;
    }
    
    .nav ul li {
      list-style: none;
      padding: 5px;
      position: relative;
    }
    
    .nav ul li a {
      text-decoration: none;
      text-transform: uppercase;
      color: #fff;
      display: block;
    }
    
    .nav ul li ul {
      position: absolute;
      top: 100%;
      width: 150px;
      padding-top: 20px;
      display: flex;
      flex-direction: column;
      text-align: center;
      clip-path: 
       polygon(0% 10%, 10% 10%, 10% 0%, 20% 10%, 1000% 10%, 1000% 1000%, 0% 1000%);
      box-shadow: 0 0 0 1000vmax red;
    }
    
    .nav ul li ul li ul {
      position: absolute;
      left: 100%;
      top: 0;
      width: 150px;
      text-align: center;
      background-color: green;
    }
    <nav class="nav">
      <ul>
        <li><a href="#">menu1</a></li>
        <li><a href="#">menu2</a>
          <ul>
            <li><a href="">submenu1</a></li>
            <li><a href="">submenu2</a></li>
            <li><a href="">submenu3</a>
              <ul>
                <li><a href="">sub1</a></li>
                <li><a href="">sub2</a></li>
              </ul>
            </li>
            <li><a href="">submenu4</a></li>
          </ul>
        </li>
        <li><a href="#">menu3</a></li>
        </li>
        <li><a href="#">menu5</a></li>
      </ul>
    </nav>