这个问题源自于掘金上的一个留言,一个朋友问到,为何我下面这段代码的高度过渡动画失效了?css
伪代码大概是这样:git
{ height: unset; transition: all 0.3s linear; will-change: height; &.up { height: 0; } &.down { height: unset; } }
把它还原成一个实际的 Demo,效果大概是这样(本质想的想法是经过给元素切换它的 .up
,.down
类,让它实现展开、合上的动画 ):github
嗯哼?很奇怪,明明给 height
属性设置了 transition
,为何过渡动画没有触发,而是直接一步到位展开了呢?函数
咱们期待的效果是这样的:动画
当上述代码设置成 height: unset
时,实际等同于设置了 height: auto
,咱们的想法是但愿这段代码可以容器支持文本的动态高度。每次展开的时候,过渡展开到容器自己的高度便可。spa
查看规范,究其缘由,在于 CSS transtion 不支持元素的高度为 auto 的变化。code
若是把上述的 height: unset
替换成一个具体的高度值,则动画是生效的,譬如:blog
{ &.up { height: 0; } &.down { - height: unset; + height: 500px; } }
可是,咱们又但愿可以作到动态高度的过渡转换,是否是就没有办法了么?get
max-height
适配动态高度嘿嘿,这里有一个很是有意思的小技巧。既然不支持 height: auto
,那咱们就另辟蹊径,利用 max-height
的特性来作到动态高度的伸缩。it
咱们改造一下上述代码,将 height: 0
替换为 max-height: 0
,将 height: auto
替换成 max-height: 1000px
,伪代码大概是这个意思:
{ max-height: 0; transition: max-height 0.3s linear; &.up { max-height: 0; } &.down { max-height: 1000px; } }
咱们估算一下实际容器的最大高度,这里的 1000px
只须要比最大高度高便可。可是这里不能设置的过高,最高是贴近最大的使用高度便可,后面会聊到为何。
因为 max-height
只是限制文本的最大高度,当容器的实际高度没有达到限制的最大高度,将不会继续变高,看看效果:
CodePen Demo -- the height property transition unwork
总体效果仍是很是的 Nice 的,固然,可能有两个小缺陷,
max-height
须要用到而且有其它做用,那么可能这种方法就没法知足需求了max-height
为 1000px,动画时间为 1s,缓动函数为 linear。实际动画从 0 到 200px 的高度过渡时间只有 0.2s,这一点须要很是注意~由于原本展开动画是指望将容器的高度用 1s 的时间拉伸至 1000px,实际在 200px 的时候就中止了,因此动画时间只有 0.2 秒。综上,方法是好方法,可是具体使用的时候要须要具体分析。
好了,一个小细节,但愿对你有所帮助,本文到此结束,但愿对你有帮助 :)
更多精彩 CSS 技术文章汇总在个人 Github -- iCSS ,持续更新,欢迎点个 star 订阅收藏。
若是还有什么疑问或者建议,能够多多交流,原创文章,文笔有限,才疏学浅,文中如有不正之处,万望告知。