我目前正在设计一个CSS“巨型下拉菜单”——基本上是一个常规的仅限CSS的下拉菜单,但包含不同类型的内容。
目前,CSS 3转换似乎不适用于“display”属性,也就是说,您不能进行从display:none到display:block(或任何组合)的任何转换。
当有人悬停在一个顶级菜单项上时,上面示例中的第二层菜单是否有办法“淡入”?
我知道你可以在visibility:属性上使用转换,但我想不出一种有效的方法。
我也尝试过使用高度,但那只是失败得很惨。
我也意识到,使用JavaScript实现这一点很简单,但我想挑战一下自己,只使用CSS,我觉得我做得有点短。
我认为萨尔曼PK有最接近的答案。它可以通过以下CSS动画淡入或淡出项目。但是,显示属性不会平滑地设置动画,只有不透明度。
@-webkit-keyframes fadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
@-webkit-keyframes fadeOut {
from { opacity: 1; }
to { opacity: 0; }
}
如果你想让元素从显示块移动到不显示块,我看不出目前只使用CSS是可能的。您必须获得高度并使用CSS动画来降低高度。这在CSS中是可能的,如下面的示例所示,但要知道为元素设置动画所需的确切高度值是很困难的。
jsFiddle示例
CSS
@-webkit-keyframes pushDown {
0% {
height: 10em;
}
25% {
height: 7.5em;
}
50% {
height: 5em;
}
75% {
height: 2.5em;
}
100% {
height: 0em;
}
}
.push-down {
-webkit-animation: pushDown 2s forwards linear;
}
JavaScript
var element = document.getElementById("element");
// Push item down
element.className = element.className + " push-down";
从这些答案和其他地方的一些建议中,以下内容非常适合悬停菜单(我在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不允许用于过渡。最大高度的悬停值需要大于菜单的高度。
在本文发表时,如果您尝试更改显示属性,所有主要浏览器都会禁用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>
您需要通过其他方式隐藏该元素才能使其工作。
我通过绝对定位<div>s并将隐藏的<div>设置为不透明度:0来实现这一效果。
如果您甚至将显示属性从“无”切换为“块”,则不会在其他元素上进行转换。
要解决此问题,请始终允许元素显示为:块,但通过调整以下任何方式隐藏元素:
将高度设置为0。将不透明度设置为0。将元素放置在另一个溢出的元素的框架之外:隐藏。
可能有更多的解决方案,但如果将元素切换为显示:无,则无法执行转换。例如,您可以尝试以下操作:
div {
display: none;
transition: opacity 1s ease-out;
opacity: 0;
}
div.active {
opacity: 1;
display: block;
}
但这行不通。根据我的经验,我发现这毫无用处。
因此,您将始终需要保持元素display:block,但您可以通过执行以下操作来绕过它:
div {
transition: opacity 1s ease-out;
opacity: 0;
height: 0;
overflow: hidden;
}
div.active {
opacity: 1;
height: auto;
}