【问题标题】:My submenus didn't place themselves as I want + can't close them with a checkbox我的子菜单没有按我的意愿放置 + 无法用复选框关闭它们
【发布时间】:2020-07-01 17:58:24
【问题描述】:

我是编码新手,实际上是在学习后端,但仍然想做出一些漂亮的东西。 (对于任何英语错误,我们深表歉意)

不管怎样,我做这个:

HTML:

<header>
<nav>
    <a href="#" class="logo"><i class="fas fa-globe-asia fa-2x"></i><span>Title<br>Title</span></a>
    <input class="menu-btn" type="checkbox" id="menu-btn" />
    <label class="menu-icon" for="menu-btn"><span class="navicon"></span></label>
    <ul class="menu">
        <li><a href="index.php"><i class="fas fa-home mr-2"></i> Accueil</a></li>
        <li class="nav-expand"><a href="#" class="nav-link"><span><i class="fas fa-chalkboard-teacher mr-2"></i> Click here for submenu  </span></a>
            <ul class="nav-expand-content">
                <li><a href="">1</a></li>
                <li class="nav-expand"><a href="#" class="nav-link">2</a>
                    <ul class="nav-expand-content">
                        <li><a href="#">2.1</a></li>
                        <li><a href="#">2.2</a></li>
                    </ul>
                </li>
                <li class="nav-expand"><a href="#" class="nav-link">3</a>
                    <ul class="nav-expand-content">
                        <li><a href="#">3.1</a></li>
                        <li><a href="#">3.2</a></li>
                    </ul>
                </li>
                <li class="nav-expand"><a href="#" class="nav-link">4 : click here for another submenu</a>
                    <ul class="nav-expand-content">
                        <li><a href="#">4.1</a></li>
                        <li class="nav-expand"><a href="#" class="nav-link">Test lvl 3</a>
                            <ul class="nav-expand-content">
                            <li class="nav-expand"><a href="#" class="nav-link">Test lvl 4</a>
                                <ul class="nav-expand-content">
                                <li class="nav-expand"><a href="#">Test lvl 5</a></li>
                                </ul>
                            </li>
                            </ul>
                        </li>
                    </ul>
                </li>
                <li><a href="#">5</a></li>
                <li><a href="#">6</a></li>
                <li><a href="#">7</a></li>
                <li><a href="#">8</a></li>
            </ul>
        </li>   
    </ul>
</nav>

CSS:

    /* ---------------------------------------------------------------- 
                                ALL
---------------------------------------------------------------- */


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



/* ---------------------------------------------------------------- 
                                HEADER
---------------------------------------------------------------- */

header {
    background-color: rgb(235, 235, 235);
    box-shadow: 1px 1px 4px 0 rgba(0,0,0,.5), inset 0px 5px #C44816;
    padding-top: 5px;
    position: fixed;
    width: 100%;
}

header ul {
    margin: 0;
    padding: 5px;
    list-style: none;
    overflow: hidden;
    background-color: rgb(235, 235, 235);
}

header li a {
    display: block;
    padding: 20px 20px;
    border-right: 1px solid rgb(225, 225, 225);
    border-left: 1px solid rgb(225, 225, 225);
    text-decoration: none;
    color: #333;
}

header li a:hover {
    background-color: rgb(225, 225, 225);
}

.logo {
    display: block;
    float: left;
    font-size: 20px;
    padding: 10px 20px;
    text-decoration: none;
    color: #333;
}

.logo span {
    vertical-align: bottom;
    display: inline-block;
}

header .menu { /* Objectif : cacher le menu par défaut */
    clear: both;
    max-height: 0;
    transition: max-height .2s ease-out;
  }


    /* ----------------- Hamburger menu-icon ----------------- */

header .menu-icon {
    cursor: pointer;
    float: right;
    padding: 28px 20px;
    position: relative;
    user-select: none; /* L'icone du menu ne peut pas être sélectionnée par l'utilisateur */
}

header .menu-icon .navicon { /* Barre du milieu qui disparait en transition */
    background: #333;
    display: block;
    height: 2px;
    width: 18px;
    position: relative;
    transition: background .2s ease-out;
}
  
header .menu-icon .navicon:before,
  header .menu-icon .navicon:after { /* Les deux autres barres */
    background: #333;
    content: '';
    display: block;
    height: 100%;
    width: 100%;
    position: absolute;
    transition: all .2s ease-out;

  }
  
header .menu-icon .navicon:before { /* Barre du bas */
    top: 5px;
}

header .menu-icon .navicon:after { /* Barre du haut */
    top: -5px;
}



    /* ----------------- Hamburger Menu button behavior ----------------- */
  
header .menu-btn {
    display: none;
}
  
header .menu-btn:checked ~ .menu {
    max-height: 100vh;
}
  
header .menu-btn:checked ~ .menu-icon .navicon { /* Barre du milieu qui disparait*/
    background: transparent;
}
  
header .menu-btn:checked ~ .menu-icon .navicon:before { /* Barre du bas qui tourne */
    transform: rotate(-45deg);
}
  
header .menu-btn:checked ~ .menu-icon .navicon:after { /* Barre du haut qui tourne */
    transform: rotate(45deg);
}
  
header .menu-btn:checked ~ .menu-icon:not(.steps) .navicon:before,
  header .menu-btn:checked ~ .menu-icon:not(.steps) .navicon:after { /* Les deux barres se croisent en leur milieu */
    top: 0;
  }

    /* ----------------- Sous-catégories ----------------- */
    
.nav-expand-content {
    position: absolute;
    top: 76px;
    left: 0;
    width: 100%;
    height: 100vh;
    overflow-y: auto;
    transform: translateX(100%);
    transition: 0.3s;
    visibility: hidden;
}

.active > .nav-expand-content {
    transform: translateX(0);
    visibility: visible;
    box-shadow: 1px 1px 4px 0 rgba(0,0,0,.5);
}

.nav-link {
    display: flex;
    justify-content: space-between;
}




    /* ----------------- Media Queries ----------------- */

@media (min-width: 768px) {
    header li {
        float: left;
    }
    header li a {
        padding: 20px 30px;
    }
    header .menu {
        clear: none;
        float: right;
        max-height: none;
    }
    header .menu-icon {
        display: none;
    }
}

JS:

    /* -------------------------------------
            Menu + sub-menu
--------------------------------------*/

let navExpand = document.querySelectorAll('.nav-expand')
let backLink = `<li class="nav-item">
    <a class="nav-back-link" href="javascript:;">
        <i class="fas fa-caret-left"></i> Back 
    </a>
</li>`
let forwardIcon = '<i class="fas fa-caret-right"></i>'

navExpand.forEach(item => {
    item.querySelector('.nav-expand-content').insertAdjacentHTML('afterbegin', backLink)
    item.querySelector('.nav-link').insertAdjacentHTML('beforeend', forwardIcon)
    item.querySelector('.nav-link').addEventListener('click', () => item.classList.add('active'))
    item.querySelector('.nav-back-link').addEventListener('click', () => item.classList.remove('active'))
})



    /* ----------- Close sub-menu when checkbox unchecked ----------- */

let checkBox = document.getElementById('menu-btn');

checkbox.addEventListener('change', e => {

    if(e.target.checked==false){
        navExpand.forEach(item => {
            item.classList.remove('active')
        })
    }
})

知道现在,我正在致力于移动优先,因此,您需要调整大小才能看到我的问题。

问题 1:CSS 问题

第一级子菜单按预期工作,在原始菜单上方,我们仍然可以看到标题和汉堡标志。但是在此之后,下一个级别就在它之下,而不是在它之上,等等。如果没有其他位置,我不知道如何堆叠它们。如果我将它们的顶部位置设置为 0,它们会按照我的预期工作,但会超过 ma 标题和图标。所以,我把 76px 放在这个下面...我尝试了很多不同的东西,但这两个是最接近我想要的。

有人建议我将所有内容放在另一个 div 中,作为侧边栏。我开始做这个,但是,对于一个更大的屏幕,它看起来非常难做,从那时起我就有 2 个导航作为一个工作。我猜这似乎比让一个导航作为两个移动设备的导航更难?而且我不明白为什么如果它在同一个导航中它不应该工作,(当我不明白某些东西时我不喜欢它)所以我停了下来。即使这样,侧面菜单也能按预期工作。所以,我想如果我不能解决它,我会去那里。但我很想避免它。

问题2:JS问题

如您所见,这会产生很多子菜单,而对于活动类,我们必须将它们一一删除。我编写了一些代码,让它好像我们取消选中了菜单汉堡包,它们都应该删除它们的活动类,但是无论代码是什么,它都不起作用,我什至无法理解为什么。

感谢您的时间和提前的建议

PS:我还不知道任何 JQuery '^^

【问题讨论】:

    标签: javascript html css checkbox submenu


    【解决方案1】:

    CSS 问题可能使菜单“位置:相对;”它们的子菜单使用 top:0 相互覆盖。

    js 当 item.querySelector('XXX') 找不到任何东西时不能 "insertAdjacentHTML" 否则会崩溃然后出现未知错误所以尽量避免它。

    附言在 js 中,checkBox 和 checkbox 是不同的。 :p

    搜索“检查这个”以检查我修改了哪一行。

        let navExpand = document.querySelectorAll('.nav-expand')
        let backLink = `<li class="nav-item">
        <a class="nav-back-link" href="javascript:;">
            <i class="fas fa-caret-left"></i> Back 
        </a>
    </li>`
        let forwardIcon = '<i class="fas fa-caret-right"></i>'
    
        navExpand.forEach(item => {  // check this
          if (item.querySelector('.nav-expand-content')) item.querySelector('.nav-expand-content').insertAdjacentHTML('afterbegin', backLink);
          if (item.querySelector('.nav-link')) item.querySelector('.nav-link').insertAdjacentHTML('beforeend', forwardIcon);
          if (item.querySelector('.nav-link')) item.querySelector('.nav-link').addEventListener('click', () => item.classList.add('active'));
          if (item.querySelector('.nav-back-link')) item.querySelector('.nav-back-link').addEventListener('click', () => item.classList.remove('active'));
        })
    
        // 
    
        /* ----------- Close sub-menu when checkbox unchecked ----------- */
    
        let checkBox = document.getElementById('menu-btn');
    
        checkBox.addEventListener('change', e => {   // check this
          if (e.target.checked == false) {
            let actives = document.querySelectorAll('.active');
            actives.forEach(item => {
              item.classList.remove('active')
            })
          }
        })
        /* ---------------------------------------------------------------- 
                                    ALL
    ---------------------------------------------------------------- */
    
    
        * {
          margin: 0;
          padding: 0;
          box-sizing: border-box;
        }
    
    
    
        /* ---------------------------------------------------------------- 
                                    HEADER
    ---------------------------------------------------------------- */
    
        header {
          background-color: rgb(235, 235, 235);
          box-shadow: 1px 1px 4px 0 rgba(0, 0, 0, .5), inset 0px 5px #C44816;
          padding-top: 5px;
          position: fixed;
          width: 100%;
        }
    
        header ul {
          margin: 0;
          padding: 5px;
          list-style: none;
          overflow: hidden;
          background-color: rgb(235, 235, 235);
        }
    
        header li a {
          display: block;
          padding: 20px 20px;
          border-right: 1px solid rgb(225, 225, 225);
          border-left: 1px solid rgb(225, 225, 225);
          text-decoration: none;
          color: #333;
        }
    
        header li a:hover {
          background-color: rgb(225, 225, 225);
        }
    
        .logo {
          display: block;
          float: left;
          font-size: 20px;
          padding: 10px 20px;
          text-decoration: none;
          color: #333;
        }
    
        .logo span {
          vertical-align: bottom;
          display: inline-block;
        }
    
        header .menu {
          /* check this */
          position: relative;
          /* Objectif : cacher le menu par défaut */
          clear: both;
          max-height: 0;
          transition: max-height .2s ease-out;
        }
    
    
        /* ----------------- Hamburger menu-icon ----------------- */
    
        header .menu-icon {
          cursor: pointer;
          float: right;
          padding: 28px 20px;
          position: relative;
          user-select: none;
          /* L'icone du menu ne peut pas être sélectionnée par l'utilisateur */
        }
    
        header .menu-icon .navicon {
          /* Barre du milieu qui disparait en transition */
          background: #333;
          display: block;
          height: 2px;
          width: 18px;
          position: relative;
          transition: background .2s ease-out;
        }
    
        header .menu-icon .navicon:before,
        header .menu-icon .navicon:after {
          /* Les deux autres barres */
          background: #333;
          content: '';
          display: block;
          height: 100%;
          width: 100%;
          position: absolute;
          transition: all .2s ease-out;
    
        }
    
        header .menu-icon .navicon:before {
          /* Barre du bas */
          top: 5px;
        }
    
        header .menu-icon .navicon:after {
          /* Barre du haut */
          top: -5px;
        }
    
    
    
        /* ----------------- Hamburger Menu button behavior ----------------- */
    
        header .menu-btn {
          display: none;
        }
    
        header .menu-btn:checked~.menu {
          max-height: 100vh;
          /* check this */
          overflow: visible;
        }
    
        header .menu-btn:checked~.menu-icon .navicon {
          /* Barre du milieu qui disparait*/
          background: transparent;
        }
    
        header .menu-btn:checked~.menu-icon .navicon:before {
          /* Barre du bas qui tourne */
          transform: rotate(-45deg);
        }
    
        header .menu-btn:checked~.menu-icon .navicon:after {
          /* Barre du haut qui tourne */
          transform: rotate(45deg);
        }
    
        header .menu-btn:checked~.menu-icon:not(.steps) .navicon:before,
        header .menu-btn:checked~.menu-icon:not(.steps) .navicon:after {
          /* Les deux barres se croisent en leur milieu */
          top: 0;
        }
    
        /* ----------------- Sous-catégories ----------------- */
    
        .nav-expand-content {
          /* check this */
          position: absolute;
          top: 0px;
          left: 0;
          width: 100%;
          height: 100vh;
          overflow-y: auto;
          transform: translateX(100%);
          transition: 0.3s;
          visibility: hidden;
        }
    
        .active>.nav-expand-content {
          transform: translateX(0);
          visibility: visible;
          box-shadow: 1px 1px 4px 0 rgba(0, 0, 0, .5);
        }
    
        .nav-link {
          display: flex;
          justify-content: space-between;
        }
    
    
    
    
        /* ----------------- Media Queries ----------------- */
    
        @media (min-width: 768px) {
          header li {
            float: left;
          }
    
          header li a {
            padding: 20px 30px;
          }
    
          header .menu {
    
            clear: none;
            float: right;
            max-height: none;
          }
    
    
          header .menu-icon {
            display: none;
          }
        }
      <header>
        <nav>
          <a href="#" class="logo"><i class="fas fa-globe-asia fa-2x"></i><span>Title<br>Title</span></a>
          <input class="menu-btn" type="checkbox" id="menu-btn" />
          <label class="menu-icon" for="menu-btn"><span class="navicon"></span></label>
          <ul class="menu">
            <li><a href="index.php"><i class="fas fa-home mr-2"></i> Accueil</a></li>
            <li class="nav-expand"><a href="#" class="nav-link"><span><i class="fas fa-chalkboard-teacher mr-2"></i> Click
                  here for submenu </span></a>
              <ul class="nav-expand-content">
                <li><a href="">1</a></li>
                <li class="nav-expand"><a href="#" class="nav-link">2</a>
                  <ul class="nav-expand-content">
                    <li><a href="#">2.1</a></li>
                    <li><a href="#">2.2</a></li>
                  </ul>
                </li>
                <li class="nav-expand"><a href="#" class="nav-link">3</a>
                  <ul class="nav-expand-content">
                    <li><a href="#">3.1</a></li>
                    <li><a href="#">3.2</a></li>
                  </ul>
                </li>
                <li class="nav-expand"><a href="#" class="nav-link">4 : click here for another submenu</a>
                  <ul class="nav-expand-content">
                    <li><a href="#">4.1</a></li>
                    <li class="nav-expand"><a href="#" class="nav-link">Test lvl 3</a>
                      <ul class="nav-expand-content">
                        <li class="nav-expand"><a href="#" class="nav-link">Test lvl 4</a>
                          <ul class="nav-expand-content">
                            <li class="nav-expand"><a href="#">Test lvl 5</a></li>
                          </ul>
                        </li>
                      </ul>
                    </li>
                  </ul>
                </li>
                <li><a href="#">5</a></li>
                <li><a href="#">6</a></li>
                <li><a href="#">7</a></li>
                <li><a href="#">8</a></li>
              </ul>
            </li>
          </ul>
        </nav>
      </header>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-07
      • 1970-01-01
      • 1970-01-01
      • 2021-02-26
      • 2022-08-10
      • 2020-06-15
      • 2023-03-04
      • 2018-09-09
      相关资源
      最近更新 更多