0

0

如何通过css animation控制高度和宽度变化

P粉602998670

P粉602998670

发布时间:2025-09-19 19:52:01

|

323人浏览过

|

来源于php中文网

原创

答案:控制css动画中高度和宽度变化需注意性能、auto值处理、box-sizing影响及缓动函数选择。关键在于避免直接动画height/width引发的重排,推荐用transform: scale()提升性能;应对height: auto时可采用max-height配合overflow: hidden实现平滑展开;同时合理设置box-sizing确保尺寸预期一致,并通过cubic-bezier等缓动函数增强视觉流畅性,在手风琴、模态框、骨架屏等场景中实现自然的布局动态效果。

如何通过css animation控制高度和宽度变化

通过CSS

animation
控制元素的高度和宽度变化,核心在于利用
@keyframes
规则定义动画序列中不同时间点的
height
width
属性值。这让你能够精确地编排元素从一个尺寸平滑过渡到另一个尺寸,甚至在多个尺寸之间循环,实现比简单
transition
更复杂的动态效果。

解决方案

要实现通过

animation
控制高度和宽度变化,你需要定义一个
@keyframes
规则来指定动画的名称和关键帧(例如,0%、50%、100%等),然后在这些关键帧中设定目标元素的
height
width
属性。接着,将这个动画应用到目标元素上。

/* 定义一个名为 'sizeChange' 的动画 */
@keyframes sizeChange {
  0% {
    width: 100px;
    height: 50px;
    background-color: lightblue;
  }
  50% {
    width: 200px;
    height: 100px;
    background-color: coral;
  }
  100% {
    width: 150px;
    height: 75px;
    background-color: lightgreen;
  }
}

/* 将动画应用到某个元素 */
.animated-box {
  width: 100px;
  height: 50px;
  background-color: lightblue;
  border: 1px solid #333;
  margin: 20px;

  /* 应用动画 */
  animation-name: sizeChange; /* 动画名称 */
  animation-duration: 4s; /* 动画持续时间 */
  animation-timing-function: ease-in-out; /* 动画速度曲线 */
  animation-iteration-count: infinite; /* 动画播放次数,infinite表示无限循环 */
  animation-direction: alternate; /* 动画方向,alternate表示来回播放 */
  /* animation-fill-mode: forwards; */ /* 动画结束后保持最后一帧状态 */
}

这段代码定义了一个名为

sizeChange
的动画,它让一个元素的宽度从100px变到200px再变到150px,高度也随之变化,并且背景色也会同步过渡。通过
animation
属性的简写形式或各个子属性,你可以精细控制动画的持续时间、速度曲线、循环次数、播放方向等。这给了我们极大的灵活性去构建各种视觉效果,从简单的尺寸调整到复杂的布局动态。

keyframes
动画中高度和宽度变化的关键考量是什么?

当我们决定用

@keyframes
来控制元素的尺寸变化时,这背后其实藏着一些值得深思的技术点,并非简单地写上
height
width
属性就能万事大吉。我个人在实践中,最先考虑的往往是性能问题,毕竟谁也不想看到动画卡顿。

立即学习前端免费学习笔记(深入)”;

首先,性能开销是绕不开的话题。直接动画

height
width
属性,浏览器在每一帧都需要重新计算元素的布局(layout),这通常会导致页面重排(reflow),如果页面结构复杂,或者动画元素数量多,很容易造成性能瓶颈,用户就会觉得“卡”。相比之下,
transform: scale()
opacity
等属性的动画则通常只涉及渲染层(compositing),性能表现会好很多。所以,如果你的动画仅仅是等比例放大缩小,或者不需要精确到像素的尺寸变化,
transform: scale()
会是更好的选择。

其次,

auto
值的处理是个常见陷阱。你可能想让一个元素从
height: 0
展开到
height: auto
,以适应其内容。然而,
height: auto
是一个动态值,浏览器无法在动画开始前预知其最终的像素值,因此无法进行平滑插值。直接从
0
auto
的动画效果会非常生硬,甚至没有动画。我通常的解决方案是,要么通过JavaScript在动画开始前获取到
auto
对应的精确像素值,然后动画到这个固定值;要么,更常见也更推荐的做法是,使用
max-height
属性。你可以将
max-height
0
动画到一个足够大的固定值(比如
1000px
),确保它能容纳所有内容,同时结合
overflow: hidden
来隐藏超出部分。这样,元素会平滑地“展开”,虽然目标值不是
auto
,但视觉效果上是等价的。

/* 针对从0到auto的展开效果 */
.expand-box {
  height: 0; /* 初始高度为0 */
  max-height: 0; /* 配合max-height */
  overflow: hidden; /* 隐藏溢出内容 */
  transition: max-height 0.5s ease-out; /* 使用transition,animation原理类似 */
}

.expand-box.is-expanded {
  max-height: 500px; /* 展开到足够大的值 */
}

/* 如果用animation,@keyframes可以这样定义 */
@keyframes expandContent {
  from {
    max-height: 0;
  }
  to {
    max-height: 500px; /* 假设最大高度不会超过500px */
  }
}

.animated-expand-box {
  height: auto; /* 实际高度由内容决定 */
  max-height: 0;
  overflow: hidden;
  animation-name: expandContent;
  animation-duration: 0.5s;
  animation-fill-mode: forwards;
  /* ...其他动画属性 */
}

再者,

box-sizing
属性也会影响你对尺寸变化的预期。如果你在动画中改变
width
height
,而元素的
padding
border
是固定的,那么
content-box
border-box
的表现会完全不同。在
border-box
模式下,
width
height
包含
padding
border
,这通常更符合我们直观的尺寸控制;而在
content-box
模式下,
width
height
只代表内容区域,最终元素的总尺寸会更大。理解这一点,可以避免动画过程中出现意外的尺寸跳动。

最后,动画的缓动函数(timing-function)同样重要。

ease-in-out
linear
cubic-bezier
等不同的函数,能赋予动画截然不同的“性格”。一个生硬的
linear
动画可能看起来很机械,而一个精心设计的
cubic-bezier
则能让尺寸变化显得更有生命力,比如先加速后减速,或者带有轻微的“弹跳”感。这在用户体验层面,有时比像素级的精确度更关键。

动画高度和宽度时如何避免常见的性能陷阱?

正如我前面提到的,直接动画

height
width
属性确实是性能陷阱的高发区。避免这些陷阱,不仅仅是优化代码,更是一种对用户体验的尊重。

一个非常有效的策略是优先使用

transform: scale()
。当你的目标只是让元素看起来变大或变小,而不是改变它在文档流中占据的空间时,
scale()
是首选。
transform
属性的动画通常由GPU处理,不会触发布局重排,性能表现极佳。

Kacha
Kacha

KaCha是一款革命性的AI写真工具,用AI技术将照片变成杰作!

下载
@keyframes scaleChange {
  0% {
    transform: scale(1); /* 初始比例 */
    background-color: lightblue;
  }
  50% {
    transform: scale(1.5); /* 放大1.5倍 */
    background-color: coral;
  }
  100% {
    transform: scale(1.2); /* 缩小到1.2倍 */
    background-color: lightgreen;
  }
}

.animated-scaled-box {
  width: 100px; /* 元素实际占据的空间不变 */
  height: 50px;
  background-color: lightblue;
  border: 1px solid #333;
  margin: 20px;

  animation-name: scaleChange;
  animation-duration: 4s;
  animation-timing-function: ease-in-out;
  animation-iteration-count: infinite;
  animation-direction: alternate;
}

你看,这个例子中,

width
height
是固定的,但通过
transform: scale()
,元素在视觉上实现了尺寸变化,同时避免了布局重排。

当确实需要改变元素在文档流中占据的空间时,例如手风琴效果的展开,

max-height
max-width
配合
overflow: hidden
是比直接动画
height
/
width
更优的方案,尤其是在涉及
auto
值时。虽然
max-height
的动画仍然会触发布局,但它避免了从
0
auto
这种无法插值的问题,并且在很多情况下,其性能表现比直接动画
height
要好一些。关键在于,你要给
max-height
设置一个足够大的值,确保它能容纳所有内容,但又不能过大导致动画时间过长或出现不自然的“空白”等待。

此外,合理使用

will-change
属性也可以在一定程度上帮助浏览器优化。
will-change
可以提前告知浏览器哪些属性将要发生变化,让浏览器有机会提前进行一些优化,比如创建独立的渲染层。但这个属性要慎用,滥用反而可能导致性能下降,因为它会消耗额外的内存和GPU资源。只在动画即将开始前,并且确实能带来性能提升的情况下使用它。

.potentially-animated-element {
  /* ...其他样式 */
  will-change: width, height, transform; /* 告诉浏览器这些属性可能会变化 */
}

最后,简化

keyframes
的复杂性。如果你的动画有太多的关键帧,或者关键帧之间变化幅度过大,也会增加浏览器的计算负担。尽量保持关键帧的简洁和变化路径的平滑。有时候,一个简单的两步动画(
from
to
)配合合适的缓动函数,效果可能比十几个关键帧的复杂动画更好,而且性能更优。这就像写文章,有时候精炼的几句话比冗长的大段文字更能打动人。

结合实际场景,
animation
在布局动态变化中有什么创新应用?

animation
在布局动态变化中的应用远不止于简单的尺寸伸缩,它能为用户界面带来生动的反馈和更流畅的体验。从我的角度看,这些应用往往是设计师和开发者共同创新的结果。

1. 优雅的展开/折叠组件(Accordion/Collapse):这是最经典的用例之一。当我们点击一个标题,下面的内容区域平滑地展开或折叠,这通常就是通过

animation
(或
transition
结合
max-height
)来控制高度变化的。创新之处在于,你可以为展开和折叠设置不同的缓动函数,或者在展开过程中,让内容稍微“弹跳”一下,增加趣味性。

/* 一个简单的手风琴展开动画 */
@keyframes accordionExpand {
  from {
    max-height: 0;
    opacity: 0;
  }
  to {
    max-height: 300px; /* 假设内容最大高度 */
    opacity: 1;
  }
}

.accordion-content {
  overflow: hidden;
  max-height: 0;
  opacity: 0;
  /* 当某个类被添加时触发动画 */
  /* .is-expanded {
    animation: accordionExpand 0.5s ease-out forwards;
  } */
}

2. 模态框(Modal)和侧边栏(Sidebar)的登场与退场:这些覆盖层组件的出现和消失,如果只是生硬地显示隐藏,体验会很差。通过

animation
控制它们的宽度、高度(或者更常见的
transform
opacity
),可以实现从屏幕边缘滑入、从中心放大等效果。例如,一个侧边栏可以从屏幕左侧以
width: 0
开始,动画到
width: 300px
,同时内容逐渐显现。

3. 骨架屏(Skeleton Loaders)的动态占位:在内容加载完成之前,我们通常会显示一个灰色的占位符,这就是骨架屏。骨架屏中的文本行、图片区域等,它们的尺寸和形状是预设的。

animation
可以用来让这些占位符在加载过程中产生微小的尺寸变化,或者通过
gradient
动画制造“波浪”效果,模拟内容正在被“填充”的感觉,从而减少用户的等待焦虑。

4. 动态图表和数据可视化:这绝对是

animation
的用武之地。当数据更新时,图表中的柱状图、饼图扇区等元素,它们的宽度或高度会随之变化。如果能通过
animation
让这些变化平滑过渡,而非瞬间跳变,数据趋势的展示会更加直观和富有表现力。比如,柱状图的柱子从底部逐渐“生长”到新的高度。

5. 微交互(Micro-interactions)中的反馈:用户点击按钮、输入表单时,我们希望给他们即时反馈。一个按钮在点击后,可以有一个微小的宽度或高度收缩动画,然后恢复,模拟“按下”的物理感。或者一个输入框在获得焦点时,底部边框可以有一个从细到粗的宽度动画。这些细微的尺寸变化,虽然不影响布局,却极大地提升了用户界面的“活泼感”。

这些创新应用的核心思想都是一样的:利用CSS

animation
赋予界面元素生命力,让用户感受到界面的响应和流畅。这不仅仅是技术实现,更是一种设计哲学,即如何通过动态效果来优化用户体验。我始终认为,好的动画应该是不着痕迹地提升用户感知,而不是喧宾夺主。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
function是什么
function是什么

function是函数的意思,是一段具有特定功能的可重复使用的代码块,是程序的基本组成单元之一,可以接受输入参数,执行特定的操作,并返回结果。本专题为大家提供function是什么的相关的文章、下载、课程内容,供大家免费下载体验。

499

2023.08.04

js函数function用法
js函数function用法

js函数function用法有:1、声明函数;2、调用函数;3、函数参数;4、函数返回值;5、匿名函数;6、函数作为参数;7、函数作用域;8、递归函数。本专题提供js函数function用法的相关文章内容,大家可以免费阅读。

166

2023.10.07

overflow什么意思
overflow什么意思

overflow是一个用于控制元素溢出内容的属性,当元素的内容超出其指定的尺寸时,overflow属性可以决定如何处理这些溢出的内容。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1858

2024.08.15

css中的padding属性作用
css中的padding属性作用

在CSS中,padding属性用于设置元素的内边距。想了解更多padding的相关内容,可以阅读本专题下面的文章。

175

2023.12.07

html边框设置教程
html边框设置教程

本教程将带你全面掌握HTML/CSS边框设置,从基础的border属性讲起,涵盖所有边框样式、圆角设置及高级技巧,帮助你快速上手实现各种边框效果。

44

2025.09.02

css3transition
css3transition

css3transition属性用于指定如何从一个CSS样式过渡到另一个CSS样式,本专题为大家提供transition相关的文章、相关下载和相关课程,大家可以免费体验。

261

2023.06.27

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

22

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

48

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

93

2026.03.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 0.9万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.6万人学习

CSS教程
CSS教程

共754课时 | 42.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号