在鼠标移出时延迟 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
我有一个 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