0

0

如何用css animation实现多属性同时动画

P粉602998670

P粉602998670

发布时间:2025-09-18 10:51:01

|

217人浏览过

|

来源于php中文网

原创

CSS多属性动画的核心在于@keyframes定义各时间点的样式状态,通过animation属性应用,实现transform、opacity等属性的同步变化,并利用百分比节点和缓动函数精确控制动画阶段;为避免性能问题,应优先使用GPU加速属性如transform和opacity,避免频繁触发布局重排,合理使用will-change,减少复杂动画叠加;除@keyframes外,transition适用于简单状态过渡,Web Animations API提供更强大的JavaScript控制能力,三者各有适用场景。

如何用css animation实现多属性同时动画

CSS

animation
实现多属性同时动画的核心机制,在于巧妙地利用
@keyframes
规则来定义元素在不同时间点(或说动画进度百分比)的样式状态。它不像
transition
那样只能响应单一事件并从A到B,
animation
赋予了我们更精细、更自由的控制权,能够编排一整套复杂的视觉序列,让多个属性在同一时间轴上协同变化,甚至可以循环往复。

解决方案

要用CSS

animation
实现多属性同时动画,关键在于构建一个
@keyframes
规则,并在其中为不同的动画进度百分比(
0%
100%
)定义目标元素的多个CSS属性。然后,通过
animation
属性将这个关键帧规则应用到目标元素上。

例如,我们想让一个元素在动画过程中同时改变它的位置、大小和透明度:

/* 定义关键帧动画 */
@keyframes multiPropertyMoveScaleFade {
  0% {
    transform: translateX(0) scale(1);
    opacity: 1;
    background-color: #3498db;
  }
  50% {
    transform: translateX(100px) scale(1.2);
    opacity: 0.5;
    background-color: #e74c3c;
  }
  100% {
    transform: translateX(200px) scale(0.8);
    opacity: 1;
    background-color: #2ecc71;
  }
}

/* 将动画应用到元素 */
.animated-box {
  width: 100px;
  height: 100px;
  background-color: #3498db;
  margin: 50px;
  /* 应用动画:动画名称 持续时间 缓动函数 延迟 迭代次数 动画方向 填充模式 播放状态 */
  animation: multiPropertyMoveScaleFade 4s ease-in-out 0s infinite alternate forwards;
}

在这个例子中,

multiPropertyMoveScaleFade
关键帧规则定义了三个状态:

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

  • 0%
    :初始状态,元素在原位,正常大小,完全不透明,蓝色背景。
  • 50%
    :中间状态,元素向右移动
    100px
    ,放大
    1.2
    倍,半透明,红色背景。
  • 100%
    :结束状态,元素向右移动
    200px
    ,缩小
    0.8
    倍,完全不透明,绿色背景。

通过在每个百分比节点同时定义

transform
(包含
translateX
scale
)、
opacity
background-color
,我们就实现了这些属性的同步动画。浏览器会平滑地在这三个状态之间进行插值计算,从而呈现出流畅的多属性动画效果。

如何精确控制不同动画阶段的多个CSS属性?

在我看来,精确控制多属性动画的关键在于

百分比
的巧妙运用,以及对
animation-timing-function
的理解。有时候我会觉得,初学者往往只关注
0%
100%
,但真正能玩出花样,让动画富有表现力的,是中间的那些百分比节点。

你可以为动画的任意阶段定义一个或多个属性的精确值。比如,你想让一个元素先快速移动,然后慢速旋转,最后再快速淡出,这些都可以在同一个

@keyframes
规则中实现:

@keyframes preciseControlAnimation {
  0% {
    transform: translateX(0) rotate(0deg);
    opacity: 1;
  }
  20% { /* 快速移动 */
    transform: translateX(150px) rotate(0deg);
    opacity: 1;
    /* 可以在这里加入一个特定的缓动函数,但通常animation-timing-function是全局的 */
  }
  70% { /* 慢速旋转 */
    transform: translateX(150px) rotate(360deg);
    opacity: 0.8;
  }
  100% { /* 快速淡出 */
    transform: translateX(200px) rotate(360deg);
    opacity: 0;
  }
}

.precise-animated-box {
  width: 80px;
  height: 80px;
  background-color: #9b59b6;
  margin: 50px;
  animation: preciseControlAnimation 6s ease-out forwards;
}

在这个例子里,

20%
70%
这两个中间节点起到了至关重要的作用。它们将整个动画过程分成了三个逻辑阶段,每个阶段都有其独特的属性变化节奏。从
0%
20%
主要是
translateX
的变化,
20%
70%
主要是
rotate
opacity
的变化,而
70%
100%
则是
opacity
translateX
的协同变化。

奥硕企业网站管理系统3.0.2
奥硕企业网站管理系统3.0.2

临沂奥硕软件有限公司拥有国内一流的企业网站管理系统,奥硕企业网站管理系统真正会打字就会建站的管理系统,其强大的扩展性可以满足企业网站实现各种功能(唯一集成3O多套模版的企业建站系统)奥硕企业网站管理系统具有一下特色功能1、双语双模(中英文采用单独模板设计,可制作中英文不同样式的网站)2、在线编辑JS动态菜单支持下拉效果,同时生成中文,英文,静态3个JS菜单3、在线制作并调用FLASH展示动画4、自

下载

此外,

animation-timing-function
属性虽然是应用于整个动画周期的,但通过在关键帧中设置不同的百分比节点,我们实际上是在改变属性值在这些节点间的插值速度。例如,
ease-in
会让动画开始时慢,然后加速;
ease-out
则相反。选择合适的缓动函数,能让动画看起来更自然,更符合物理规律。对我而言,
cubic-bezier
给我提供了最大的自由度,可以自定义出非常独特的动画曲线。

CSS动画多属性同时执行时,如何避免性能问题或冲突?

谈到性能,这是我做前端时特别关注的一点。多属性动画确实强大,但如果不注意,也很容易变成性能杀手。避免性能问题和冲突,主要有几个方面:

  1. 优先使用 GPU 加速属性: 浏览器渲染动画时,有些属性的变化可以直接由图形处理器(GPU)处理,效率极高,比如
    transform
    (包括
    translate
    ,
    scale
    ,
    rotate
    ,
    skew
    ) 和
    opacity
    。这些属性不会引起页面布局(layout)或绘制(paint)的重新计算,只会影响复合(composite)阶段。我一般会尽量让动画集中在这类属性上。
  2. 避免触发布局(Layout)和绘制(Paint):
    width
    ,
    height
    ,
    margin
    ,
    padding
    ,
    top
    ,
    left
    (当
    position
    static
    以外的值时),以及
    font-size
    ,
    color
    等属性的变化,可能会导致浏览器重新计算元素的几何位置和大小,甚至重绘整个页面或部分区域。频繁地触发这些操作,尤其是在动画过程中,会显著降低性能,导致卡顿。如果非要动画这些属性,尽量减少变化的幅度或频率。
  3. 使用
    will-change
    提前告知浏览器:
    will-change
    属性是一个优化利器。它能告诉浏览器,某个元素或某些属性即将发生变化,让浏览器有机会提前进行优化,比如为该元素创建一个独立的渲染层。但要注意,滥用
    will-change
    反而可能适得其反,因为它会消耗额外的内存和资源。只在你确定某个元素将要进行复杂动画时才使用它,并且在动画结束后移除它(如果可能的话)。
    .animated-element {
      will-change: transform, opacity; /* 告知浏览器这两个属性会变化 */
      /* ... 其他动画属性 ... */
    }
  4. 避免动画过多元素或复杂路径: 同时动画几十个、上百个元素,或者让元素沿着非常复杂的 SVG 路径运动,即使是 GPU 加速属性,也可能超出浏览器的处理能力。适度是关键。
  5. 减少动画的迭代次数和持续时间: 无限循环的动画如果过于复杂,长期运行也会消耗资源。如果不是必须,可以考虑有限次循环或较短的持续时间。

至于冲突,这通常发生在同一个元素上应用了多个动画,或者动画与

transition
属性同时存在时。CSS 动画的优先级规则通常是:

  • animation
    属性会覆盖
    transition
    属性。
  • 如果同一个元素应用了多个
    animation
    属性(通过逗号分隔),它们会同时运行。如果它们试图动画同一个属性,那么最后定义的动画规则会生效。例如
    animation: animA 2s, animB 3s;
    如果
    animA
    animB
    都动画
    opacity
    ,那么
    animB
    opacity
    动画会覆盖
    animA
    的。 我的经验是,最好将一个元素的动画逻辑集中在一个
    @keyframes
    规则中,这样更容易管理和调试,也能有效避免不必要的冲突。

除了@keyframes,还有哪些方法可以实现CSS多属性动画,它们的优劣是什么?

除了

@keyframes
,我们确实还有其他实现CSS动画的方式,它们各有侧重,适用于不同的场景。在我看来,选择哪种方式,更多是看你想要实现的效果和动画的复杂程度。

  1. CSS

    transition
    属性:

    • 实现方式:
      transition
      主要用于在元素状态改变时(例如
      hover
      ,
      focus
      ,
      active
      或者通过 JavaScript 添加/移除类)平滑地过渡一个或多个CSS属性。你可以在一个
      transition
      属性中指定多个属性进行过渡,用逗号分隔。
      .box {
        width: 100px;
        height: 100px;
        background-color: blue;
        transition: width 0.5s ease-in-out, background-color 0.5s ease-out;
      }
      .box:hover {
        width: 200px;
        background-color: red;
      }
    • 优点: 语法简洁,非常适合简单的交互式动画,比如按钮的悬停效果、菜单展开/收起等。代码量少,易于理解和维护。
    • 缺点: 只能定义两个状态(起始和结束),无法实现复杂的序列动画,也不能自动循环播放。动画的触发必须依赖于某个事件或状态变化。
    • 适用场景: 页面元素的微交互,状态切换时的平滑过渡。
  2. Web Animations API (WAAPI):

    • 实现方式: WAAPI 是一种 JavaScript API,它允许开发者通过 JavaScript 来创建和控制动画。它提供了比 CSS
      animation
      更强大的编程能力,你可以精确控制动画的播放、暂停、反向、速度等,并且可以动态地创建关键帧。
      const box = document.querySelector('.box');
      box.animate([
        { transform: 'translateX(0)', opacity: 1, backgroundColor: 'blue' },
        { transform: 'translateX(100px)', opacity: 0.5, backgroundColor: 'red' },
        { transform: 'translateX(200px)', opacity: 0, backgroundColor: 'green' }
      ], {
        duration: 2000,
        iterations: Infinity,
        direction: 'alternate',
        easing: 'ease-in-out'
      });
    • 优点: 极高的灵活性和控制力,可以实现非常复杂的动画逻辑,例如基于用户输入的实时动画、动画链、动画组等。性能通常也很好,因为它与浏览器底层的动画引擎紧密集成。
    • 缺点: 需要 JavaScript 编程,对于纯 CSS 就能解决的问题,引入 JS 会增加复杂性。学习曲线相对陡峭一些。
    • 适用场景: 动画逻辑复杂、需要与 JavaScript 深度交互、或者需要动态生成动画的场景。

在我看来,

@keyframes
是实现声明式、预定义动画序列的最佳选择,它把动画逻辑和样式紧密结合,非常符合 CSS 的设计哲学。
transition
则是处理简单状态切换的瑞士军刀,轻巧高效。而 WAAPI 就像是动画领域的编程语言,它赋予了我们无与伦比的控制权,去创造那些纯 CSS 难以企及的动态体验。通常,我会根据动画的需求和复杂度,优先考虑纯 CSS 方案,如果遇到瓶颈或更复杂的交互需求,才会转向 WAAPI。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

514

2023.06.20

js获取当前时间
js获取当前时间

JS全称JavaScript,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言;它是一种属于网络的高级脚本语言,主要用于Web,常用来为网页添加各式各样的动态功能。js怎么获取当前时间呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

244

2023.07.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

298

2023.08.03

js是什么意思
js是什么意思

JS是JavaScript的缩写,它是一种广泛应用于网页开发的脚本语言。JavaScript是一种解释性的、基于对象和事件驱动的编程语言,通常用于为网页增加交互性和动态性。它可以在网页上实现复杂的功能和效果,如表单验证、页面元素操作、动画效果、数据交互等。

5306

2023.08.17

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

481

2023.09.01

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

212

2023.09.04

Js中concat和push的区别
Js中concat和push的区别

Js中concat和push的区别:1、concat用于将两个或多个数组合并成一个新数组,并返回这个新数组,而push用于向数组的末尾添加一个或多个元素,并返回修改后的数组的新长度;2、concat不会修改原始数组,是创建新的数组,而push会修改原数组,将新元素添加到原数组的末尾等等。本专题为大家提供concat和push相关的文章、下载、课程内容,供大家免费下载体验。

218

2023.09.14

js截取字符串的方法介绍
js截取字符串的方法介绍

JavaScript字符串截取方法,包括substring、slice、substr、charAt和split方法。这些方法可以根据具体需求,灵活地截取字符串的不同部分。在实际开发中,根据具体情况选择合适的方法进行字符串截取,能够提高代码的效率和可读性 。

219

2023.09.21

俄罗斯Yandex引擎入口
俄罗斯Yandex引擎入口

2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

158

2026.01.28

热门下载

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

精品课程

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

共14课时 | 0.8万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3万人学习

CSS教程
CSS教程

共754课时 | 24.7万人学习

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

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