CSS3过渡不适用于display属性

时间:2014-02-28 18:27:01

标签: html css css3 css-transitions

每当我悬停其父元素时,我一直在尝试使用css来显示隐藏的Div淡入淡出。

到目前为止,我所要做的就是让隐藏的div显示出来,但是没有任何缓和过渡。

以下是我在JSfiddle上的代码http://jsfiddle.net/9dsGP/

这是我的代码:

HTML:

<div id="header">
<div id="button">This is a Button
    <div class="content">
    This is the Hidden Div
    </div>
</div>
</div>

CSS:

#header #button {width:200px; background:#eee}

#header #button:hover > .content {display:block; opacity:1;}

#header #button .content:hover { display:block;}

#header #button .content {

-webkit-transition: all .3s ease .15s;
-moz-transition: all .3s ease .15s;
-o-transition: all .3s ease .15s;
-ms-transition: all .3s ease .15s;
transition: all .3s ease .15s;

    opacity:0;
    clear: both;
    display: none;

    top: -1px;
    left:-160px;
    padding: 8px;
    min-height: 150px;
    border-top: 1px solid #EEEEEE;
    border-left: 1px solid #EEEEEE;
    border-right: 1px solid #EEEEEE;
    border-bottom: 1px solid #EEEEEE;
    -webkit-border-radius: 0px 7px 7px 7px;
    -moz-border-radius: 0px 7px 7px 7px;
    -khtml-border-radius: 0px 7px 7px 7px;
    border-radius: 0px 7px 7px 7px;
    -webkit-box-shadow: 0px 2px 2px #DDDDDD;
    -moz-box-shadow: 0px 2px 2px #DDDDDD;
    box-shadow: 0px 2px 2px #DDDDDD;
    background: #FFF;
}

关于我做错了什么的任何线索?当我将鼠标悬停在按钮上时,只是试图为隐藏内容获得平滑效果。提前谢谢!

7 个答案:

答案 0 :(得分:88)

  

display:none;从页面中删除一个块,就好像它从未出现过一样。   无法部分显示块;它要么存在,要么不存在。   visibility也是如此;你不能指望一个块是一半   hidden,根据定义,visible!幸运的是,你可以   请改用淡化效果opacity    - reference

作为替代CSS解决方案,您可以使用opacityheightpadding属性来实现理想效果:

#header #button:hover > .content {
    opacity:1;
    height: 150px;
    padding: 8px;    
}

#header #button .content {
    opacity:0;
    height: 0;
    padding: 0 8px;
    overflow: hidden;
    transition: all .3s ease .15s;
}

(由于简洁,省略了供应商前缀。)

这是 working demo 。 SO上也是a similar topic

#header #button {
  width:200px;
  background:#ddd;
  transition: border-radius .3s ease .15s;
}

#header #button:hover, #header #button > .content {
    border-radius: 0px 0px 7px 7px;
}

#header #button:hover > .content {
  opacity: 1;
  height: 150px;
  padding: 8px;    
}

#header #button > .content {
  opacity:0;
  clear: both;
  height: 0;
  padding: 0 8px;
  overflow: hidden;

  -webkit-transition: all .3s ease .15s;
  -moz-transition: all .3s ease .15s;
  -o-transition: all .3s ease .15s;
  -ms-transition: all .3s ease .15s;
  transition: all .3s ease .15s;

  border: 1px solid #ddd;

  -webkit-box-shadow: 0px 2px 2px #ddd;
  -moz-box-shadow: 0px 2px 2px #ddd;
  box-shadow: 0px 2px 2px #ddd;
  background: #FFF;
}

#button > span { display: inline-block; padding: .5em 1em }
<div id="header">
  <div id="button"> <span>This is a Button</span>
    <div class="content">
      This is the Hidden Div
    </div>
  </div>
</div>

答案 1 :(得分:13)

您无法使用height: 0height: auto来转换身高。 auto始终是相对的,不能过渡到。但是,您可以使用max-height: 0并将其转换为max-height: 9999px

抱歉,我无法评论,我的代表不够高......

答案 2 :(得分:2)

我在摆弄时找到了解决方案。

直接想看结果的人:

点击: https://jsfiddle.net/dt52jazg/

悬停: https://jsfiddle.net/7gkufLsh/1/

以下是代码:

<强> HTML

<ul class="list">
  <li>Hey</li>
  <li>This</li>
  <li>is</li>
  <li>just</li>
  <li>a</li>
  <li>test</li>
</ul>

<button class="click-me">
  Click me
</button>

<强> CSS

.list li {
  min-height: 0;
  max-height: 0;
  opacity: 0;
  -webkit-transition: all .3s ease-in-out;
  transition: all .3s ease-in-out;
}

.active li {
  min-height: 20px;
  opacity: 1;
}

<强> JS

(function() {
  $('.click-me').on('click', function() {
    $('.list').toggleClass('active');
  });
})();

请让我知道这个解决方案是否有任何问题'因为我觉得这个解决方案不会限制最大高度。

答案 3 :(得分:0)

进行了一些更改,但我认为我使用visibility获得了您想要的效果。 http://jsfiddle.net/9dsGP/49/

我也做了这些改变:

position: absolute; /* so it doesn't expand the button background */
top: calc(1em + 8px); /* so it's under the "button" */
left:8px; /* so it's shifted by padding-left */
width: 182px; /* so it fits nicely under the button, width - padding-left - padding-right - border-left-width - border-right-width, 200 - 8 - 8 - 1 - 1 = 182 */

或者,您可以将.content作为.button的兄弟,但我没有为此做出示例。

答案 4 :(得分:0)

我遇到了display:none

的问题

我有几个带有过渡效果的水平条,但我想只显示该容器的一部分并折叠其余部分,同时保持效果。我复制了一个小型演示here

显而易见的是将这些隐藏的动画条包裹在div中,然后切换该元素的高度和不透明度

.hide{
  opacity: 0;
  height: 0;
}
.bars-wrapper.expanded > .hide{
 opacity: 1;
 height: auto;
}

动画效果很好,但问题是这些隐藏的栏目仍在我页面上消耗空间并重叠其他元素

enter image description here

因此,将display:none添加到隐藏的包装器.hide可以解决边距问题,但不能解决转换问题,因为display:noneheight:0;opacity:0都不适用于子元素。

所以我最后的解决方法是给那些隐藏的条形图一个负面和绝对的位置,并且它适用于CSS过渡。

Jsfiddle

答案 5 :(得分:0)

最大高度

.PrimaryNav-container {
...
max-height: 0;
overflow: hidden;
transition: max-height 0.3s ease;
...
}

.PrimaryNav.PrimaryNav--isOpen .PrimaryNav-container {
max-height: 300px;
}

https://www.codehive.io/boards/bUoLvRg

答案 6 :(得分:-1)

当您需要切换元素时,您不需要为margin属性设置动画。你可以试试margin-top: -999999em。只是不要过渡所有。