CSS高度动态过渡动画

2023-05-16

这个效果很常见,当我们需要鼠标移入移出控制元素的显示隐藏

<div class="dynamic-height-btn">Hover Me</div>
<div class="dynamic-height-box fold">
    我是动态高度内容我是动态高度内容我是动态高度内容我是动态高度内容我是动态高度内容我是动态高度内容我是动态高度内容
</div>
const box = document.querySelector('.dynamic-height-box')
const btn = document.querySelector('.dynamic-height-btn')
btn.addEventListener('mouseenter', (e) => {
  box.classList.add('unfold')
})
btn.addEventListener('mouseout', (e) => {
  box.classList.remove('unfold')
})

为了实现高度动态变化,可能第一想法是这样写CSS

.dynamic-height-btn {
	width: 80px;
	height: 20px;
	border: 1px solid #ccc;
	cursor: pointer;
}
.dynamic-height-box {
	width: 120px;
	background-color: #efefef;
	border-radius: 4px;
	transition: height 0.3s ease;
	overflow: hidden;
	will-change: height;
	height: 0;
	&.unfold {
		height: auto;
	}
}

先看看效果:

在这里插入图片描述

过渡动画并没有生效,元素的高度变化是一步到位

transition 不支持 height: auto

通过查看规范,动画未生效的原因是 CSS transition 不支持元素的高度为 auto 的变化

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

.dynamic-height-box {
	width: 120px;
	background-color: #efefef;
	border-radius: 4px;
	transition: height 0.3s ease;
	overflow: hidden;
	will-change: height;
	height: 0;
	&.unfold {
		height: 200px;
	}
}

在这里插入图片描述

但是,在元素高度不固定的情况下,即不知道有多少内容,这种方式就不适用了,会造成内容溢出或多余空白区域

使用 max-height

为了不造成内容溢出或多余空白区域的问题,使用 max-height 替换 height

.dynamic-height-box {
	width: 120px;
	background-color: gold;
	border-radius: 4px;
	transition: max-height 0.3s ease;
	overflow: hidden;
	will-change: max-height;
	max-height: 0;
	&.unfold {
		max-height: 1000px;
	}
}

在这里插入图片描述

我们可以到,动画生效了,但是,细心的同学能发现,元素展开过程的时间比搜索过程的时间要短很多。这是因为元素的实际展开高度远没有1000px,而动画是作用在max-height上的,展开动画期望的是将容器的高度在0.3s内从0拉伸到1000px,实际在大约200px的时候就停止了,所以动画时间远没有0.3s。

使用 rotate 优雅实现

使用rotate旋转容器,能避免以上所有的坑,如果不在意旋转过程中内容看起来拥挤,这不失为一个好的选择

.dynamic-height-box {
	width: 120px;
	background-color: gold;
	border-radius: 4px;
	transform: rotateX(-90deg);
	transform-origin: center top;
	transition: transform 0.3s ease;
	will-change: max-height;
	&.unfold {
		transform: rotateX(0deg);
	}
}

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CSS高度动态过渡动画 的相关文章

  • 如何修复 IE6 上的不透明度

    如何修复 IE6 上的不透明度 此代码不适用于 IE6 filter alpha opacity 50 moz opacity 0 5 khtml opacity 0 5 opacity 0 5 还有这段代码 description ani
  • 伪元素和 SELECT 标签

    是否select标签允许使用 after选择器是为了在之后创建一个伪元素吗 我在 Mac 上尝试过 Chrome Safari 和 Firefox 但似乎不起作用 这是我使用过的折衷方案 http jsfiddle net pht9d295
  • 动态突出显示时向

    添加项目符号点?

    Update 例子 p Text Text p 在示例中 是否可以选择第二个 文本 单词 p 元素并单击按钮仅动态添加项目符号点到选定的 单词 有没有可能 在一个 p p Text p 突出显示从 p 元素并添加项目符号点到按钮上动态单击的
  • 如何在Eclipse中集成CSS预处理? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想在 Eclipse 中编辑 SCSS 文件 最好使用语法突出显示 scss files 我发现这些资
  • 如何动态突出显示网页上的字符串?

    我想创建带有 url 的页面 例如 http xyzcorp schedules 2015Aug24 Aug28 Jim Hawkins http xyzcorp schedules 2015Aug24 Aug28 Billy Bones
  • 如何仅在 css/html 中强制在单词之间换行?

    我只有一段普通的文本 p 标签内的 p div 标签 但只有 Firefox 可以正确显示 Firefox 打破了单词之间的界限 所有其他浏览器都会在单词中间断行 这使得阅读变得困难 这是我的意思的一个例子 火狐浏览器 工作中 This w
  • IE 中的 HR 标签 - 删除边框

    在除 IE7 及更低版本之外的其他浏览器中 hr 在 hr 标签周围显示边框 但我不希望它出现 我已经尝试过这个解决方案 但它周围似乎仍然有边框 它看起来像这样 我该如何摆脱它 See http webdesign about com od
  • 如何在CSS中制作一个带有边框的可调整大小的心形

    我想要制作一个心形 用户可以将其大小调整为任意宽度和高度 并且边框为 1 像素 我尝试了用纯 CSS 制作的心形 https stackoverflow com a 17386187 1404447 https stackoverflow
  • 如何让div与包含td的高度相匹配?

    我沿着桌子的一排布置了三个 面板 一个比另外两个高 我希望所有三个面板都与最高的一个的高度相匹配 我尝试将 div 的样式设置为 height 100 但是即使包含的 tds 增长 短面板仍然很短 我的 HTML 是由 JSF 生成的 因此
  • 元素和 svg 形状之间的白线

    大家好 我正在使用由 shapedivider 生成的 svg 整形器 您可以看到 有一条白线 我不知道为什么它在那里以及如何删除它 请你帮助我好吗 有形状分隔符的代码 custom shape divider bottom 1640714
  • 在 HTML5 iOS 7 / iOS 8 中显示十进制键盘

    经过几个小时的搜索后 我只是有一个简单的问题 是否有可能在网络浏览器输入字段中显示小数键盘 input type number 只显示数字 但我需要在左下角使用逗号或点 我尝试过任何事情 pattern step等等 但没有显示十进制键盘
  • 使用绝对定位时文本被破坏

    我有一个小挑战 我在 Stack Overflow 上没有找到任何解决方案 这就是我得到的 这就是我想要的 为了产生这个标题效果 我使用绝对位置 我什至不知道我的标题的宽度和高度 因此 使用此解决方案时 大文本会中断 My HTML div
  • 如何让Gmail像加载进度条一样

    我想在页面的中心和顶部创建一个像 Gmail 一样的加载进度条 并适用于所有浏览器 这是基本代码
  • 将按钮文本放在一行上

    我的按钮文本在 safari 中显示在一行上 即使在初次单击后 但是在 google chrome 上 当您第一次到达该按 钮时 我的按钮将显示在一行上 但是当您浏览更多帖子并再次遇到 加载更多 按钮时 文本搞砸了 这只发生在谷歌浏览器上
  • CSS 网格框架中的间距有什么作用?

    我正在深入研究 Web 开发 并且正在使用 Blueprint CSS 框架 其中包括网格系统 我有几个问题 水沟有什么用处 当然 它们不用于在列之间包含空间 因为您可以使用 margin CSS 属性来实现这一点 对吗 或者排水沟只是一种
  • 如何使用 CSS 媒体查询检测设备方向?

    在 JavaScript 中 可以使用以下方式检测方向模式 if window innerHeight gt window innerWidth portrait true else portrait false 但是 有没有一种方法可以仅
  • 如何简化这个 LESS CSS Box-shadow mixin? (带有“方向”的多个阴影)

    如何减少这段代码 可能使用循环 以拥有一个接受方向和数字的 函数 dir 想要的 方向 number 我需要多少次影子 这里是10次 color 阴影的颜色 Example 可以工作 但不是很容易使用 perspective box dir
  • 我可以使用 ASP.NET WebForms 母版页在每个内容页中包含不同的 javascript/css 文件吗?

    我有几个使用相同母版页的内容页 它们并不都需要包含在相同的 javascript 和 css 文件中 tag 是否可以更改内容来自内容页面的标签 确实如此 但我建议采取一些不同的做法 我在关闭正文标签的正上方放置了一个内容占位符 然后我填充
  • Bootstrap 导航栏与 Google 位置重叠自动完成下拉菜单

    我有一个导航栏 我试图在其中添加一个地点搜索框 除了谷歌位置提示框的一小部分被导航栏重叠 如下图所示 之外 一切几乎都有效 我尝试过改变z index输入框的值改为10或2000或90000但似乎没有效果 我还缺少其他需要做的事情吗 这是
  • 为什么使用 iPhone 或 iOS 设备在“iframe”中查看“position:fixed”时不起作用?

    我研究过 stackoverflow 似乎position fixed在 iOS 移动设备的 iframe 中 https stackoverflow com questions 15874910 position fixed and if

随机推荐

  • 快速幂取模

    快速幂取模 C 43 43 一 题目背景 已知底数a xff0c 指数b xff0c 取模值mo 求ans 61 ab mo 二 朴素算法 xff08 已知可跳过 xff09 ans 61 1 xff0c 循环从 i 到 b xff0c 每
  • 【数据库】Mysql日期/时间函数实际案例

    有一款金融产品 xff0c 总共24期 xff0c 每月2日到期还款日 xff0c 第一个到期还款日为放款日下个月的2日 xff0c 现在我们知道所有订单的放款时间 xff0c 现在我们想统计每个订单当前时间是第几期 举个简单例子 xff1
  • 腾讯笔试04-24 题目二

    牛牛有一个长度为n的数组a xff0c 数组下标从1 n 牛牛每一次会将a中所有下标为非质数的元素进行删除 xff0c 即aj且j不为质数 在删除完成之后 xff0c 牛牛会将数组a重新按顺序拼接起来 牛牛不断循环和这个过程 xff0c 直
  • Zeal之软件开发人员的离线文档浏览器工具使用指南

    最初认识zeal是在微信公众号里安利了这款工具 xff0c 进一步了解之后才知道原来这就是我一直要找的api搜索文档工具 平时做项目整理或者归纳的东西都可以在这个工具上查阅和存档 先下载来试试手 xff01 一 进入官网下载工具 Zeal官
  • 极致简单 MAVEN 安装

    这里写自定义目录标题 下载MAVEN配置系统环境变量配置MAVEN setting xml文件 下载MAVEN 下载地址 https maven apache org download cgi 配置系统环境变量 cmd控制台测试mvn ve
  • SM4算法实现 JAVA

    span class token keyword package span sino span class token punctuation span java span class token punctuation span test
  • 极致简单 算法验证工具

    阿里云 http 101 200 44 8
  • 极致简单 spring-boot搭建

    1创建一个项目 2创建一个controller 3运行 4打开浏览器 Successfully
  • 极致简单 mybatis自动生成mapper

    1安装batter mybatis generator插件 2连接数据库 调用mybatis generate Successfully
  • kindle出现电池感叹号,充电黄灯亮,怎么解决?按AWZ客服的回复弄好了。

    AWZ客服回复 xff1a 是电池问题 过长时间未使用或电池电量严重不足等时显示 一般是阅读器电池长时间不用出现的正常现象 重新插上电源充电3小时 就可以了 xff08 我出现两次 xff0c 充电充了1小时就自动好了 xff0c 自动变为
  • 极致简单 springboot整合mybatis

    Springboot搭建 https blog csdn net sinat 38304393 article details 109066952 Mybatis generator插件安装 https blog csdn net sina
  • 极致简单 springboot整合thymeleaf

    1 pom xml添加thymeleaf依赖 span class token operator lt span span class token operator span span class token operator span t
  • AttributeError:模块“ sipbuild.api”没有针对PyQt5 5.15.0的属性“ prepare_metadata_for_build_wheel”

    AttributeError xff1a 模块 sipbuild api 没有针对PyQt5 5 15 0的属性 prepare metadata for build wheel pip install pyqt5 我遇到这个问题 xff0
  • 拯救者Y9000P2022版安装Ubuntu

    前言 当我们买了一个新电脑 新笔记本时 xff0c 如果型号比较新 xff08 通常为了追求性能 xff0c 我们总会选择新型号 xff09 xff0c 大概率Ubuntu会没有相应的硬件驱动支持 xff0c 通常是显卡和网卡不支持 配置
  • Python 字符串相似性的几种度量方法

    字符串的相似性比较应用场合很多 xff0c 像拼写纠错 文本去重 上下文相似性等 评价字符串相似度最常见的办法就是 xff1a 把一个字符串通过插入 删除或替换这样的编辑操作 xff0c 变成另外一个字符串 xff0c 所需要的最少编辑次数
  • win11右键菜单缺少“新建“选项解决办法

    1 按键盘上的WIN 43 R 键 xff0c 弹出运行窗口 xff0c 输入 xff1a notepad exe xff0c 然后点确定 2 然后弹出记事本界面 xff0c 在里面输入代码 xff1a Windows Registry E
  • VSC学习笔记

    1 VSC简介 Visual Studio Code xff08 简称VSC xff0c 下同 xff09 是微软发布的一款轻量级开源IDE xff0c 具有代码编辑 xff08 语法高亮 代码补全等 xff09 调试等特性 也拥有对Git
  • 每日程序C语言32-取一个整数从右端开始的4-7位

    题目 xff1a 取一个整数a从右端开始的4 7位 程序分析 例 xff1a 输入一个十进制数123456789 xff0c 结果为 xff1a 6543 主要代码 main c span class token keyword int s
  • 虚拟机Linux,ubontu下创建删除文件或目录

    mkdir 目录名 61 gt 创建一个目录 rmdir 空目录名 61 gt 删除一个空目录 rm 文件名 文件名 61 gt 删除一个文件或多个文件 rm rf 非空目录名 61 gt 删除一个非空目录下的一切 touch 文件名 61
  • CSS高度动态过渡动画

    这个效果很常见 xff0c 当我们需要鼠标移入移出控制元素的显示隐藏 span class token tag span class token tag span class token punctuation lt span div sp