当前位置:  开发笔记 > 编程语言 > 正文

显示屏上的转换:属性

如何解决《显示屏上的转换:属性》经验,为你挑选了16个好方法。

我目前正在设计一种CSS'mega dropdown'菜单 - 基本上是一个普通的CSS-only下拉菜单,但包含不同类型的内容.

目前,似乎CSS3过渡不适用于"display"属性,即你不能做任何类型的过渡display: nonedisplay: block(或任意组合).

当有人将鼠标悬停在其中一个顶级菜单项上时,是否有人会想到上述示例中的第二层菜单可以"淡入"?

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

我也尝试过使用身高,但这只是失败了.

我也知道使用JavaScript实现这一点是微不足道的,但是我想挑战自己只使用CSS而且我认为我有点短.

所有和任何建议最受欢迎.



1> Guillermo..:

您可以连接两个或更多转换,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


2> Jim Jeffers..:

您需要通过其他方式隐藏元素才能使其生效.

我通过

绝对定位两个s并将隐藏的一个设置为来完成了效果opacity: 0.

如果您甚至将display属性切换noneblock,则不会发生对其他元素的转换.

要解决此问题,请始终允许元素display: block,但通过调整以下任何方法隐藏元素:

    设置height0.

    设置opacity0.

    将元素定位在具有的另一个元素的框架之外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动画仍然可以正常工作,因此我们可以将它们用作解决方法.

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

将以下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 - 也支持淡出的方法:

(有些JS需要)

// 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;
  }
}
Parent
Child


4> 小智..:

我怀疑如果"显示"发生变化,过渡被禁用的原因是因为显示实际上是什么.它并没有改变任何东西,可以令人信服地平滑的动态.

"display:none;"和"visibility:hidden;"是两个完全不同的东西.两者都具有使元素不可见的效果,但是"visibility:hidden;"它仍然在布局中呈现,但只是不明显.隐藏元素仍占用空间,仍然以内联或块或块内联或表格或"display"元素告诉它呈现为的方式呈现,并相应占用空间.其他元素不会自动移动以占据该空间.隐藏元素只是不将其实际像素渲染到输出.

另一方面,"display:none"实际上阻止了元素的完全渲染.它不占用任何布局空间.其他元素将占据该元素占用的部分或全部空间,现在可以调整占据该空间,就好像该元素根本不存在一样.

"显示"不仅仅是另一种视觉属性.它建立元素的整个渲染模式,例如它是块,内联,内联块,表,表行,表格单元,列表项还是其他任何东西!每个都有非常不同的布局分支,并且没有合理的方法来动画或平滑过渡它们(试图想象从"块"到"内联"的平滑过渡,或反之亦然,例如!).

这就是为什么在显示改变时禁用转换的原因(即使改变是来自或来自"无" - "无"不仅仅是不可见,它是它自己的元素渲染模式,这意味着根本不进行渲染!),


我不同意.它可以完全有道理.如果显示:无显示:在转换开始时立即发生阻塞,那将是很好的.而对于过渡回来,如果它从显示:阻止到显示:在转换结束时没有,那将是完美的.
与上述解决方案一样,对于为什么转换不适用于显示属性,获得合理的解释是非常令人满意的.

5> robocat..:

display 不是转换所依据的属性之一.

有关可应用转换的CSS属性列表,请参阅https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_animated_properties.有关如何插值的信息,请参阅https://drafts.c​​sswg.org/css-values-4/#combining-values.

最高CSS3列于https://www.w3.org/TR/2017/WD-css-transitions-1-20171130/#animatable-css(只需关闭警告弹出窗口)



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类添加,两者heightopacity没有延迟启动动画(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:nonedisplay:block仍然设置为淡入淡出.


除非我遗漏了某些内容,否则"演示"链接不再显示子菜单转换.
嘿,您的演示链接遵循`developers.google.com`

8> feklee..:

根据W3C 2013年11月19日的工作草案, display不是动画属性.幸运的是,它visibility是可动画的.您可以使用不透明度转换(JSFiddle)链接其转换:

HTML:

Foo


CSS:

#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;
}

用于测试的JavaScript:

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> 小智..:

我的整洁JavaScript技巧是将整个场景分成两个不同的功能!

为了准备事物,声明了一个全局变量并定义了一个事件处理程序:

  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;
  }
}

上面发生的是,99%的动画显示设置为阻止,而不透明度淡出.在最后一刻,display属性设置为none.

最重要的一点是在动画结束后使用动画填充模式保留最后一帧:前进

.hide {
   animation: hide 1s linear;
   animation-fill-mode: forwards;
}

以下是两个例子:https://jsfiddle.net/qwnz9tqg/3/


正如你可以在这个用游标设置的小提琴中看到的那样,`display:none`,实际上从未实现过.https://jsfiddle.net/3e6sduqh/

11> 小智..:

我今天碰到了这个position: fixed,我正在重用一个模态.我无法保留它display: none,然后动画它,因为它只是跳入外观,并且z-index(负值等)也做了奇怪的事情.

我也使用height: 0height: 100%,但只有当出现模式工作.这与您使用的left: -100%东西相同.

然后让我感到有一个简单的答案.等瞧:

首先,你隐藏的模态.注意heightis 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-activebody.现在height100%,我的过渡也发生了变化.我想要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..:

从其中一些答案和其他地方的一些建议中得出,以下内容适用于悬停菜单(我将其与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因为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:hiddenoverflow: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..:

不需要JavaScript,也不需要极大的最大高度。相反,请max-height在您的文本元素上进行设置,并使用字体相对单位,例如remem。这样,您可以将最大高度设置为大于容器的高度,同时避免菜单关闭时的延迟或“弹出”:

的HTML


的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



16> 小智..:

在Guillermo接受的答案被写入后,2012年4月3日的CSS转换规范改变了可见性转换的行为,现在可以在不使用转换延迟的情况下以更短的方式解决此问题:

.myclass > div {
                   transition:visibility 1s, opacity 1s;
                   visibility:hidden;  opacity:0
               }
.myclass:hover > div
               {   visibility:visible; opacity:1 }

为两个转换指定的运行时间通常应该相同(尽管稍长的可见性时间不是问题).有关正在运行的版本,请参阅我的博客 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的评论:需要属性和两个转换:不透明度属性用于创建淡入和淡出动画以及可见性属性,以避免元素仍对鼠标事件做出反应.视觉效果的不透明度和延迟隐藏的可见性需要转换,直到淡出结束.

推荐阅读
夏晶阳--艺术
这个屌丝很懒,什么也没留下!
RankList | 热门文章
  • 1