【问题标题】:Max-height transition from 0 to auto or none?从0到自动或无的最大高度过渡?
【发布时间】:2016-05-25 13:25:49
【问题描述】:

我有一个带有max-height of 0 的元素。我想将其转换为无最大高度自动或无;任何使它根据存在的元素数量扩展的东西。 我还不想使用 JS 和 flex。

这是 jsfiddle:https://jsfiddle.net/m9pd8bjh/19/

HTML:

<nav>
  <input type="checkbox" id="menu-main-checkbox" hidden>
  <label class="toggler" for="menu-main-checkbox">Menu</label>
  <div class="hide toggleable">
    <ul>
      <li>Home</li>
      <li>Sample Page</li>
    </ul>
  </div>
</nav>

CSS:

.hide {
  visibility: hidden;
  overflow: hidden;
  max-height: 0;
}

input[type=checkbox]:checked~.toggleable {
  visibility: visible;
  max-height: 68px;
}

.toggleable {
  transition: visibility 1.5s ease-in-out, max-height .75s ease-in-out;
}

.toggler {
  cursor: pointer
}

nav {
  background: #e74c3c;
}

当我将 max-height 设置为 68px(适合两个列表项的高度)时,它工作得很好,但是当我将 max-height 设置为 500px 时,例如,为将来的列表项留出空间,转换需要时间从 500 到 0,使其在列表项再次消失之前产生延迟。

我不希望使用缩放,因为它会使它复杂化,我必须想出一个解决方案来解决它下面的间距。它保持元素下方的间距,并在它打开时保留它。

【问题讨论】:

  • @dippas 可能重复的解决方案说将高度设置为一个大数字,这就是我正在做的。除此之外,我只需要一个解决方案。问题在于它如何转换,而不是它是否有效。如果不够清楚,请询问我的问题有什么令人困惑的地方,或者随时编辑以使其更易于理解。
  • 你有42个答案,查一下,测试一下,我第一眼看到一个用scale
  • 使用小于 500 的数字,所以。
  • @Shaggy 如果大于实际高度,仍然会稍有延迟。尝试关闭菜单,您会看到我想要了解的内容。

标签: css css-transitions


【解决方案1】:

我发现的一种解决方法是使用带有@keyframes 的动画。 记得添加供应商前缀。

浏览器对此的支持如下: Firefox 5+、IE 10+、Chrome、Safari 4+、Opera 12+

我将您的 CSS 修改为:

 .hide {
  visibility: hidden;
  overflow: hidden;
  max-height: 0;
}

input[type=checkbox]:checked~.toggleable {
  visibility: visible;
  animation: height1 .75s forwards;
}
input[type=checkbox]:not(:checked)~.toggleable {
  visibility: visible;
  animation: height2 .50s forwards;
}

.toggleable {
  transition: visibility 1.5s ease-in-out;
}

.toggler {
  cursor: pointer
}

nav {
  background: #e74c3c;
}
@keyframes height1 {
  0%   { max-height: 0; }
  100% { max-height: 500px; }
}
@keyframes height2 {
  0%   { max-height: 500px; }
  100% { max-height: 0; }
}

如果这样使用,再次点击时延迟会更小。

这里是更新的 jsfiddle:https://jsfiddle.net/m9pd8bjh/25/

【讨论】:

  • 修复延迟使用过渡:visibility 0.5s cubic-bezier(0, 1, 0, 1); 用于从 500px 到 0 的动画;
猜你喜欢
  • 1970-01-01
  • 2013-04-02
  • 2014-02-04
  • 1970-01-01
  • 2013-04-08
  • 1970-01-01
  • 2020-08-14
  • 1970-01-01
  • 2015-03-04
相关资源
最近更新 更多