【问题标题】:Having issues with child element showing menu options子元素显示菜单选项时出现问题
【发布时间】:2020-03-17 04:05:03
【问题描述】:

我正在使用 Shopify 和 VUE 创建一个侧边栏菜单来拉入 shopify 链接列表。主要链接正在显示,但子链接被隐藏,并且切换/活动状态没有像预期的那样显示下拉菜单。

这是一个代码笔示例https://codepen.io/benmoswm/pen/RwPydrm

我已经开始这样做了几个小时,但错过了一些明显的东西,但对我来说不是。任何建议都会很棒。谢谢

<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.6.11/vue.min.js"></script>

  <div id="sidebar-panel">
    <nav class="sidebar-main-nav-evergreen">
      <Burger>Shop</Burger>
    </nav>
    <Sidebar>

      <ul class="evergreen-main-nav">
          {% for link in linklists.main-menu-sidebar.links %}
            {% include 'desktop-navigation-link' %}
          {% endfor %}
      </ul>

    </Sidebar>
  </div>

  <template id="sidebar">
      <div class="sidebar">
          <div class="sidebar-backdrop" v-on:click="closeSidebarPanel" v-if="isPanelOpen"></div>
          <transition name="slide">
              <div v-if="isPanelOpen"
                   class="sidebar-panel">
                  <slot></slot>
              </div>
          </transition>
      </div>
  </template>

  <template id="burger">
      <div id="burger"
           :class="{ 'active' : isBurgerActive }"
           @click.prevent="toggle">
          <slot>
              <button type="button" class="burger-button" title="Menu">
                  <span class="hidden">Toggle menu</span>
                  <span class="burger-bar burger-bar--1"></span>
                  <span class="burger-bar burger-bar--2"></span>
                  <span class="burger-bar burger-bar--3"></span>
              </button>
          </slot>
      </div>
  </template>


<style>

.sidebar-panel {
    overflow-y: auto;
    background-color: #eaeaea;
    position: fixed;
    left: 0;
    top: 0;
    height: 100%;
    z-index: 999;
    padding: 3rem 20px 2rem 20px;
    width: 320px;
}

.sidebar-main-nav-evergreen {
    float: left;
    width: auto;
    margin: 0 36px 0 0;
    display: block;
    position: relative;
    font-size: 14px;
    padding: 26px 2px 19px;
    height: 65px;
    line-height: 1.6;
    text-transform: uppercase;
}

.slide-enter-active, .slide-leave-active {
    transition: transform 0.2s ease;
}
.slide-enter, .slide-leave-to {
    transform: translateX(-100%);
    transition: all 150ms ease-in 0s
}
.sidebar-backdrop {
    background-color: rgba(250, 250, 250, .4);
    width: 100vw;
    height: 100vh;
    position: fixed;
    top: 0;
    left: 0;
    cursor: pointer;
    z-index: 10;
}

.evergreen-main-nav {
    list-style: none;
    margin: 0;
    padding: 25px
}
.evergreen-main-nav .evergreen-main-nav-item {
    padding: 15px 0;
    display: block;
    position: relative;
    font-weight: 400;
    font-size: 15px;
    border-bottom: 0px solid #ddd
}
.evergreen-main-nav .evergreen-main-subnav .evergreen-main-nav-item {
    font-weight: 300
}
.evergreen-main-nav .evergreen-main-nav-item:last-child {
    border-bottom: 0
}
.evergreen-main-nav .evergreen-main-nav-item a {
    color: inherit
}
.evergreen-main-subnav {
    padding-left: 15px;
    margin: 0;
    display: none;
}
.evergreen-main-subnav .evergreen-main-nav-item:last-child {
    padding-bottom: 0;
}

.evergreen-child-menu {
    float: right;
    cursor: pointer;
}
.evergreen-child-menu::after {
    content: "\f078";
    display: inline-block;
    font-family: 'FontAwesome';
    font-weight: 400;
    font-size: 10px;
    width: 30px;
    text-align: center
}
.evergreen-main-nav-item-has-children .evergreen-main-nav-active .evergreen-child-menu::after {
    content: "\f077"
}
.evergreen-main-nav-item-has-children .evergreen-main-nav-active .evergreen-main-subnav {
    display: block;
}

/* burger */
.hidden {
    visibility: hidden;
}

button {
    cursor: pointer;
}
/* remove blue outline */

button:focus {
    outline: 0;
}
.burger-button {
    position: relative;
    height: 30px;
    width: 32px;
    display: block;
    z-index: 999;
    border: 0;
    border-radius: 0;
    background-color: transparent;
    pointer-events: all;
    transition: transform .6s cubic-bezier(.165, .84, .44, 1);
}
.burger-bar {
    background-color: #000;
    position: absolute;
    top: 50%;
    right: 6px;
    left: 6px;
    height: 2px;
    width: auto;
    margin-top: -1px;
    transition: transform .6s cubic-bezier(.165, .84, .44, 1), opacity .3s cubic-bezier(.165, .84, .44, 1), background-color .6s cubic-bezier(.165, .84, .44, 1);
}
.burger-bar--1 {
    -webkit-transform: translateY(-6px);
    transform: translateY(-6px);
}
.burger-bar--2 {
    transform-origin: 100% 50%;
    transform: scaleX(.8);
}
.burger-button:hover .burger-bar--2 {
    transform: scaleX(1);
}
.no-touchevents .burger-bar--2:hover {
    transform: scaleX(1);
}
.burger-bar--3 {
    transform: translateY(6px);
}
#burger.active .burger-button {
    transform: rotate(-180deg);
}
#burger.active .burger-bar {
    background-color: #fff;
}
#burger.active .burger-bar--1 {
    transform: rotate(45deg)
}
#burger.active .burger-bar--2 {
    opacity: 0;
}
#burger.active .burger-bar--3 {
    transform: rotate(-45deg)
}

</style>



<script>
  const store = Vue.observable({
    isNavOpen: false
});

const mutations = {
    setIsNavOpen(yesno) {
        store.isNavOpen = yesno;
    },
    toggleNav() {
      store.isNavOpen = !store.isNavOpen;
    }
};


Vue.component('sidebar', {
  template: '#sidebar',
  methods: {
    closeSidebarPanel: mutations.toggleNav
  },
  computed: {
    isPanelOpen() {
      return store.isNavOpen
    }
  }
});

Vue.component('burger', {
  template: '#burger',
  computed: {
    isBurgerActive() {
      return store.isNavOpen
    }
  },
  methods: {
    toggle() {
      mutations.toggleNav()
    }
  }
});

new Vue({
  el: '#sidebar-panel'
})
</script>

【问题讨论】:

    标签: javascript html vue.js shopify


    【解决方案1】:

    .您必须在子菜单项上设置绝对位置

    更新

    .evergreen-main-subnav {
       padding:0;
       margin:0;
       display: none;
       position:absolute;
       top:10%;
       left:33%;
       background-color:#ccc;
    }
    .mobile-nav__item{
       list-style:none;
      width:100%;
      text-align:left;
      padding:8px;
    }
    .mobile-nav__item a{
      text-decoration:none;
    }
    
    .mobile-nav__item a:hover{
     font-weight:900;
     text-decoration:underline;
    }
    
    .evergreen-main-nav-item:hover .evergreen-main-subnav{
     display:block;
    }
    

     const store = Vue.observable({
        isNavOpen: false
    });
    
    const mutations = {
        setIsNavOpen(yesno) {
            store.isNavOpen = yesno;
        },
        toggleNav() {
          store.isNavOpen = !store.isNavOpen;
        }
    };
    
    
    Vue.component('sidebar', {
      template: '#sidebar',
      methods: {
        closeSidebarPanel: mutations.toggleNav
      },
      computed: {
        isPanelOpen() {
          return store.isNavOpen
        }
      }
    });
    
    Vue.component('burger', {
      template: '#burger',
      computed: {
        isBurgerActive() {
          return store.isNavOpen
        }
      },
      methods: {
        toggle() {
          mutations.toggleNav()
        }
      }
    });
    
    new Vue({
      el: '#sidebar-panel'
    })
    /* common styles */
    html {
      height: 100%;
      overflow: hidden;
    }
    
    body {
      border: 0;
      margin: 0;
      padding: 0;
      font-family: "Lato";
      height: 100%;
      background-color: #d4d4d4;
    }
    
    .sidebar-panel {
      overflow-y: auto;
      background-color: #eaeaea;
      position: fixed;
      left: 0;
      top: 0;
      height: 100%;
      z-index: 999;
      padding: 3rem 20px 2rem 20px;
      width: 320px;
    }
    
    .sidebar-main-nav-evergreen {
      float: left;
      width: auto;
      margin: 0 36px 0 20px;
      display: block;
      position: relative;
      font-size: 14px;
      padding: 26px 2px 19px;
      height: 65px;
      line-height: 1.6;
      text-transform: uppercase;
    }
    
    .slide-enter-active,
    .slide-leave-active {
      transition: transform 0.2s ease;
    }
    .slide-enter,
    .slide-leave-to {
      transform: translateX(-100%);
      transition: all 150ms ease-in 0s;
    }
    .sidebar-backdrop {
      background-color: rgba(250, 250, 250, 0.4);
      width: 100vw;
      height: 100vh;
      position: fixed;
      top: 0;
      left: 0;
      cursor: pointer;
      z-index: 10;
    }
    
    .evergreen-main-nav {
      list-style: none;
      margin: 0;
      padding: 25px;
    }
    .evergreen-main-nav .evergreen-main-nav-item {
      padding: 15px 0;
      display: block;
      position: relative;
      font-weight: 400;
      font-size: 15px;
      border-bottom: 0px solid #ddd;
    }
    .evergreen-main-nav .evergreen-main-subnav .evergreen-main-nav-item {
      font-weight: 300;
    }
    .evergreen-main-nav .evergreen-main-nav-item:last-child {
      border-bottom: 0;
    }
    .evergreen-main-nav .evergreen-main-nav-item a {
      color: inherit;
    }
    .evergreen-main-subnav {
      padding:0;
      margin:0;
      display: none;
      position:absolute;
      top:10%;
      left:33%;
      background-color:#ccc;
    }
    .mobile-nav__item{
      list-style:none;
      width:100%;
      text-align:left;
      padding:8px;
    }
    .mobile-nav__item a{
      text-decoration:none;
    }
    
    .mobile-nav__item a:hover{
      font-weight:900;
      text-decoration:underline;
    }
    
    .evergreen-main-nav-item:hover .evergreen-main-subnav{
      display:block;
    }
    .evergreen-main-subnav .evergreen-main-nav-item:last-child {
      padding-bottom: 0;
    }
    
    .evergreen-child-menu {
      float: right;
      cursor: pointer;
    }
    .evergreen-child-menu::after {
      content: "\f078";
      display: inline-block;
      font-family: "FontAwesome";
      font-weight: 400;
      font-size: 10px;
      width: 30px;
      text-align: center;
    }
    .evergreen-main-nav-item-has-children
      .evergreen-main-nav-active
      .evergreen-child-menu::after {
      content: "\f077";
    }
    .evergreen-main-nav-item-has-children
      .evergreen-main-nav-active
      .evergreen-main-subnav {
      display: block;
    }
    
    /* burger */
    .hidden {
      visibility: hidden;
    }
    
    button {
      cursor: pointer;
    }
    /* remove blue outline */
    
    button:focus {
      outline: 0;
    }
    .burger-button {
      position: relative;
      height: 30px;
      width: 32px;
      display: block;
      z-index: 999;
      border: 0;
      border-radius: 0;
      background-color: transparent;
      pointer-events: all;
      transition: transform 0.6s cubic-bezier(0.165, 0.84, 0.44, 1);
    }
    .burger-bar {
      background-color: #000;
      position: absolute;
      top: 50%;
      right: 6px;
      left: 6px;
      height: 2px;
      width: auto;
      margin-top: -1px;
      transition: transform 0.6s cubic-bezier(0.165, 0.84, 0.44, 1),
        opacity 0.3s cubic-bezier(0.165, 0.84, 0.44, 1),
        background-color 0.6s cubic-bezier(0.165, 0.84, 0.44, 1);
    }
    .burger-bar--1 {
      -webkit-transform: translateY(-6px);
      transform: translateY(-6px);
    }
    .burger-bar--2 {
      transform-origin: 100% 50%;
      transform: scaleX(0.8);
    }
    .burger-button:hover .burger-bar--2 {
      transform: scaleX(1);
    }
    .no-touchevents .burger-bar--2:hover {
      transform: scaleX(1);
    }
    .burger-bar--3 {
      transform: translateY(6px);
    }
    #burger.active .burger-button {
      transform: rotate(-180deg);
    }
    #burger.active .burger-bar {
      background-color: #fff;
    }
    #burger.active .burger-bar--1 {
      transform: rotate(45deg);
    }
    #burger.active .burger-bar--2 {
      opacity: 0;
    }
    #burger.active .burger-bar--3 {
      transform: rotate(-45deg);
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.6.11/vue.min.js"></script>
    
    <link href="//netdna.bootstrapcdn.com/font-awesome/3.2.1/css/font-awesome.css" rel="stylesheet">
    
    <div id="sidebar-panel">
      <nav class="sidebar-main-nav-evergreen">
        <Burger>click me</Burger>
      </nav>
      <Sidebar>
    
        <ul class="evergreen-main-nav">
          <li class="evergreen-main-nav-item evergreen-main-nav-item-has-children"><a href="/collections/ceramic-pots" class="evergreen-menu-link">Ceramic Pots</a> <span class="evergreen-child-menu"></span>
            <ul class="evergreen-main-subnav">
              <li class="mobile-nav__item"><a href="/collections/bower" class="mobile-nav__link">Bower</a></li>
              <li class="mobile-nav__item"><a href="#" class="mobile-nav__link">Wave</a></li>
            </ul>
          </li>
          <li class="evergreen-main-nav-item"><a href="/collections/large-pots" class="evergreen-menu-link">Large Pots</a></li>
          <li class="evergreen-main-nav-item"><a href="/collections/pot-stands" class="evergreen-menu-link">Pot Stands</a></li>
          <li class="evergreen-main-nav-item"><a href="/collections/pot-stands" class="evergreen-menu-link">Hanging Pots</a></li>
          <li class="evergreen-main-nav-item"><a href="/collections/watering-cans" class="evergreen-menu-link">Watering Cans</a></li>
        </ul>
    
      </Sidebar>
    </div>
    
    <template id="sidebar">
      <div class="sidebar">
        <div class="sidebar-backdrop" v-on:click="closeSidebarPanel" v-if="isPanelOpen"></div>
        <transition name="slide">
          <div v-if="isPanelOpen" class="sidebar-panel">
            <slot></slot>
          </div>
        </transition>
      </div>
    </template>
    
    <template id="burger">
      <div id="burger" :class="{ 'active' : isBurgerActive }" @click.prevent="toggle">
        <slot>
          <button type="button" class="burger-button" title="Menu">
            <span class="hidden">Toggle menu</span>
            <span class="burger-bar burger-bar--1"></span>
            <span class="burger-bar burger-bar--2"></span>
            <span class="burger-bar burger-bar--3"></span>
          </button>
        </slot>
      </div>
    </template>

    【讨论】:

    • 感谢您的反馈,正在查看使用 显示
    • @WhileyMai,我已经添加了修改后的部分。请现在检查。
    猜你喜欢
    • 2018-07-09
    • 2013-09-02
    • 1970-01-01
    • 2021-02-16
    • 1970-01-01
    • 2013-03-14
    • 2016-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多