下拉菜单的 CSS 转换在响应式菜单的移动/汉堡视图中不起作用

问题描述 投票:0回答:0

如果您最近从我这里读到类似的内容,我深表歉意,但我已经更改了很多代码并遇到了不同的问题,并且想重新开始而不是不断地重新编辑和回复我的原始帖子。

我用 CSS 和 vanilla javascript 构建了一个响应式可点击下拉菜单。我希望下拉列表能够平滑地过渡进出 - 但出于某种原因,过渡效果在移动视图(这是我首先构建的 CSS)中不起作用 - 仅在扩展的浏览器视图中(在最小断点处 -宽度:768 像素)。在这个菜单的开发过程中有很多点,其中过渡在移动模式下工作得很好;由于我还没有弄清楚的原因,它一直有效并且无法正常工作。当被破坏时,就像现在一样,它的行为是在出现或消失之前暂停过渡的长度。

因为转换根本无法使用 display:none/display:block 切换,我使用 max-height: 0; overflow: hidden 作为默认 CSS 来隐藏下拉菜单。 javascript 切换一个 max-height: 800% 的类,以及一个重新设置按钮样式以突出显示它的单独类。 (我会使用最大高度:100%,但出于某种原因,在扩展模式下,下拉菜单继承了导航栏和/或 .menu__box 的 60px 固定高度。我决定不与正在发生的任何事情作斗争除非你们都告诉我这是问题的一部分。)当您在按钮区域外单击时,javascript 也会删除这些类。我不认为 javascript 本身是问题,因为它似乎确实完成了切换我需要的类的工作,但为了完整起见,我将它包括在这里。

转换的主要 CSS 片段在这里,在隐藏下拉菜单的代码中:

.shows__dropdownhider, .more__dropdownhider {max-height: 0; overflow: hidden; min-width: 165px;
   -webkit-transition-duration: .25s;
   -moz-transition-duration: .25s;
   -o-transition-duration: .25s;
   transition-duration: .25s;}

我也尝试专门针对 max-height 属性,但没有任何区别:

.shows__dropdownhider, .more__dropdownhider {max-height: 0; overflow: hidden; min-width: 165px;
   -webkit-transition: max-height .25s ease;
   -moz-transition: max-height .25s ease;
   -o-transition: max-height .25s ease;
   transition: max-height 0.25s ease;}

请注意,我故意不使用 Bootstrap 或任何其他带有大量内置 CSS 的东西,因为我必须将这个菜单集成到一个有 25 年历史的网站中,该网站有成百上千的存档页面,可以追溯到它还是一个框架的时候- 基于网站,每个页面都是用表格构建的!啊,1998 年......(事实上,目前网站上有一个基于 Bootstrap 的菜单,它让很多非常旧的页面变得繁荣。这就是为什么我试图写一些独立的东西来取代它。)

现场演示。是的,我知道内容不在页面的正确语义部分;当我完成它时,CSS 最终会被分割成一个合适的 .css 文件。

编码

感谢您的帮助!

菜单 HTML(插入符是一个 Fontawesome 向下插入符图标):

<nav>

  <div class="logo">

<a class="ourname" href="#">
<img src="http://www.sacredfools.org/images/2d-logo-white-on-black-500px-128x128.png">
SACRED FOOLS</a></div>

    <input type="checkbox" id="menutoggler" class="toggler">
    <div class="hamburger"><div></div></div>

  <ul class="menu__box">

    <li><a class="menu__item" href="#">TICKETS</a></li>

<div class="dropdownholder">
    <li class="shows__dropbtn"><a class="menu__item shows__dropbtn" id="shows__button" onclick="shows__dropdown()">SHOWS
             <i class="fa-solid fa-caret-down"></i></a></li>

        <li class="shows__dropdownhider" id="shows__dropdowncontainer">
           <a class="menu__dropdownitem" href="#">All Shows</a>
           <a class="menu__dropdownitem" href="#">Calendar</a>
           <a class="menu__dropdownitem menu__lastdropdown" href="#">Past Productions</a>
        </li>
</div>

<div class="dropdownholder">
    <li class="more__dropbtn"><a class="menu__item more__dropbtn" id="more__button" onclick="more__dropdown()">MORE
             <i class="fa-solid fa-caret-down"></i></a></li>

        <li class="more__dropdownhider" id="more__dropdowncontainer">
           <a class="menu__dropdownitem" href="#">Directions</a>
           <a class="menu__dropdownitem" href="#">Members & Staff</a>
           <a class="menu__dropdownitem" href="#">Get Involved</a>
           <a class="menu__dropdownitem" href="#">About</a>
           <a class="menu__dropdownitem" href="#">Mission</a>
           <a class="menu__dropdownitem" href="#">Anti-Racism</a>
           <a class="menu__dropdownitem" href="#">EDI</a>
           <a class="menu__dropdownitem" href="#">Education & Outreach</a>
           <a class="menu__dropdownitem" href="#">Press</a>
           <a class="menu__dropdownitem" href="#">Awards</a>
           <a class="menu__dropdownitem" href="#">Contact Us</a>
           <a class="menu__dropdownitem" href="#">Mailing List</a>
           <a class="menu__dropdownitem menu__lastdropdown" href="#">Search</a>
        </li>
</div>

    <li><a class="menu__item menu__highlight menu__lastitem" href="#">DONATE</a></li>

        <li><a class="menu__item menu__social" href="#"><i class="fa-brands fa-square-facebook"></i></a></li>
        <li><a class="menu__item menu__social" href="#"><i class="fa-brands fa-square-twitter"></i></a></li>
        <li><a class="menu__item menu__social" href="#"><i class="fa-brands fa-square-instagram"></i></a></li>

    </ul>
  
</nav>

<div class="menuspacer"></div>

下拉切换按钮的 Javascript:

/* SHOWS Dropdown */

function shows__dropdown() {
  document.getElementById("shows__dropdowncontainer").classList.toggle("menu__dropdownshow");
  document.getElementById("shows__button").classList.toggle("menu__toggledon");
}


/* MORE Dropdown */

function more__dropdown() {
  document.getElementById("more__dropdowncontainer").classList.toggle("menu__dropdownshow");
  document.getElementById("more__button").classList.toggle("menu__toggledon");
}

/* Close dropdowns when clicking outside */

window.onclick = function(e) {

  if (!e.target.matches('.shows__dropbtn')) {
  var shows__dropdowncontainer = document.getElementById("shows__dropdowncontainer");
    if (shows__dropdowncontainer.classList.contains('menu__dropdownshow')) {
      shows__dropdowncontainer.classList.remove('menu__dropdownshow');
    }
  }

  if (!e.target.matches('.shows__dropbtn')) {
  var shows__button = document.getElementById("shows__button");
    if (shows__button.classList.contains('menu__toggledon')) {
      shows__button.classList.remove('menu__toggledon');
    }
  }

  if (!e.target.matches('.more__dropbtn')) {
  var more__dropdowncontainer = document.getElementById("more__dropdowncontainer");
    if (more__dropdowncontainer.classList.contains('menu__dropdownshow')) {
      more__dropdowncontainer.classList.remove('menu__dropdownshow');
    }
  }


  if (!e.target.matches('.more__dropbtn')) {
  var more__button = document.getElementById("more__button");
    if (more__button.classList.contains('menu__toggledon')) {
      more__button.classList.remove('menu__toggledon');
    }
  }

}

</script>

CSS(汉堡包按钮的 .toggler/.hamburger 代码是从别处复制的,我不太明白它是如何工作的;剩下的是我自己的代码):

body, html {
  height: 100%;
  width: 100%;
  margin: 0; padding: 0;
}

nav {background-color: #282828;
     padding: 0; margin: 0;
     position: fixed; top: 0; left: 0;
     width: 100%; z-index: 2;
}

nav, .menuspacer {height: 60px}

.logo {color: #ffffff; font-size: 12pt; float: left;
   font-family: 'Montserrat', sans-serif; font-weight: bold; z-index: 3;
     text-shadow: 2px 2px 6px rgba(0, 0, 0, 0.7);
   }

.logo img {height: 60px; margin-left: 0px; margin-right: 5px; margin-top: 0px; margin-bottom: 0px;
 vertical-align:middle;}

a.ourname:link, a.ourname:visited, a.ourname:hover, a.ourname:active
 {text-decoration: none; color: #ffffff;}

.toggler{
    z-index:2;
    height: 50px;
    width: 50px;
    position: absolute;
    top: 0;
    right: 0;
    cursor: pointer;
    opacity: 0;
}

.hamburger{
    position: absolute;
    top: 0;
    right: 0;
    height: 40px;
    width: 40px;
    padding: 0.6rem;
    display: flex;
    align-items: center;
    justify-content: center;
}

.hamburger > div{
    position: relative;
    top: 0;
    left: 0;
    background: white;
    height: 2px;
    width: 60%;
    transition: all  0.4s ease;
}

.hamburger > div::before,
.hamburger > div::after{
    content: '';
    position: absolute;
    top: -8px;
    background: white;
    width: 100%;
    height: 2px;
    transition: all  0.4s ease;
}

.hamburger > div::after{
    top: 8px;
}

.toggler:checked + .hamburger > div{
    background: rgba(0,0,0,0);
}

.toggler:checked + .hamburger > div::before{
    top: 0;
    transform: rotate(45deg);
    background: white;
}

.toggler:checked + .hamburger > div::after{
    top: 0;
    transform: rotate(135deg);
    background: white;
}

.toggler:checked ~ .menu__box{
    left: 0px;
}

.menu__box {
  position: fixed;
  top: 60px;
  left: -100%;
  width: 280px;
  height: -moz-calc(100% - 60px);
  height: -webkit-calc(100% - 60px);
  height: -o-calc(100% - 60px);
  height: calc(100% - 60px);
  box-sizing: border-box;
  margin: 0px;
  padding-left: 0;
  list-style: none;
  background-color: #282828;
  transition: all 0.4s ease;
  overflow: auto;
  z-index: 1;
}

.menu__item {
  display: block; float: none;
  padding: 11px;
  color: #ffffff;
  font-family: 'Open Sans', sans-serif;
  font-size: 12pt;
  font-weight: 600;
  text-decoration: none;
  transition-duration: .25s;
  border-top: 1px dotted #ffffff;
}

.dropdownholder {position: relative}

.menu__dropdownitem {
  display: block;
  padding-top: 5px;
  padding-left: 30px;
  padding-right: 11px;
  padding-bottom: 5px;
  color: #ffffff;
  font-family: 'Open Sans', sans-serif;
  font-size: 12pt;
  font-weight: 600;
  text-decoration: none;
  transition-duration: .25s;
}

.shows__dropdownhider, .more__dropdownhider {max-height: 0; overflow: hidden; min-width: 165px;
   -webkit-transition-duration: .25s;
   -moz-transition-duration: .25s;
   -o-transition-duration: .25s;
   transition-duration: .25s;}

.menu__dropdownshow {max-height: 800%}

.shows__dropbtn, .more__dropbtn {cursor: pointer;}

.menu__lastdropdown {padding-bottom: 11px}

.menu__lastitem {border-bottom: 1px dotted #ffffff;}

.menu__item:hover, .menu__item:active,
.menu__dropdownitem:hover, .menu__dropdownitem:active {color: #FB0901}

.menu__item:hover, .menu__item:active,
.menu__dropdownitem:hover, .menu__dropdownitem:active {background-color: #000000}

.menu__highlight {background-color: #404040}

.menu__social {float: left; border: none; font-size: 20pt}

.menu__social:hover, .menu__social:active {background-color: transparent}

.fa-caret-down {margin: 5px; font-size: 8pt; float: right}

.menu__toggledon {color: #FB0901; background-color: #000000;}


@media (min-width: 768px) {

.toggler, .hamburger {display: none}

.toggler:checked ~ .menu__box{
    left: auto;
}

.menu__box {
  display: flex;
  align-items: center;
  flex-direction: row;
  position: static;
  float: right;
  top: 0px;
  right: 0px;
  left: auto;
  width: auto;
  height: 60px;
  min-height: auto;
  box-sizing: content-box;
  margin: 0;
  padding: 0;
  list-style: none;
  box-shadow: none;
  overflow: visible;
  background-color: transparent;
  z-index: 3;
  margin: 0;
  transition: all 0s ease;
}

.menu__item {
  padding-left: 15px; padding-right: 15px;
  padding-top: 0px; padding-bottom: 0px;
  margin: 0px;
  font-family: 'Open Sans Condensed', sans-serif;
  font-size: 12pt;
  font-weight: 700;
  text-decoration: none;
  transition-duration: .25s;
  border-top: none;
  padding-top: 19px; padding-bottom: 19px;
  text-shadow: 2px 2px 6px rgba(0, 0, 0, 0.7);
}

.menu__social {font-size: 15pt; padding-left: 10px; padding-right: 10px; padding-top: 0px; padding-bottom: 0px; margin: 0px;}

.final__social {padding-right: 15pt}

.menu__social:hover, .menu__social:active {text-shadow: 1px 1px 1px rgba(255,255,255, .75);}

.menu__dropdownitem {
  display: block;
  padding-top: 5px;
  padding-left: 11px;
  padding-right: 11px;
  padding-bottom: 5px;
  color: #ffffff;
  font-family: 'Open Sans Condensed', sans-serif;
  font-size: 12pt;
  font-weight: 700;
  text-decoration: none;
  transition-duration: .25s;
  background-color: #000000;
}

.shows__dropdownhider, .more__dropdownhider {
  position: absolute; background-color: #282828;
 }

.menu__lastitem {border-bottom: none;}

.fa-caret-down {margin-left: 5px; font-size: 12pt; float: none;
 padding: 0px; margin-right: 0px; margin-top: 0px; margin-bottom: 0px}

.menu__highlight {background-color: transparent;
   font-family: 'Roboto', sans-serif; font-size: 9pt; font-weight: 500;
   border: 1px solid #ffffff;
   padding: 10px; margin-left: 10px; margin-right: 10px;
   border-radius: 5px; box-shadow: 2px 2px 6px rgba(0,0,0,0.5);
   text-shadow: none;}

.menu__highlight:hover, .menu__highlight:active {background-color: #ffffff; color: #000000;}

.menu__box :nth-child(4) {order: 1;}

}
drop-down-menu css-transitions
© www.soinside.com 2019 - 2024. All rights reserved.