如何修复不显示的子菜单?

Posted

技术标签:

【中文标题】如何修复不显示的子菜单?【英文标题】:How can I fix submenu that won't show? 【发布时间】:2020-12-12 01:44:01 【问题描述】:

我目前遇到了一个问题,即我的子菜单未显示在“商店”下。 我不确定是什么导致它保持隐藏状态,我已经参考了 w3schools https://www.w3schools.com/howto/howto_css_subnav.asp 上发布的内容以寻求潜在的修复,但似乎我已经把自己搞砸了。

    #nav 
        position: absolute;
        display: block;
        top: 6em;
        left: 0;
        width: 100%;
        text-align: center;
    

        #nav > ul 
            display: inline-block;
            border-radius: 0.35em;
            box-shadow: inset 0px 0px 1px 1px rgba(255, 255, 255, 0.25);
            padding: 0 1.5em 0 1.5em;
        

            #nav > ul > li 
                display: inline-block;
                text-align: center;
                padding: 0 1.5em 0 1.5em;
            

                #nav > ul > li > ul 
                    display: none;
                

                #nav > ul > li > a, #nav > ul > li > span 
                    display: block;
                    color: #eee;
                    color: rgba(255, 255, 255, 0.75);
                    text-transform: uppercase;
                    text-decoration: none;
                    font-size: 0.7em;
                    letter-spacing: 0.25em;
                    height: 5em;
                    line-height: 5em;
                    -moz-transition: all .25s ease-in-out;
                    -webkit-transition: all .25s ease-in-out;
                    -o-transition: all .25s ease-in-out;
                    -ms-transition: all .25s ease-in-out;
                    transition: all .25s ease-in-out;
                    outline: 0;
                

                #nav > ul > li:hover > a 
                    color: rgb(0, 0, 0);
                

                #nav > ul > li.active > a, #nav > ul > li.active > span 
                    color: rgb(0, 0, 0);
        

        #nav > ul > li > ul:hover > a 
          display: block;
                
<nav id="nav">
            <ul>
                <li class="active"><a href="index.html">Home</a></li>
                <li class="current"><a href="index.html">Book An Appointment</a></li>
                <li><a href="#">Shop</a>
                    <ul>
                        <li><a href="yellow.html">Extensions & Wigs</a></li>
                        <li><a href="blue.html">Candles</a></li>
                    </ul>
                </li>
                <li><a href="left-sidebar.html">Contact</a></li>
            </ul>
        </nav>

【问题讨论】:

【参考方案1】:

您似乎正试图将鼠标悬停在一个甚至还没有在 DOM 中呈现的元素上......但是。看看你的样式表的这个片段。

#nav > ul > li > ul 
   display: none;

#nav > ul > li > ul:hover > a 
   display: block;

您正在为 ul 元素上从未显示过的悬停伪类设置样式。 更好的方法是在列表元素本身上使用悬停类。像这样:

/* from this */
#nav > ul > li > ul:hover > a 
   display: block;


/* to this */
#nav>ul>li:hover ul 
   display: block;
 

此外,由于您的 子菜单 ul 并非绝对放置在 nav 内,它会占用空间并可能导致商店悬停时出现意外的设计更改。

【讨论】:

@peter 感谢您的快速响应,这确实有效,但您对意外的设计更改也是正确的。并不意味着听起来无知,但我没有关注关于子菜单 ul 没有被绝对放置在导航中的部分。是不是因为我没有给它指定ID? 好的。因此,当您使用position: relative 时,它会将您的元素与兄弟元素相关联,并且可能会占用父 div 中的空间。例如,将 2 个小盒子放在一个大盒子里。两个盒子都将占据彼此的空间。但是当您使用position: absolute 时,它会将您的元素相对于最近的相对父级放置。请阅读本文以更好地理解事物。 Difference between css position absolute versus relative【参考方案2】:

这是我在观看一个快速的 youtube 视频后得到的,子菜单现在显示,但整体菜单会自行调整大小

<div class="nav">
            <ul>
                <li>Home</li>
                <li>Book An Appointment</li>
                <li>Shop
                    <ul>
                        <li>Extensions & Wigs</li>
                        <li>Candles</li>
                    </ul>
                </li>
            </ul>
        </div>
.nav 
    position: center;
    display: block;
    top: 6em;
    text-align: center;
    

    .nav ul 
        display: inline-block;
        border-radius: 0.35em;
        box-shadow: inset 0px 0px 1px 1px rgba(255, 255, 255, 0.25);
        padding: 0 1.5em 0 1.5em;
        

        .nav ul li 
            display: inline-block;
            text-align: center;
            padding: 0 1.5em 0 1.5em;
            

            .nav ul ul 
                display: none;
                    
                    .nav ul li 
            display: block;$$
            color: #eee;
            color: rgba(255, 255, 255, 0.75);
            text-transform: uppercase;
            text-decoration: none;
            font-size: 0.8em;
            letter-spacing: 0.25em;
            height: 5em;
            line-height: 5em;
                        float: left;
            -moz-transition: all .25s ease-in-out;
            -webkit-transition: all .25s ease-in-out;
            -o-transition: all .25s ease-in-out;
            -ms-transition: all .25s ease-in-out;
            transition: all .25s ease-in-out;
            outline: 0;
                    

        .nav ul li:hover 
            color: rgb(0, 0, 0);
                
        .nav ul li.active > a, .nav ul li.active > span 
                color: rgb(0, 0, 0);
        

        .nav ul li:hover > ul 
          display: block;
                

【讨论】:

以上是关于如何修复不显示的子菜单?的主要内容,如果未能解决你的问题,请参考以下文章

如何修复jQuery mobile子菜单中标题下方的搜索字段

如何修复下拉菜单?所有选择显示“>”

UITableView 中的子菜单

如何修复导航菜单

如何修复此导航菜单 - 它不会显示

如何修复无法点击的子菜单?