当只有一个子菜单被悬停时,防止多个子菜单同时可见(由于转换延迟)

Posted

技术标签:

【中文标题】当只有一个子菜单被悬停时,防止多个子菜单同时可见(由于转换延迟)【英文标题】:Prevent multiple submenu's from being visible at the same time (due to transition delay) when only one is being hovered 【发布时间】:2016-05-04 01:27:01 【问题描述】:

在这里更新了代码示例。

很难用标题来概括,我做了一个代码笔来显示正在发生的事情:

http://codepen.io/erikdevos/pen/eJMmpy

    /* menu container styling  */
#nav 
    background: #f5f5f5;
    width:500px;
    display:flex;


/* style all unondered lists */
ul 
    text-decoration: underline;
    list-style-type: none;
    background: #cecece;


/* give submenu different background */
ul li ul 
    background: #e3e3e3;


/* add pointer to menu */
ul:hover 
    cursor: pointer;


/* make menu items visible when menu is hovered */
ul:hover > li 
    visibility: visible;
    transition-delay: 0s;


/* make menu items 
and add transition delay */
ul > li 
    visibility: hidden;
    transition-delay: .5s;

ul li:hover li 
    visibility: visible;
    transition-delay: 0s;


ul li:hover ul 
    visibility: visible;
    transition-delay: 0s;

菜单 html 看起来像这样

<div id="nav">

            <ul>MENU
                <li>item 1</li>
                <li>item 1</li>
                <li>submenu 1
                    <ul>
                        <li>item 1</li>
                        <li>item 2</li>
                        <li>item 3</li>
                    </ul>
                </li>
                <li>submenu 2
                    <ul>
                        <li>item 1</li>
                        <li>item 2</li>
                        <li>item 3</li>
                    </ul>
                </li>
                <li>submenu 3
                    <ul>
                        <li>item 1</li>
                        <li>item 2</li>
                        <li>item 3</li>
                    </ul>
                </li>
            </ul>

</div>

我制作了一个包含一些子菜单的菜单,并为可见性添加了过渡延迟:悬停/离开悬停时的“可见”和“隐藏”css 属性,以防止菜单在您移出菜单时过早消失。

但是,当您快速悬停多个项目时,这也会导致同时打开多个子菜单。 (你可以在笔中看到这个)

当另一个子菜单项正在显示时,我不知何故需要剪切子菜单的动画/过渡!

在 CSS 中我无能为力,这主要是我的领域,但我感觉 javascript 或 jQuery 可以以某种方式监控属性和元素,并在元素 B 悬停时将元素 A 的转换延迟设置为 0 .这是一个可行的解决方案,还是有其他功能?

【问题讨论】:

当另一个子菜单悬停时,您可能需要使用 JavaScript 隐藏子菜单 基本上,这是我的问题,是的。 【参考方案1】:

添加ul li:hover li transition-delay: 5s 不会出现,而其他li with transition-delay: 4s 不隐藏

或者像这样使用一些

 $('ul').find('li').each($('this').css('visibility','hidden'));

【讨论】:

恐怕这两种解决方案都无法解决我的问题。也许我没有正确解释情况。当您悬停菜单项时,会出现一个子菜单。当您用鼠标离开此子菜单时,会有一个(css 转换)延迟,以防止您意外移动和关闭菜单。但是,当您将鼠标悬停在出现子菜单的多个菜单项上时,它们都会停留在设置的“转换延迟”时间。我想更改此设置,以便当另一个项目悬停/可见时,任何其他仍在“过渡”/延迟的项目将关闭(或只是将延迟更改为 0)【参考方案2】:

显示所有菜单 HTML 代码(你放了链接,但我无法在我的旧浏览器和低速互联网中打开网站)以便于理解你在哪里显示女巫元素。因为如果我将您的 html 代码放入文件并打开,则不会显示任何内容,因为 li 设置为 visibility:hidden。这里怎么能被点击或鼠标悬停。

css 不会更改 css。试试jquery。你还想要什么?

$('ul').find('li').each( if($(this).attr('hovered')=='not') $('this').css('display','none');  );

你还有待确定如何在jquery中确定悬停元素($(this).attr('hovered')==not

【讨论】:

我更新了主帖中的代码,它现在拥有完整的 html 和 css。

以上是关于当只有一个子菜单被悬停时,防止多个子菜单同时可见(由于转换延迟)的主要内容,如果未能解决你的问题,请参考以下文章

带有悬停子菜单的固定菜单有点关闭

鼠标悬停时打开角度材质菜单

子菜单 - 保持父元素的最大宽度

悬停时子菜单不可见

jQuery 下拉问题(无法保持子菜单可见)

多级子菜单不会在点击时关闭子菜单