You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Sidenav下拉子菜单移出主项悬停后消失的问题求助

解决侧边导航悬停下拉菜单移出主项消失的问题

嘿Tom,我完全懂你的困扰——当下拉菜单刚弹出来,你鼠标移过去的瞬间,因为离开了主菜单项的hover范围,下拉就直接消失了,而且主菜单项还得保留跳转功能,不能改成点击触发。咱们调整一下CSS的逻辑就能搞定,核心思路是把hover状态绑定到包含主链接和下拉的父容器上,而不是单独的主链接。

问题根源

你原来的代码是监听主<a>标签的hover来显示下拉,但下拉是主链接的兄弟元素,当鼠标移到下拉上时,主链接的hover状态就消失了,下拉自然也就隐藏了。而且下拉和主链接之间还有空隙,鼠标移过去的时候会经过这个空隙,直接导致hover中断。

修复方案

我们把hover触发逻辑转移到父容器(比如#Producten#Trainers这些包裹主链接和下拉的div)上,同时调整下拉的定位,让它和主链接紧挨着,消除空隙。这样只要鼠标在父容器范围内(包括主链接和下拉),hover状态就会保持,下拉也不会消失。

以下是修改后的完整代码:

CSS 部分

/* Style the links inside the sidenav */
#mySidenav a {
  position: absolute; /* Position them relative to the browser window */
  left: -80px; /* Position them outside of the screen */
  transition: 0.3s; /* Add transition on hover */
  padding: 15px; /* 15px padding */
  width: 100px; /* Set a specific width */
  text-decoration: none; /* Remove underline */
  font-size: 12px; /* Increase font size */
  color: white; /* White text color */
  border-radius: 0 5px 5px 0; /* Rounded corners on the top right and bottom right side */
}

/* 给包含下拉的父容器设置相对定位和固定高度,确保hover范围正确 */
#Producten, #Trainers, #Contact {
  position: relative;
  height: 45px; /* 和主链接的高度匹配 */
}

/* 父容器hover时,主链接滑入 */
#Home:hover a,
#Info:hover a,
#Producten:hover a,
#Trainers:hover a,
#Contact:hover a,
#FAQ:hover a {
  left: 0;
}

/* 主菜单项样式 */
.Home {
  top: 20px;
  background-color: #4CAF50;
}
.Info {
  top: 80px;
  background-color: #2196F3; /* Blue */
}
.Producten {
  top: 140px;
  background-color: #f44336; /* Red */
}
.Trainers {
  top: 200px;
  background-color: #555 /* Light Black */
}
.Contact {
  top: 260px;
  background-color: purple;
}
.FAQ {
  top: 320px;
  background-color: rgba(245, 240, 15, 0.7)
}

/* 下拉菜单基础样式:默认隐藏,添加过渡效果 */
.DropdownGroepstraining,
.DropdownPrivetraining,
.DropdownTrajectopmaat,
.DropdownPieter,
.DropdownLaura,
.DropdownYannick,
.DropdownSander,
.DropdownNick,
.DropdownContactform,
.DropdownFacebook,
.DropdownInsta {
  position: absolute;
  left: 100%; /* 刚好在主链接右侧,消除空隙 */
  margin-left: 0;
  opacity: 0;
  visibility: hidden;
  transition: all 0.3s;
}

/* 父容器hover时,显示对应的下拉菜单 */
#Producten:hover .DropdownGroepstraining {
  top: 0;
  opacity: 1;
  visibility: visible;
}
#Producten:hover .DropdownPrivetraining {
  top: 45px;
  opacity: 1;
  visibility: visible;
}
#Producten:hover .DropdownTrajectopmaat {
  top: 90px;
  opacity: 1;
  visibility: visible;
}

#Trainers:hover .DropdownPieter {
  top: 0;
  opacity: 1;
  visibility: visible;
}
#Trainers:hover .DropdownLaura {
  top: 45px;
  opacity: 1;
  visibility: visible;
}
#Trainers:hover .DropdownYannick {
  top: 90px;
  opacity: 1;
  visibility: visible;
}
#Trainers:hover .DropdownSander {
  top: 135px;
  opacity: 1;
  visibility: visible;
}
#Trainers:hover .DropdownNick {
  top: 180px;
  opacity: 1;
  visibility: visible;
}

#Contact:hover .DropdownContactform {
  top: 0;
  opacity: 1;
  visibility: visible;
}
#Contact:hover .DropdownFacebook {
  top: 45px;
  opacity: 1;
  visibility: visible;
}
#Contact:hover .DropdownInsta {
  top: 90px;
  opacity: 1;
  visibility: visible;
}

/* 下拉菜单背景色保持和主菜单一致 */
.DropdownGroepstraining, .DropdownPrivetraining, .DropdownTrajectopmaat {
  background-color: #f44336;
}
.DropdownPieter, .DropdownLaura, .DropdownYannick, .DropdownSander, .DropdownNick {
  background-color: #555;
}
.DropdownContactform, .DropdownFacebook, .DropdownInsta {
  background-color: purple;
}

HTML 部分(无需修改,保留原代码即可)

<nav>
  <div id="mySidenav" class="sidenav">
    <div id="Home"><a href="Default.aspx" class="Home">Home</a></div>
    <div id="Info"><a href="Info.aspx" class="Info">Info</a></div>
    <div id="Producten"><a href="Producten.aspx" class="Producten">Producten</a>
      <a href="Groepstraining.aspx" class="DropdownGroepstraining">Groepstraining</a>
      <a href="Privetraining.aspx" class="DropdownPrivetraining">Privétraining</a>
      <a href="TrajectOpMaat.aspx" class="DropdownTrajectopmaat">Traject op maat</a>
    </div>
    <div id="Trainers"><a href="Trainers.aspx" class="Trainers">Trainers</a>
      <a href="PieterGeerts.aspx" class="DropdownPieter">Pieter Geerts</a>
      <a href="LauraVanBaekel.aspx" class="DropdownLaura">Laura Van Baekel</a>
      <a href="YannickMaes.aspx" class="DropdownYannick">Yannick Maes</a>
      <a href="SanderGeerts.aspx" class="DropdownSander">Sander Geerts</a>
      <a href="NickVanCamp.aspx" class="DropdownNick">Nick Van Camp</a>
    </div>
    <div id="Contact"><a href="Contact.aspx" class="Contact">Contact</a>
      <a href="Contactformulier.aspx" class="DropdownContactform">Contactformulier</a>
      <a href="https://www.facebook.com/ttkempen/" target="_blank" class="DropdownFacebook"><img id="navfacebooklogo" src="images/facebooklogo.png" />Facebook</a>
      <a href="https://www.instagram.com/tt_kempen/?hl=nl" target="_blank" class="DropdownInsta"><img id="navinstagramlogo" src="images/instagramlogo.png" />Instagram</a>
    </div>
    <div id="FAQ"><a href="FAQ.aspx" class="FAQ">FAQ</a></div>
  </div>
</nav>

关键修改点说明

  1. 父容器绑定hover:把原来的#Producten a:hover改成#Producten:hover a,这样只要鼠标在父容器(包括主链接和下拉)上,主链接就保持显示状态。
  2. 消除下拉空隙:把下拉的margin-left:140px改成left:100%,让下拉刚好贴在主链接右侧,鼠标移过去不会经过空白区域导致hover中断。
  3. 过渡效果优化:用opacityvisibility替代display:none,让下拉显示/隐藏更平滑,同时避免display属性无法过渡的问题。
  4. 父容器定位与高度:给父容器设置position:relative和固定高度,确保下拉的定位参考正确,且hover范围覆盖主链接的区域。

这样修改后,你鼠标移到主菜单项上,下拉会正常显示,移到下拉菜单上时,因为父容器的hover状态保持,下拉不会消失,点击主链接也依然能跳转到目标页面,完美解决你的需求!

内容的提问来源于stack exchange,提问作者Tom Vermeeren

火山引擎 最新活动