【问题标题】:CSS menu drop down push down itemsCSS菜单下拉下推项目
【发布时间】:2017-10-04 18:33:57
【问题描述】:

我有一个垂直导航菜单,上面有父项和非父项。我希望父母在悬停时显示他们的孩子页面,并且我希望这可以推动上面的项目。 HTML:

<nav class="main">
    <ul>
        <li>
            <a href="">Lorem</a>
            <ul>
                <li><a href="">Ipsum</a></li>
                <li><a href="">Dolor</a></li>
                <li><a href="">Sit</a></li>
                <li><a href="">Amet</a></li>
            </ul>
        </li>
        <li>Something</li>
    </ul>
</nav>

CSS:

nav.main ul ul {
    display: none
}

nav.main ul li:hover ul {
    display: block;
}

但是当鼠标离开父项时,子项消失并且菜单发生变化,这是令人不安的,因为鼠标的指针突然在不同的项上(例如:鼠标从“Amet”移动到“Something”)。所以我所做的是使用平滑过渡,但在这种情况下,“显示”不再起作用,“可见性”不会压低孩子,它们只是作为菜单上的第二层出现。在https://jsfiddle.net/LgvhLxya/1/ 的示例中,我希望在显示“Lorem”的孩子时将项目“Something”下推。

【问题讨论】:

  • 当你将鼠标悬停在 lorem 时,它已经将子元素向下推了。
  • 是的,但请尝试将鼠标从 Amet 移开并单击某物。块不再显示的方式令人不安,并且在长菜单中是不可能的。

标签: html css


【解决方案1】:

CSS

nav.main ul ul {
    height: 0;
    box-sizing: border-box;
    list-style: none;
    padding: 0;
    opacity: 0;
    visibility: hidden;
    //padding: 10px;
    background-color: rgba(92, 91, 87, 0.9);
    -webkit-transition: opacity 600ms, height 600ms;
            transition: opacity 600ms, height 600ms;
}

nav.main ul li:hover ul {
    height: auto;
    visibility: visible;
    opacity: 1;
}

nav.main ul li:hover ul {
   padding-left: 10px;
}

nav.main ul li:hover ul a {
   color: #fff;
}
<nav class="main">
    <ul>
        <li>
            <a href="">Lorem</a>
            <ul>
                <li><a href="">Ipsum</a></li>
                <li><a href="">Dolor</a></li>
                <li><a href="">Sit</a></li>
                <li><a href="">Amet</a></li>
            </ul>
        </li>
        <li>Something</li>
    </ul>
</nav>

JSFiddle example

【讨论】:

  • 这几乎是我想要的,当悬停完成时过渡不起作用,所以如果你明白我的意思,我仍然有那个尴尬的鼠标位置问题。不过感谢您的帮助!
【解决方案2】:

1)使用display 代替visibility

2)使用position: relative代替position: absolute;

完整代码:

nav.main ul ul {

    position: relative;
    list-style: none;
    opacity: 0;
    display: none;
    padding: 10px;
    background-color: rgba(92, 91, 87, 0.9);
    -webkit-transition: opacity 600ms, visibility 600ms;
    transition: opacity 600ms, visibility 600ms;
}

nav.main ul li:hover ul {
    display: block;
    opacity: 1;
}
<nav class="main">
    <ul>
        <li>
            <a href="">Lorem</a>
            <ul>
                <li><a href="">Ipsum</a></li>
                <li><a href="">Dolor</a></li>
                <li><a href="">Sit</a></li>
                <li><a href="">Amet</a></li>
            </ul>
        </li>
        <li>Something</li>
    </ul>
</nav>

【讨论】:

  • Wekkit-transition 不适用于显示,不过感谢您的帮助!
【解决方案3】:

嗯,没有必要在ul 上使用position:absolute,因为您正在使用它,因此它正在创建另一层menu。你已经使用了css hover selector,它可以工作或performs 某些styling 直到你的mouse 是目标element 一旦超出范围,它就会隐藏lorem li 元素something 出现,所以要解决这个问题,您可以使用 jQuery click 事件监听器,如下所示,

检查这个jsFiddle

如果您只需要在ul 标记上执行transition,请使用visibility。因为transition 不能与display 一起使用。

nav.main > ul > li > ul {
  display: block;
  height:0px;
  visibility:hidden;
  opacity:0;
  transition:0.2s ease;
}

nav.main > ul  > li:hover > ul {
  height:80px;
  visibility:visible;
  opacity:1;
}
<nav class="main">
    <ul>
        <li>
            <a href="">Lorem</a>
            <ul>
                <li><a href="">Ipsum</a></li>
                <li><a href="">Dolor</a></li>
                <li><a href="">Sit</a></li>
                <li><a href="">Amet</a></li>
            </ul>
        </li>
        <li><a href="">Something</a></li>
        <li><a href="">Something</a></li>
        <li><a href="">Something</a></li>
    </ul>
</nav>

【讨论】:

  • 感谢您提供如此清晰而完整的答案,我们成功了!我的问题是我希望在父级上单击以进入实际页面,因此我需要通过悬停显示子级。不确定 JS 是否能处理这个问题?
  • 欢迎@Twister013,你可以检查上面代码中的jQuery点击和上面代码中的css悬停,我都添加了。
  • 这正是我所需要的,你是我的救星,非常感谢;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-22
  • 2011-01-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多