【问题标题】:No CSS transition for 'height: fit-content''height: fit-content' 没有 CSS 过渡
【发布时间】:2019-02-19 13:33:55
【问题描述】:

我使用transition: height 500ms 为元素添加动画,该元素通过按钮从height: 0 滑动打开到height: 100px,反之亦然。

由于元素的内容是动态添加的,我不知道它的大小,我想改用height: fit-content。这样,元素将始终具有正确的大小来显示其内容。

遗憾的是,这会禁用动画。

如何将动画与大小适合其内容的 div 元素放在一起?

下面的 sn -p 显示行为:

document.querySelector('button')
  .addEventListener(
    'click',
    () => document.querySelectorAll('div')
      .forEach(div => div.classList.toggle('closed')));
div {
  background-color: lightblue;
  border: 1px solid black;
  overflow: hidden;
  transition: height 500ms;
}

div.closed {
  height: 0 !important;
}

div.div1 {
  height: 100px;
}

div.div2 {
  height: fit-content;
}
<button type="button">toggle</button>

<h1>'height: 100px' => 'height: 0'</h1>
<div class="div1">
some text<br />
even more text<br />
so much text
</div>

<br>

<h1>'height: fit-content' => 'height: 0'</h1>
<div class="div2">
some text<br />
even more text<br />
so much text
</div>

【问题讨论】:

标签: css animation css-transitions transition slide


【解决方案1】:

一种可能的解决方案,虽然不是完美的,是动画font-size 而不是height

另一种解决方案可能是动画max-height 而不是height。你可以使用 max-height 说 300px 或 500px。但如果你要求的不止这些,那就不好看了。

我在这里为字体大小设置动画。

希望对您有所帮助。谢谢。

document.querySelector('button')
  .addEventListener(
    'click',
    () => document.querySelectorAll('div')
      .forEach(div => div.classList.toggle('closed')));
div {
  background-color: lightblue;
  border: 1px solid black;
  overflow: hidden;
  transition: font-size 500ms;
}

div.closed {
  font-size: 0 !important;
}

div.div1 {
  font-size: 14px;
}

div.div2 {
  font-size: 14px;
}
<button type="button">toggle</button>

<h1>'height: 100px' => 'height: 0'</h1>
<div class="div1">
some text<br />
even more text<br />
so much text
</div>

<br>

<h1>'height: fit-content' => 'height: 0'</h1>
<div class="div2">
some text<br />
even more text<br />
so much text
</div>

【讨论】:

  • 我确实将这种方法用于内容本身就是元素的另一种情况:当您缩放文本元素时,我缩放了子元素。谢谢提醒!
  • 非常适合我的各种高度的下拉菜单。谢谢!
【解决方案2】:

正如 Mishel 所说,另一个解决方案是使用最大高度。这是该解决方案的一个工作示例。

关键是在完全展开时近似您的最大高度,然后过渡将是平滑的。

希望这会有所帮助。

https://www.w3schools.com/css/css3_transitions.asp

document.querySelector('button')
  .addEventListener(
    'click',
    () => document.querySelectorAll('div')
      .forEach(div => div.classList.toggle('closed')));
div {
  background-color: lightblue;
  border: 1px solid black;
  overflow-y: hidden;
	max-height: 75px; /* approximate max height */
	transition-property: all;
	transition-duration: .5s;
	transition-timing-function: cubic-bezier(1, 1, 1, 1);
}
div.closed {
   max-height: 0;
}
<button type="button">toggle</button>

<h1>'height: 100px' => 'height: 0'</h1>
<div class="div1">
some text<br />
even more text<br />
so much text
</div>

<br>

<h1>'height: fit-content' => 'height: 0'</h1>
<div class="div2">
some text<br />
even more text<br />
so much text
</div>

【讨论】:

  • 谢谢!这个解决方案最适合我的情况和目标。
  • 作为改进,我改用max-height: 100vh;100vh 表示可用视图高度的 100%(浏览器窗口实际内容区域的大小)。我的元素总是比 100vh 小很多。
  • 很高兴听到,很高兴我能帮上忙。
猜你喜欢
  • 2015-08-22
  • 2021-10-23
  • 1970-01-01
  • 1970-01-01
  • 2014-09-14
  • 2012-02-16
  • 2014-04-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多