Css从显示无转换到显示块,使用subnav导航

car*_*mba 42 html css css3

这就是我有jsFiddle的链接

nav.main ul ul {
    position: absolute;
    list-style: none;
    display: none;
    opacity: 0;
    visibility: hidden;
    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;
    visibility: visible;
    opacity: 1;
}
Run Code Online (Sandbox Code Playgroud)
<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>
    </ul>
</nav>
Run Code Online (Sandbox Code Playgroud)

为什么没有过渡?如果我订

nav.main ul li:hover ul {
    display: block;
    visibility: visible;
    opacity: 0; /* changed this line */
}
Run Code Online (Sandbox Code Playgroud)

然后"subnav"将永远不会出现(当然),但为什么不透明度的过渡不会触发?如何让过渡工作?

Pau*_*e_D 64

如你所知,display属性不能被动画,但只是通过在你的CSS中它覆盖visibilityopacity过渡.

解决方案......刚刚删除了display属性.

nav.main ul ul {
  position: absolute;
  list-style: none;
  opacity: 0;
  visibility: hidden;
  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 {
  visibility: visible;
  opacity: 1;
}
Run Code Online (Sandbox Code Playgroud)
<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>
  </ul>
</nav>
Run Code Online (Sandbox Code Playgroud)

  • 是的,但是ul会以这种方式占据dom的空间. (33认同)
  • 无所谓,因为您使用绝对定位从正常文档流中删除元素.这是另一篇类似于你的帖子...... http://stackoverflow.com/questions/22103006/css3-transition-doesnt-work-with-display-property.删除`display:none`和`visibility:hidden`. (3认同)
  • 是的,但是这会导致可点击但看不见的链接异常。如果其他元素位于同一空间,则可能会打断它们。 (2认同)
  • 使用键盘导航也会受到干扰,因为按 Tab 键将选择不可见的链接(因此对用户没有可见的影响 - 至少可以说是令人困惑)。 (2认同)

Mat*_*nor 48

通常当人们试图动画display: none他们真正想要的是:

  1. 淡化内容,和
  2. 隐藏时,项目不占用文档中的空间

最流行的答案使用visibility,只能实现第一个目标,但幸运的是,通过使用它同样容易实现position.

由于position: absolute从键入文档流间距中删除了元素,因此可以在position: absoluteposition: static(全局默认值)之间切换,并结合使用opacity.请参阅以下示例.

.content-page {
  position:absolute;
  opacity: 0;
}

.content-page.active {
  position: static;
  opacity: 1;
  transition: opacity 1s linear;
}
Run Code Online (Sandbox Code Playgroud)

  • 如果我在父元素上使用`display:flex`来获得垂直居中的内容(淡出/淡出)会怎么样?`position:absolute`然后打破它. (2认同)
  • [动画`位置`](https://codepen.io/dandv/pen/oQgEME) 在 iOS Safari 上不起作用:-/ (2认同)

spi*_*ift 18

您可以使用动画关键帧而不是过渡来执行此操作.更改悬停声明并添加动画关键帧,您可能还需要为-moz-和-webkit-添加浏览器前缀.有关更多详细信息,请参阅https://developer.mozilla.org/en/docs/Web/CSS/@keyframes.

nav.main ul ul {
    position: absolute;
    list-style: none;
    display: none;
    opacity: 0;
    visibility: hidden;
    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;
    visibility: visible;
    opacity: 1;
    animation: fade 1s;
}

@keyframes fade {
    0% {
        opacity: 0;
    }

    100% {
        opacity: 1;
    }
}
Run Code Online (Sandbox Code Playgroud)
<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>
    </ul>
</nav>
Run Code Online (Sandbox Code Playgroud)

这是你的小提琴的更新.https://jsfiddle.net/orax9d9u/1/

  • 如果您使用此解决方案,请记住它仅适用于淡入。它不适用于淡出,因为立即应用 display:none 。 (4认同)