我目前正在设计一种CSS'mega dropdown'菜单 - 基本上是一个普通的CSS-only下拉菜单,但包含不同类型的内容.
目前,似乎CSS3过渡不适用于"display"属性,即你不能做任何类型的过渡display: none
到display: block
(或任意组合).
当有人将鼠标悬停在其中一个顶级菜单项上时,是否有人会想到上述示例中的第二层菜单可以"淡入"?
我知道你可以在visibility:
属性上使用转换,但我想不出有效利用它的方法.
我也尝试过使用身高,但这只是失败了.
我也知道使用JavaScript实现这一点是微不足道的,但是我想挑战自己只使用CSS而且我认为我有点短.
所有和任何建议最受欢迎.
您可以连接两个或更多转换,visibility
这次是方便的.
div {
border: 1px solid #eee;
}
div > ul {
visibility: hidden;
opacity: 0;
transition: visibility 0s, opacity 0.5s linear;
}
div:hover > ul {
visibility: visible;
opacity: 1;
}
- Item 1
- Item 2
- Item 3
您需要通过其他方式隐藏元素才能使其生效.
我通过 如果您甚至将 要解决此问题,请始终允许元素 设置 设置 将元素定位在具有的另一个元素的框架之外 可能有更多解决方案,但如果您将元素切换为,则无法执行转换 但是,这并不工作.根据我的经验,我发现这无所事事. 因此,您将始终需要保留元素 在本文发表时,如果您尝试更改 示例代码: - (您可以相应地将它应用于您的菜单) 演示 将以下CSS添加到样式表: - 然后将 (有些JS需要)
我怀疑如果"显示"发生变化,过渡被禁用的原因是因为显示实际上是什么.它并没有改变任何东西,可以令人信服地平滑的动态. "display:none;"和"visibility:hidden;"是两个完全不同的东西.两者都具有使元素不可见的效果,但是"visibility:hidden;"它仍然在布局中呈现,但只是不明显.隐藏元素仍占用空间,仍然以内联或块或块内联或表格或"display"元素告诉它呈现为的方式呈现,并相应占用空间.其他元素不会自动移动以占据该空间.隐藏元素只是不将其实际像素渲染到输出. 另一方面,"display:none"实际上阻止了元素的完全渲染.它不占用任何布局空间.其他元素将占据该元素占用的部分或全部空间,现在可以调整占据该空间,就好像该元素根本不存在一样. "显示"不仅仅是另一种视觉属性.它建立元素的整个渲染模式,例如它是块,内联,内联块,表,表行,表格单元,列表项还是其他任何东西!每个都有非常不同的布局分支,并且没有合理的方法来动画或平滑过渡它们(试图想象从"块"到"内联"的平滑过渡,或反之亦然,例如!). 这就是为什么在显示改变时禁用转换的原因(即使改变是来自或来自"无" - "无"不仅仅是不可见,它是它自己的元素渲染模式,这意味着根本不进行渲染!), 有关可应用转换的CSS属性列表,请参阅https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_animated_properties.有关如何插值的信息,请参阅https://drafts.csswg.org/css-values-4/#combining-values. 最高CSS3列于https://www.w3.org/TR/2017/WD-css-transitions-1-20171130/#animatable-css(只需关闭警告弹出窗口) 我们可以使用 那么,这里发生了什么? 当 当 注意,这种方法比使用的方法更好 有关更多示例,请参阅此文章. 我知道这是一个非常古老的问题,但对于正在查看此线程的人,您现在可以向块属性添加自定义动画. 演示 在这个演示中,子菜单从更改 根据W3C 2013年11月19日的工作草案,
HTML: CSS: 用于测试的JavaScript:
请注意,如果您只是将链接设为透明而不进行设置 我的整洁JavaScript技巧是将整个场景分成两个不同的功能! 为了准备事物,声明了一个全局变量并定义了一个事件处理程序: 然后,当隐藏元素时,我使用这样的东西: 为了重新出现元素,我正在做这样的事情: 它到目前为止有效! 编辑:在此示例中未显示任何未应用. 上面发生的是,99%的动画显示设置为阻止,而不透明度淡出.在最后一刻,display属性设置为none. 最重要的一点是在动画结束后使用动画填充模式保留最后一帧:前进 以下是两个例子:https://jsfiddle.net/qwnz9tqg/3/ 我今天碰到了这个 我也使用 然后让我感到有一个简单的答案.等瞧: 首先,你隐藏的模态.注意 第二,你的可见模态.说你设定 就是这样,它就像一个魅力. 从其中一些答案和其他地方的一些建议中得出,以下内容适用于悬停菜单(我将其与bootstrap 3一起使用,具体而言): 如果您指定两个值 我已经多次遇到这个问题,现在简单地讲: 通过添加该类 更改 不需要JavaScript,也不需要极大的最大高度。相反,请 的HTML 的CSS 在此处查看示例:http :
//codepen.io/mindfullsilence/pen/DtzjE 在Guillermo接受的答案被写入后,2012年4月3日的CSS转换规范改变了可见性转换的行为,现在可以在不使用转换延迟的情况下以更短的方式解决此问题: 为两个转换指定的运行时间通常应该相同(尽管稍长的可见性时间不是问题).有关正在运行的版本,请参阅我的博客
http://www.taccgl.org/blog/css-transition-visibility.html#visibility-opacity. Wrt题为"转换显示:属性"的问题,并回应Rui Marques和josh对已接受答案的评论:此解决方案适用于如果使用显示或可见性属性无关紧要的情况(因为它可能是这个问题的情况).它不会完全删除元素display:none,只是让它不可见但它仍然停留在文档流中并影响以下元素的位置.完全删除类似于display的元素的过渡:none可以使用height(如其他答案和注释所示),max-height或margin-top/bottom来完成,但也可以看到
如何转换高度:0; 高度:自动; 用CSS?
和我的博客http://www.taccgl.org/blog/css_transition_display.html. 回应GeorgeMillo的评论:需要属性和两个转换:不透明度属性用于创建淡入和淡出动画以及可见性属性,以避免元素仍对鼠标事件做出反应.视觉效果的不透明度和延迟隐藏的可见性需要转换,直到淡出结束.opacity: 0
.
display
属性切换none
为block
,则不会发生对其他元素的转换.display: block
,但通过调整以下任何方法隐藏元素:
height
为0
.opacity
为0
.overflow: hidden
.display: none
.例如,您可能尝试尝试这样的事情: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;
}
谢谢吉姆的全面答复.如果显示:属性完全改变,那么你的所有转换都不起作用,这是完全正确的事实.这是一种耻辱 - 我想知道背后的原因是什么.在旁注中,在我在原始问题中发布的同一链接上,您可以看到我在哪里.我在Chrome [5.0.375.125]中遇到的唯一(小)问题是,当页面加载时,您可以看到菜单在页面上加载元素时快速消失.Firefox 4.0b2和Safari 5.0绝对没问题......我错过了什么错误?
我同意这是正确的,并将为此做出贡献; 面向未来的旅行者.我在Chrome中找到了一个可行的解决方案,但我发现它在iPhone 4上失败了:`visibility:hidden; 不透明度:0; -webkit-transition:所有.2s轻松进出;`这不仅没有正确转换,而且目标元素永远不会出现.QA会让你,我和你的妈妈失望.
你刚刚赢得了投票,因为'溢出:隐藏'非常感谢你!
如果将隐藏状态设置为“ height:0;”,并且不进行过渡,则过渡将不起作用。我试图这样做只是为了过渡不透明度。我必须删除“高度:0;”。
3> Salman von A..:display
属性,所有主流浏览器都会禁用CSS过渡,但CSS动画仍然可以正常工作,因此我们可以将它们用作解决方法.@-webkit-keyframes fadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
@keyframes fadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
fadeIn
动画应用于父hover上的子项: - (当然设置display: block
).parent:hover .child {
display: block;
-webkit-animation: fadeIn 1s;
animation: fadeIn 1s;
}
更新2019 - 也支持淡出的方法:
// We need to keep track of faded in elements so we can apply fade out later in CSS
document.addEventListener('animationstart', function (e) {
if (e.animationName === 'fade-in') {
e.target.classList.add('did-fade-in');
}
});
document.addEventListener('animationend', function (e) {
if (e.animationName === 'fade-out') {
e.target.classList.remove('did-fade-in');
}
});
div {
border: 5px solid;
padding: 10px;
}
div:hover {
border-color: red;
}
.parent .child {
display: none;
}
.parent:hover .child {
display: block;
animation: fade-in 1s;
}
.parent:not(:hover) .child.did-fade-in {
display: block;
animation: fade-out 1s;
}
@keyframes fade-in {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
@keyframes fade-out {
from {
opacity: 1;
}
to {
opacity: 0;
}
}
4> 小智..:
我不同意.它可以完全有道理.如果显示:无显示:在转换开始时立即发生阻塞,那将是很好的.而对于过渡回来,如果它从显示:阻止到显示:在转换结束时没有,那将是完美的.
与上述解决方案一样,对于为什么转换不适用于显示属性,获得合理的解释是非常令人满意的.
5> robocat..:display
不是转换所依据的属性之一.
6> Webars..:transition-delay
属性来代替CSS中不存在的回调.#selector {
overflow: hidden; // Hide the element content, while height = 0
height: 0; opacity: 0;
transition: height 0ms 400ms, opacity 400ms 0ms;
}
#selector.visible {
height: auto; opacity: 1;
transition: height 0ms 0ms, opacity 600ms 0ms;
}
visible
类添加,两者height
并opacity
没有延迟启动动画(0毫秒),虽然height
花费0毫秒即可完成动画(等效display: block
),并opacity
需要600毫秒.visible
类被移除时,opacity
开始动画(0毫秒延迟,400ms的持续时间),和高度等待400毫秒,然后才立即(0毫秒)恢复初始值(相当于display: none
在动画回调).visibility
.在这种情况下,元素仍然占据页面上的空间,并不总是合适的.
感到惊讶的是没有更多的赞成 - 这个聪明的解决方案在某种程度上完美无缺.
它只能与“ height:100%”一起使用,在某些情况下会破坏布局。很好的解决方案,如果那不是问题。少数双向工作之一。
即使使用React,它也能满足我的需要.谢谢
7> Manish Pradh..:@keyframes showNav {
from {opacity: 0;}
to {opacity: 1;}
}
.subnav-is-opened .main-nav__secondary-nav {
display: block;
animation: showNav 250ms ease-in-out both;
}
display:none
为display:block
仍然设置为淡入淡出.
除非我遗漏了某些内容,否则"演示"链接不再显示子菜单转换.
嘿,您的演示链接遵循`developers.google.com`
8> feklee..:display
不是动画属性.幸运的是,它visibility
是可动画的.您可以使用不透明度转换(JSFiddle)链接其转换:Foo
#foo {
transition-property: visibility, opacity;
transition-duration: 0s, 1s;
}
#foo.hidden {
opacity: 0;
visibility: hidden;
transition-property: opacity, visibility;
transition-duration: 1s, 0s;
transition-delay: 0s, 1s;
}
var foo = document.getElementById('foo');
document.getElementById('hide-button').onclick = function () {
foo.className = 'hidden';
};
document.getElementById('show-button').onclick = function () {
foo.className = '';
};
visibility: hidden
,那么它将保持可点击状态.
9> 小智..: var tTimeout;
element.addEventListener("transitionend", afterTransition, true);//firefox
element.addEventListener("webkitTransitionEnd", afterTransition, true);//chrome
function hide(){
element.style.opacity = 0;
}
function afterTransition(){
element.style.display = 'none';
}
function show(){
element.style.display = 'block';
tTimeout = setTimeout(timeoutShow, 100);
}
function timeoutShow(){
element.style.opacity = 1;
}
10> Pawel..:@keyframes hide {
0% {
display: block;
opacity: 1;
}
99% {
display: block;
}
100% {
display: none;
opacity: 0;
}
}
.hide {
animation: hide 1s linear;
animation-fill-mode: forwards;
}
正如你可以在这个用游标设置的小提琴中看到的那样,`display:none`,实际上从未实现过.https://jsfiddle.net/3e6sduqh/
11> 小智..:position: fixed
,我正在重用一个模态.我无法保留它display: none
,然后动画它,因为它只是跳入外观,并且z-index
(负值等)也做了奇怪的事情.height: 0
到height: 100%
,但只有当出现模式工作.这与您使用的left: -100%
东西相同.height
is 0
,并检查height
转换中的声明......它有一个500ms
,比我的opacity
转换长.请记住,这会影响外出的淡出过渡:将模态返回到其默认状态.#modal-overlay {
background: #999;
background: rgba(33,33,33,.2);
display: block;
overflow: hidden;
height: 0;
width: 100%;
position: fixed;
top: 0;
left: 0;
opacity: 0;
z-index: 1;
-webkit-transition: height 0s 500ms, opacity 300ms ease-in-out;
-moz-transition: height 0s 500ms, opacity 300ms ease-in-out;
-ms-transition: height 0s 500ms, opacity 300ms ease-in-out;
-o-transition: height 0s 500ms, opacity 300ms ease-in-out;
transition: height 0s 500ms, opacity 300ms ease-in-out;
}
.modal-active
的body
.现在height
是100%
,我的过渡也发生了变化.我想要height
立即改变,并opacity
采取300ms
..modal-active #modal-overlay {
height: 100%;
opacity: 1;
z-index: 90000;
-webkit-transition: height 0s, opacity 300ms ease-in-out;
-moz-transition: height 0s, opacity 300ms ease-in-out;
-ms-transition: height 0s, opacity 300ms ease-in-out;
-o-transition: height 0s, opacity 300ms ease-in-out;
transition: height 0s, opacity 300ms ease-in-out;
}
12> Edyn..: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
因为s height:auto
不允许transition
.悬停值可能max-height
需要大于height
菜单的悬停值.
13> DominikAnger..:.block {
opacity: 1;
transition: opacity 250ms ease;
}
.block--invisible {
pointer-events: none;
opacity: 0;
}
block--invisible
,整个Elements将不可单击,但是其后面的所有Elements都将因为pointer-events:none
所有主要浏览器(没有IE <11)都支持。
14> 小智..:overflow:hidden
到overflow:visible
.它效果更好.我用这样的:#menu ul li ul {
background-color:#fe1c1c;
width:85px;
height:0px;
opacity:0;
box-shadow:1px 3px 10px #000000;
border-radius:3px;
z-index:1;
-webkit-transition:all 0.5s ease;
-moz-transition:all 0.6s ease;
}
#menu ul li:hover ul {
overflow:visible;
opacity:1;
height:140px;
}
visible
更好,因为overflow:hidden
行为完全像一个display:none
.
15> mindfullsile..:max-height
在您的文本元素上进行设置,并使用字体相对单位,例如rem
或em
。这样,您可以将最大高度设置为大于容器的高度,同时避免菜单关闭时的延迟或“弹出”:
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
}
16> 小智..:.myclass > div {
transition:visibility 1s, opacity 1s;
visibility:hidden; opacity:0
}
.myclass:hover > div
{ visibility:visible; opacity:1 }