CSS高度动态过渡动画

本文探讨了在CSS中实现动态高度元素展开和隐藏时遇到的问题,包括transition不支持height:auto,以及解决方案——使用max-height和rotate。通过实例展示了如何利用max-height避免内容溢出,以及如何用rotate实现平滑过渡,但要注意旋转可能导致的内容拥挤问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

<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);
	}
}

在这里插入图片描述

要实现CSS动态高度过渡动画,可以使用CSS的transition属性和JavaScript事件监听。首先,我们需要定义一个元素,设置它的初始高度为0,并添加一个类来控制元素的显示和隐藏。例如,我们可以使用以下CSS样式: .dynamic-height-box { height: 0; transition: height 0.3s ease; overflow: hidden; } 接下来,我们可以在JavaScript中监听事件,例如鼠标的mouseenter和mouseout事件。当鼠标进入元素时,我们可以通过添加一个类来改变元素的高度,使其展开。当鼠标离开元素时,我们可以通过移除该类来恢复元素的初始高度。以下是一个示例代码: 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'); }); 在这个示例中,当鼠标进入按钮元素时,我们会给容器元素添加一个类"unfold",这个类会改变容器元素的高度,从而实现动态高度过渡动画效果。 这样,当你将鼠标移入和移出按钮时,容器元素的高度动态地改变,从而实现了CSS动态高度过渡动画。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [CSS高度动态过渡动画](https://blog.youkuaiyun.com/sinat_39592712/article/details/112877690)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

会飞的犟驴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值