【问题标题】:Animating element height by "blinking" to auto to get final value [duplicate]通过“闪烁”到自动设置动画元素高度以获得最终值[重复]
【发布时间】:2021-05-25 21:17:06
【问题描述】:

我正在尝试将元素的高度从预设高度设置为取决于内部内容的高度(height: auto 将设置的高度)。因为动画不适用于height: auto(往返)我认为解决方案可能是保存当前高度,在元素上设置height: auto 以获得最终高度并保存,然后重置元素的高度初始,然后将其设置为最终高度。用户不会注意到“自动闪烁”,最后的更改应该会产生动画。

const containerBlockDiv = document.querySelector('.container-block')
const childBlockDiv = document.querySelector('.child-block')

const containerCurrentHeight = containerBlockDiv.scrollHeight
containerBlockDiv.style.height = 'auto'
const containerNewHeight = containerBlockDiv.scrollHeight
containerBlockDiv.style.height = `${containerCurrentHeight}px`
containerBlockDiv.style.height = `${containerNewHeight}px`
.container-block {
  display: inline-block;
  background-color: red;
  height: 50px;
  width: 20px;
  transition: height 1s;
}

.child-block {
  display: inline-block;
  height: 100px;
}
<div class="container-block">
  <div class="child-block"></div>
</div>

为什么这不起作用?

【问题讨论】:

  • 首先,我很确定过渡不适用于通过 Javascript 设置的样式。我会使用 JS 添加一个类并使用 CSS 为该类设置所需的样式。
  • 在此处使用max-height 制作动画,而不是height,然后您可以毫无问题地设置height:auto
  • 他们做codepen.io/warhammered_cat/pen/yLVPXRV。 @kdsprogrammer
  • 因为它甚至没有看到第一个值。它不能从无到有过渡。
  • 我的意思是它甚至没有看到 50px 的值。您的脚本在第一次回流之前运行。阅读链接问题中接受的答案以及那里的所有链接答案,我认为我已经写了足够多的内容。

标签: javascript css


【解决方案1】:

这是我在我的法术书中将 div 从 0(或任何其他固定值)设置为 auto 的动画:纯 CSS,无 JS

div {
  max-height: 15px;
  overflow: hidden;
  border: red dashed 1px;
  transition: max-height 0.3s cubic-bezier(0, 1, 0, 1);
}

div:hover {
  max-height: 9999px;
  transition: max-height 0.3s cubic-bezier(1, 0, 1, 0);
}
<div>Some content Some content Some content Some content Some content Some content Some content Some content Some content Some content Some content Some content Some content Some content Some content Some content Some content Some content Some content Some
  content Some content Some content Some content Some content Some content Some content Some content Some content Some content Some content Some content Some content Some content Some content Some content Some content Some content Some content Some content
  Some content Some content Some content Some content Some content Some content Some content Some content Some content Some content Some content Some content Some content Some content Some content Some content Some content Some content Some content Some content Some content Some content Some content Some content Some content Some content Some content Some content Some content Some content Some content Some content Some content Some content Some content Some content Some content Some content</div>

【讨论】:

  • 我不喜欢这种方法,因为引用 CSS 技巧:“除非内容高度与最大高度完全相同,否则过渡长度实际上不会是您指定的长度”。无论如何,我问为什么我尝试的方法不起作用,而不是另一种方法。
猜你喜欢
  • 1970-01-01
  • 2017-03-13
  • 2019-04-06
  • 2013-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-21
相关资源
最近更新 更多