在鼠标移出时延迟 css:hover 状态

Delay the css:hover state on mouseout

我有一个 2 级下拉菜单,鼠标必须穿过一条非常狭窄的走廊才能保持菜单打开,如果它偏离轨道,菜单会意外关闭,这很令人沮丧。我想让菜单不是立即关闭,而是延迟关闭。

这是一个用css制作的标准菜单,就像这样:

ul.menu li ul {
    display: none;
}
ul.menu li:hover ul {
    display:block;
}

我需要当不再有悬停状态时,菜单仍然可见至少 0.5 秒。

已经试过了,但没用:

<script>
$( ".menu li" ).mouseout(function() {
    $(".menu li ul").css("display: block");
    $(".menu li ul").css.setTimeout("display: none", 2000);
});
</script>

试试这个:使用具有可见性的 CSS3 的 属性 过渡,您可以使其平滑。根据您的要求增加过渡时间(以秒为单位)。

ul.menu li ul {
  visibility: hidden;
  opacity: 0;
}
ul.menu li:hover ul {
  visibility: visible;
  transition: visibility 0s, opacity 1.5s linear;
  opacity: 1;
}
<ul class="menu">
  <li>Menu
     <ul>
      <li>Menu inside menu</li>
     </ul>
  </li>
</ul>

注意:我已经将 class "menu" 给了 ul,因此更改了 css classes。请相应地更改您的代码

您可以像这样使用转换:

ul.menu {
  position: relative;
  background: lime;
  width: 150px;
}

ul.menu li ul {
  position: absolute;
  background: red;
  visibility: hidden;
  opacity: 0;
  right: 0;
  margin-top: -14px;
  transition: visibility 1.5s linear 1s, opacity 1.5s linear 1s;
}

ul.menu li:hover ul {
  visibility: visible;
  opacity: 1;
  transition: visibility 0s, opacity 0s;
}
<ul class="menu">
  <li>
    link a
  </li>
  <li>
    link b
    <ul>
      <li>link b - 1</li>
      <li>link b - 2</li>
    </ul>
  </li>
  <li>
    link c
  </li>
</ul>

您可以使用带有延迟的过渡,使其在悬停时保持可见:

.nested {
  pointer-events:none;       /* this is so it behaves like display none and mouse does not interact with child when hidden */
  opacity: 0;
  transition: opacity 0.1s;  /* change length to longer for a nicer fade */
  transition-delay: 1s;      /* fadeout won't happen for a second */
}
.hover:hover .nested {
  pointer-events: auto;
  opacity: 1;
  transition: opacity 0.1s;    /* fade in when hovered */
  transition-delay: 0s;        /* fade in immediately */
}
<div class="hover">
  hover
  <div class="nested">
  nested
  </div>
</div>

在上面,您的 ul 将是 .nested 而您的 parent li 将是 .hover