我目前正在设计一个CSS“巨型下拉菜单”——基本上是一个常规的仅限CSS的下拉菜单,但包含不同类型的内容。
目前,CSS 3转换似乎不适用于“display”属性,也就是说,您不能进行从display:none到display:block(或任何组合)的任何转换。
当有人悬停在一个顶级菜单项上时,上面示例中的第二层菜单是否有办法“淡入”?
我知道你可以在visibility:属性上使用转换,但我想不出一种有效的方法。
我也尝试过使用高度,但那只是失败得很惨。
我也意识到,使用JavaScript实现这一点很简单,但我想挑战一下自己,只使用CSS,我觉得我做得有点短。
您需要通过其他方式隐藏该元素才能使其工作。
我通过绝对定位<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;
}
我感谢所有的回答。以下是我用于类似目的的内容:过渡与动画。
例子:https://jsfiddle.net/grinevri/tcod87Le/22/
<div class="animation"></div>
<div class="transition"></div>
@keyframes animationTo {
0% { background-color: rgba(0, 0, 0, 0.1); }
100% { background-color: rgba(0, 0, 0, 0.5); }
}
@keyframes animationFrom {
0% { background-color: rgba(0, 0, 0, 0.5); }
100% { background-color: rgba(0, 0, 0, 0.1); }
}
.animation,
.transition{
margin: 5px;
height: 100px;
width: 100px;
background-color: rgba(0, 0, 0, 0.1);
}
.animation{
animation: animationFrom 250ms;
}
.animation:hover{
background-color: rgba(0, 0, 0, 0.5);
animation: animationTo 250ms;
}
.transition{
transition: background-color 250ms;
}
.transition:hover{
background-color: rgba(0, 0, 0, 0.5);
}
我启动了一个名为[Tggle Display Animate][1]的开源骨架项目。
这个骨架助手将允许您轻松模拟jQuery显示/隐藏,但使用输入/输出CSS3转换动画。
它使用类切换,因此您可以在元素上使用除display之外的任何CSS方法:none|block|table|inline等,以及可以想到的其他替代用法。
它的主要设计目的是用于元素切换状态,并且它支持还原状态,其中隐藏对象允许您反向运行关键帧或播放隐藏元素的替代动画。
我正在研究的概念的大部分标记都是CSS,实际使用的JavaScript很少。
这个问题的最简单的通用解决方案是:在CSS中随意指定display:none,但是您必须使用JavaScript将其更改为block(或其他任何内容),然后您还必须向有问题的元素添加一个类,该类实际上使用setTimeout()进行转换。这就是全部。
即。:
<style>
#el {
display: none;
opacity: 0;
}
#el.auto-fade-in {
opacity: 1;
transition: all 1s ease-out; /* Future, future, please come sooner! */
-webkit-transition: all 1s ease-out;
-moz-transition: all 1s ease-out;
-o-transition: all 1s ease-out;
}
</style>
<div id=el>Well, well, well</div>
<script>
var el = document.getElementById('el');
el.style.display = 'block';
setTimeout(function () { el.className = 'auto-fade-in' }, 0);
</script>
这在最新的sane浏览器中进行了测试。显然,它不应该在Internet Explorer 9或更早版本中工作。