<div id="app">
  <input id="mobile-menu-btn" class="mobile-menu-btn" type="checkbox">
  <label
    class="mobile-menu-label"
    for="mobile-menu-btn"
  >
    <span class="navicon"></span>
    <i class="bi bi-x"></i>
  </label>

  <div class="mobile-menu__overlay">
  </div>

  <div class="mobile-menu">
    <div class="mobile-menu__content">
      <p class="mobile-menu__content-title">
        其他活動
      </p>
      <ul>
        <li class="mobile-menu__link">
          <a href="#">活動 A</a>
        </li>
        <li class="mobile-menu__link">
          活動 B
        </li>
        <li class="mobile-menu__link">
          活動 C
        </li>
      </ul>
    </div>
  </div>
</div>
.mobile-menu-label{
  float: right;
  cursor: pointer;
  position: relative;
  user-select: none;
  padding: 9px;

  @media (min-width: 768px){
    display: none;
  }

  &::after {
    content: "";
    display: block;
    clear: both;
  }

  .navicon{
    background: #333;
    display: block;
    height: 2px;
    position: relative;
    transition: all .2s ease-out;
    width: 18px;

    &::before,
    &::after{
      background: #333;
      content: '';
      display: block;
      height: 100%;
      position: absolute;
      transition: all .2s ease-out;
      width: 100%;
    }

    &::before{
      top: 5px;
    }

    &::after{
      top: -5px;
    }
  }

  .bi-x{
    display: none;
    font-size: 24px;
    color: white;
  }
}

.mobile-menu-btn{
  display: none;
  &:checked{
    ~.mobile-menu-label .navicon{
      background: transparent;
      opacity: 0;
    }

    ~.mobile-menu-label .bi-x{
      display: block;
    }

    ~.mobile-menu-label{
      z-index: 1000;
      position: absolute;
      left:0;
      top:12%;

      @media (min-width: 400){
        left:38%;
      }
    }

    ~.mobile-menu__overlay{
      opacity: 0.75;
      z-index: 20;
      height: 100vh;

      @media (min-width: 768px){
        opacity: 0;
        z-index: -1;
        height: 0;
      }
    }

    ~.mobile-menu{
      opacity: 1;
      z-index: 25;
      height: 100vh;

      @media (min-width: 768px){
        opacity: 0;
        z-index: -1;
        height: 0;
        width:0;
      }
    }

    ~.mobile-menu__overlay,
    ~.mobile-menu{
      transition: all 0.2s ease-in;
    }
  }
}

.mobile-menu__overlay{
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 0;
  background-color: black;
  opacity: 0;
  z-index: -1;
}

.mobile-menu{
  position: absolute;
  padding: 25px;
  top:0;
  right:0;
  width: 80%;
  height: 0;
  opacity: 0;
  background-color: #fff;
  z-index: -1;

  @media (min-width: 400px){
    width: 50%;
  }

  @media (min-width: 768px){
    width:0;
  }

  .mobile-menu__content{
    .mobile-menu__content-title{
      font-size:16px;
      font-weight: 600;
    }
  }

  .mobile-menu__link{
    width: 100%;
    display: inline-block;
    margin: 0.5rem 0 0.5rem 0.5rem;
    font-size: 16px;
    color: #797979;
    font-weight: 400;

    &.mobile-menu__link--active{
      color: #000;
    }
  }
}
View Compiled
new Vue({
  el: '#app'
})
Run Pen

External CSS

  1. https://cdnjs.cloudflare.com/ajax/libs/bootstrap-icons/1.9.1/font/bootstrap-icons.min.css

External JavaScript

  1. https://cdn.jsdelivr.net/npm/vue@2.7.10