当前位置: 首页 > news >正文

不定高元素动画实现方案(上)

前情

最近接了一个需求,需要实现一个列表,列表可展开收起,展开收起需要有一个动画效果,而列表个数不定且每项内容高度也不固定,所以是一个不定高的收起展开效果,我尝试了如下几中方式,最后选择了我觉得最佳的

通过max-height来实现

其实把高度设为auto,可以让元素高度撑开,但是auto是不会有动画效果的,此时我们可以把max-height设为一个较大的值,这样就实现动画效果了

代码如下:

<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><meta name="viewport" content="width=device-width"><title>JS Bin</title>
</head>
<body><div class="container"><div class="inner"><div class="header">header</div><ul class="list"><li>111111111</li><li>2222222222</li><li>333333333</li></ul></div></div>
</body>
</html>
*{margin: 0;padding: 0;
}
.container{width: 100%;max-height: 48px;overflow: hidden;transition:max-height .4s;
}
.container:hover{max-height: 111px;
}
.header{width: 100%;height: 48px;background-color: #ccc;display: flex;align-items: center;justify-content: center;
}
.list{background-color: green;
}

演示地址:https://jsbin.com/cedifocuci/edit?html,css,output

20250920_140623

注意:

max-height设的太高动画效果会太快,设的太小又无法适配所有高度,此方案只能说是能解决问题,但是不是最理想的方案

通过Grid布局来实现

通过网络布局,一开始设置grid-template-rows为0fr,这里有一些技巧,如果子元素有内容,0fr是不生效的,要给子元素设置min-height为0;如果初始要有基础高度,可以设置min-height为指定高度来实现基础高度,此处为48px

关键代码如下:

<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><meta name="viewport" content="width=device-width"><title>JS Bin</title>
</head>
<body><div class="container"><div class="inner"><div class="header">header</div><ul class="list"><li>Grid111111111</li><li>Grid2222222222</li><li>Grid333333333</li><li>Grid444444444</li></ul></div></div>
</body>
</html>
*{margin: 0;padding: 0;
}
.container{width: 100%;display: grid;grid-template-rows: 0fr;min-height: 48px;overflow: hidden;transition:all .4s;
}
.inner{min-height: 0;
}
.container:hover{grid-template-rows: 1fr;
}
.header{width: 100%;height: 48px;background-color: #ccc;display: flex;align-items: center;justify-content: center;
}
.list{background-color: green;
}

演示地址:https://jsbin.com/xasuviputo/edit?html,css,output

20250920_145048

注意:

主流浏览器都支持,但是部分国内浏览器还是有很大兼容问题,如果对兼容性有很高要求的话此方案就不合适了,同时如果你有基础高度,那基础高度的那一段是没有动画效果的

image

通过clip-path来实现

clip-path又叫CSS裁剪路径,clip-path 属性用于创建一个元素的可视区域,区域内的内容会显示,而区域外的内容则会被隐藏。这个属性可以用来对元素进行形状裁剪,实现各种视觉效果
此处使用clip-path:inset()来实现,可以传入四个数字inset(1 2 3 4),它们的规则如下图

PixPin_2025-09-20_16-10-01

关键代码如下:

<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><meta name="viewport" content="width=device-width"><title>JS Bin</title>
</head>
<body><div class="container"><div class="inner"><div class="header">header</div><ul class="list"><li>clip-path111111111</li><li>clip-path2222222222</li><li>clip-path333333333</li><li>clip-path444444444</li></ul></div></div>
</body>
</html>
*{margin: 0;padding: 0;
}
.container{width: 100%;clip-path: inset(0 0 calc(100% - 48px) 0);overflow: hidden;transition:all .4s;
}
.container:hover{clip-path: inset(0 0 0 0);
}
.header{width: 100%;height: 48px;background-color: #ccc;display: flex;align-items: center;justify-content: center;
}
.list{background-color: green;
}

演示地址:https://jsbin.com/zelopuyuxi/edit?html,css,output

20250920_155649

注意:

主流浏览器都支持,但是部分国内浏览器还是有很大兼容问题,如果对兼容性有很高要求的话此方案就不合适了,相比grid此方案不会有基础高度无过渡效果的问题

image 1

小结

对于做技术的我们,每天都是提出问题解决问题的一个过程,过程中会尝试各种方案,因为解决问题的方案千千万,此篇文章记录了实现不定高内容过渡效果的三种实现方式,怕篇幅太长,此文暂时写这么多,下篇继续……

http://www.zskr.cn/news/8593.html

相关文章:

  • 详细介绍:Node.js中Express框架入门教程
  • 基于LlamaIndex的相似性搜索
  • 编写代码时遇到的checkstyle问题归纳
  • kettle从入门到精通 第108课 ETL之kettle 国产麒麟系统安装kettle教程
  • 市场交易反心理特征之一:太过完美而不敢买入
  • 详细介绍:从“下山”到AI引擎:全面理解梯度下降(上)
  • flask下的MySQL增删改查
  • tips图解数组名与指针的关系
  • mysql查看数据库大小,可以通过查询系统表来实现
  • TPP21206替代MPQ8633,12A电流同步降压DCDC
  • kettle插件-kettle数据清洗插件,轻松处理脏数据
  • Java 如何在 Excel 中添加超链接?使用 Spire.XLS for Java 轻松实现 - 教程
  • RocketMQ vs RabbitMQ vs Kafka - 教程
  • 实用指南:设计模式概述
  • web应用程详解part1
  • 软工第二次作业之个人项目——论文查重
  • 对实体类Id自增
  • 深入解析:InnoDB存储引擎-锁
  • 20231326王荣盛《密码系统设计》第二周预习报告
  • Gitflow 工作流程
  • 魔改chromium真正通杀全网debugger检测
  • 【截稿倒计时、高录用、稳检索】2025年教育创新与信息技术国际学术会议(EIIT 2025)
  • hashcat高效爆破Wi-Fi密码方法(比aircrack-ng快)
  • 更新到macOS Sequoia后,chrome无法用ip访问192.168.*
  • Typora标题自动显示序号,大纲中也显示序号
  • 【IEEE出版、格林威治大学主办】第六届信息科学与并行、分布式处理国际学术会议(ISPDS 2025)
  • 【2025-09-18】工作情绪
  • Ubuntu 系统部署 LNMP 环境详细教程(附shell脚本一键部署↓) - 指南
  • 详细介绍:7HTMLCSS高级
  • C++学习笔记之输入输出流 - 教程