欢迎来到智品网!

新闻

CSS 奇技淫巧:动态高度过渡动画



发布时间:2021-01-13 23:52:45   来源:互联网   作者:

我们估算一下实际容器的最大高度,这里的1000px只需要比最大高度高即可。但是这里不能设置的太高,最高是贴近最大的使用高度即可,后面会聊到为什么。

由于max-height只是限制文本的最大高度,当容器的实际高度没有达到限制的最大高度,将不会继续变高,看看效果:

这个问题源自于掘金上的一个留言,一个朋友问到,为什么我下面这段代码的高度过渡动画失效了?

伪代码大概是这样:

{height:unset;transition:all0.3slinear;will-change:height;&.up{height:0;}&.down{height:unset;}}

好了,一个小细节,希望对你有所帮助,本文到此结束,希望对你有帮助:)

把它还原成一个实际的Demo,效果大概是这样(本质想的想法是通过给元素切换它的.up.down类,让它实现展开、合上的动画):

{&.up{height:0;}&.down{-height:unset;+height:500px;}}

我们期待的效果是这样的:

transition不支持height:auto

查看规范,究其原因,在于CSStranstion不支持元素的高度为auto的变化。

但是,我们又希望能够做到动态高度的过渡转换,是不是就没有办法了么?

巧用max-height适配动态高度

嘿嘿,这里有一个非常有意思的小技巧。既然不支持height:auto,那我们就另辟蹊径,利用max-height的特性来做到动态高度的伸缩。

整体效果还是非常的Nice的,当然,可能有两个小缺陷,

  1. 如果实际场景中max-height需要用到并且有其它作用,那么可能这种方法就无法满足需求了
  2. 另一个缺点就是视觉上有延迟,和实际高度相差越大越明显。也就是说,如果容器实际高度只有200px,max-height为1000px,动画时间为1s,缓动函数为linear。实际动画从0到200px的高度过渡时间只有0.2s,这一点需要非常注意~
{max-height:0;transition:max-height0.3slinear;&.up{max-height:0;}&.down{max-height:1000px;}}

如果把上述的height:unset替换成一个具体的高度值,则动画是生效的,譬如:

CodePenDemo--theheightpropertytransitionunwork

小缺陷

因为本来展开动画是期望将容器的高度用1s的时间拉伸至1000px,实际在200px的时候就停止了,所以动画时间只有0.2秒。综上,方法是好方法,但是具体使用的时候要需要具体分析。

最后

嗯哼?很奇怪,明明给height属性设置了transition,为什么过渡动画没有触发,而是直接一步到位展开了呢?

更多精彩CSS技术文章汇总在我的Github--iCSS,持续更新,欢迎点个star订阅收藏。

我们改造一下上述代码,将height:0替换为max-height:0,将height:auto替换成max-height:1000px,伪代码大概是这个意思:

当上述代码设置成height:unset时,实际等同于设置了height:auto,我们的想法是希望这段代码能够容器支持文本的动态高度。每次展开的时候,过渡展开到容器本身的高度即可。

如果还有什么疑问或者建议,可以多多交流,原创文章,文笔有限,才疏学浅,文中若有不正之处,万望告知。

责任编辑:ysman
0
免责声明:
① 凡本网注明稿件来源:“智品网”的所有文字、图片和音视频稿件,版权均属智品网所有,任何媒体、网站或 个人未经本网协议授权不得转载、链接、转贴或以其他方式复制发表。已经本网协议授权的媒体、网站,在下载使用时必须注明稿 件来源:“智品网”,违者本网将依法追究责任。
② 本网未注明稿件来源:“智品网”的文/图等稿件均为转载稿,本网转载出于传递更多信息之目的,并不意味着赞同其观点或 证实其内容的真实性。如其他媒体、网站或个人从本网下载使用,必须保留本网注明的“稿件来源”,并自负版权等法律责任。如擅 自篡改为稿件来源:“智品网”,本网将依法追究责任。如对稿件内容有疑议,请及时与我们联系。 新闻纠错:748492175 邮箱:748492175@qq.com
③ 如本网转载稿涉及版权等问题,请作者在两周内速与智品网联系。

友情链接

关于我们 联系方式 招聘信息 版权声明 网站地图