我目前正在设计一个CSS“巨型下拉菜单”——基本上是一个常规的仅限CSS的下拉菜单,但包含不同类型的内容。

目前,CSS 3转换似乎不适用于“display”属性,也就是说,您不能进行从display:none到display:block(或任何组合)的任何转换。

当有人悬停在一个顶级菜单项上时,上面示例中的第二层菜单是否有办法“淡入”?

我知道你可以在visibility:属性上使用转换,但我想不出一种有效的方法。

我也尝试过使用高度,但那只是失败得很惨。

我也意识到,使用JavaScript实现这一点很简单,但我想挑战一下自己,只使用CSS,我觉得我做得有点短。


当前回答

我有一个类似的问题,但我找不到答案。后来几次谷歌搜索把我带到了这里。考虑到我没有找到我所希望的简单答案,我偶然发现了一个既优雅又有效的解决方案。

结果表明,可见性CSS属性具有一个值折叠,通常用于表项。然而,如果在任何其他元素上使用,它会有效地将它们渲染为隐藏的,与显示几乎相同:隐藏,但添加了元素不占用任何空间的功能,您仍然可以为有问题的元素设置动画。

下面是一个简单的例子。

函数toggleVisibility(){let exampleElement=document.querySelector('span');if(exampleElement.classList.incontains('visible')){回来}exampleElement.innerHTML='我不会占用空间!';exampleElement.classList.tggle('hidden');exampleElement.classList.tggle('visible');setTimeout(()=>{exampleElement.classList.tggle('visible');exampleElement.classList.tggle('hidden');}, 3000);}#主要的,主要的{显示:柔性;弯曲方向:柱;宽度:300px;文本对齐:居中;}.隐藏{可见性:塌陷;不透明度:0;过渡:可见性2s,不透明度2s线性;}.可见{可见性:可见;不透明度:1;过渡:可见性0.5s,不透明度0.5s线性;}<div id=“main”><button onclick=“toggleVisibility()”>单击我</按钮><span class=“hidden”></span><span>我会被推回去</span></div>

其他回答

从这些答案和其他地方的一些建议中,以下内容非常适合悬停菜单(我在Bootstrap 3中使用了这一点):

nav .dropdown-menu {
    display: block;
    overflow: hidden;
    max-height: 0;
    opacity: 0;
    transition: max-height 500ms, opacity 300ms;
    -webkit-transition: max-height 500ms, opacity 300ms;
}
nav .dropdown:hover .dropdown-menu {
    max-height: 500px;
    opacity: 1;
    transition: max-height 0, opacity 300ms;
    -webkit-transition: max-height 0, opacity 300ms;
}

如果同时指定两个值,也可以使用height代替max height,因为height:auto不允许用于过渡。最大高度的悬停值需要大于菜单的高度。

在这种情况下不使用关键帧应用过渡的另一种方法是将元素的宽度设置为零,然后在悬停时取消设置

.className{
  visibility:hidden;
  opacity: 0;
  transition: .2s;
  width:0;
}

.className:hover{
  visibility:visible;
  margin-right: .5rem;
  opacity: 1;
  width:unset;
}

显示不是转换工作的财产之一。

有关可以应用转换的CSS财产的列表,请参阅动画CSS财产。请参阅CSS值和单位模块第4级,组合值:插值、相加和累加,了解如何插值。

9.1中列出了CSS 3。来自CSS的财产(只需关闭警告弹出窗口)

我也尝试过使用高度,但那只是失败得很惨。

上次我不得不这样做时,我使用了max height,这是一个可设置动画的属性(虽然它有点黑客,但确实有效),但要注意,对于复杂的页面或使用低端移动设备的用户来说,它可能非常刺耳。

此解决方案具有极好的兼容性,我还没有见过它:

.hidden-element {
  position: absolute;
  z-index: -1;
  pointer-events: none;
  visibility: hidden;
  opacity: 0;
  transition: visibility 0s, opacity .5s ease-out;
}

.hidden-element.visible {
  position: static;
  z-index: auto;
  pointer-events: auto;
  visibility: visible;
  opacity: 1;
}

说明:它使用了可见性:隐藏技巧(与“显示和动画”在一个步骤中兼容),但它使用了组合位置:绝对;z指数:-1;指针事件:无;以确保隐藏的容器不占用空间并且不响应用户交互。

您可以连接两个或更多的转换,而可见性是这次方便的地方。

第二部分{边框:1px实心#eee;}div>ul{可见性:隐藏;不透明度:0;过渡:可见性0s,不透明度0.5s线性;}div:悬停>ul{可见性:可见;不透明度:1;}<div><ul><li>项目1</li><li>项目2</li><li>项目3</li></ul></div>

(不要忘记转换属性的供应商前缀。)

更多详情请参阅本文。