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

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

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

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

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

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


当前回答

在本文发表时,如果您尝试更改显示属性,所有主要浏览器都会禁用CSS转换,但CSS动画仍然可以正常工作,因此我们可以使用它们作为解决方法。

示例代码(您可以相应地将其应用于菜单)演示:

将以下CSS添加到样式表中:

@-webkit-keyframes fadeIn {
    from { opacity: 0; }
      to { opacity: 1; }
}
@keyframes fadeIn {
    from { opacity: 0; }
      to { opacity: 1; }
}

然后将fadeIn动画应用于父级悬停时的子级(当然还有设置显示:块):

.parent:hover .child {
    display: block;
    -webkit-animation: fadeIn 1s;
    animation: fadeIn 1s;
}

更新2019-也支持淡出的方法:

(需要一些JavaScript代码)

//我们需要跟踪淡入元素,以便稍后在CSS中应用淡入document.addEventListener(“动画启动”,函数(e){if(e.animationName==“淡入”){e.target.classList.add('did-fade-in');}});document.addEventListener('animonend',函数(e){if(e.animationName===“淡出”){e.target.classList.remove('did-fade-in');}});第二部分{边框:5px实心;填充:10px;}div:悬停{边框颜色:红色;}.父项.子项{显示:无;}.parent:悬停.child{显示:块;动画:淡入1秒;}.parent:not(:hover).child.id-fade-in{显示:块;动画:淡出1s;}@关键帧淡入{来自{不透明度:0;}至{不透明度:1;}}@关键帧淡出{来自{不透明度:1;}至{不透明度:0;}}<div class=“parent”>父母亲<div class=“child”>小孩</div></div>

其他回答

不需要JavaScript,也不需要惊人的最大高度。相反,在文本元素上设置最大高度,并使用字体相对单位,例如rem或em。这样,您可以设置比容器更大的最大高度,同时避免菜单关闭时出现延迟或“弹出”:

HTML

<nav>
  <input type="checkbox" />
  <ul>
    <li>Link 1</li>
    <li>Link 1</li>
    <li>Link 1</li>
    <li>Link 1</li>
  </ul>
</nav>

CSS

nav input + ul li { // Notice I set max-height on li, not ul
   max-height: 0;
}

nav input:checked + ul li {
   max-height: 3rem; // A little bigger to allow for text-wrapping - but not outrageous
}

请参阅此处的示例:http://codepen.io/mindfullsilence/pen/DtzjE

在本文发表时,如果您尝试更改显示属性,所有主要浏览器都会禁用CSS转换,但CSS动画仍然可以正常工作,因此我们可以使用它们作为解决方法。

示例代码(您可以相应地将其应用于菜单)演示:

将以下CSS添加到样式表中:

@-webkit-keyframes fadeIn {
    from { opacity: 0; }
      to { opacity: 1; }
}
@keyframes fadeIn {
    from { opacity: 0; }
      to { opacity: 1; }
}

然后将fadeIn动画应用于父级悬停时的子级(当然还有设置显示:块):

.parent:hover .child {
    display: block;
    -webkit-animation: fadeIn 1s;
    animation: fadeIn 1s;
}

更新2019-也支持淡出的方法:

(需要一些JavaScript代码)

//我们需要跟踪淡入元素,以便稍后在CSS中应用淡入document.addEventListener(“动画启动”,函数(e){if(e.animationName==“淡入”){e.target.classList.add('did-fade-in');}});document.addEventListener('animonend',函数(e){if(e.animationName===“淡出”){e.target.classList.remove('did-fade-in');}});第二部分{边框:5px实心;填充:10px;}div:悬停{边框颜色:红色;}.父项.子项{显示:无;}.parent:悬停.child{显示:块;动画:淡入1秒;}.parent:not(:hover).child.id-fade-in{显示:块;动画:淡出1s;}@关键帧淡入{来自{不透明度:0;}至{不透明度:1;}}@关键帧淡出{来自{不透明度:1;}至{不透明度:0;}}<div class=“parent”>父母亲<div class=“child”>小孩</div></div>

我启动了一个名为[Tggle Display Animate][1]的开源骨架项目。

这个骨架助手将允许您轻松模拟jQuery显示/隐藏,但使用输入/输出CSS3转换动画。

它使用类切换,因此您可以在元素上使用除display之外的任何CSS方法:none|block|table|inline等,以及可以想到的其他替代用法。

它的主要设计目的是用于元素切换状态,并且它支持还原状态,其中隐藏对象允许您反向运行关键帧或播放隐藏元素的替代动画。

我正在研究的概念的大部分标记都是CSS,实际使用的JavaScript很少。

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

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

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

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

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

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

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

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

更多详情请参阅本文。