CSS 动画指南: 原理和实战 (一)

CSS3 transition过渡:打造流畅动画效果的全面指南 transition属性是CSS3中用于定义元素从一种样式状态平滑过渡到另一种样式状态的动画效果。当元素的指定样式属性发生变化时,transition会自动为其添加一个过渡动画,而非立即跳变。Css.element {CSS3transition属性为网页元素的样式变化提供了优雅的过渡动画效果,极大地增强了网页的动态表现力和用户体验。通过深入理解transition属性的工作原理、组成部分以及实际应用技巧,您将能灵活运用这一特性,为您的项目增添生动而流畅的动画效果。 阅读详情
AI摘要

本文详细介绍了CSS动画的基本概念、使用方法及实战案例,遵循迪士尼动画的12条准则,通过实例演示如何创建逼真的动画效果,涵盖挤压与拉伸、预期、舞台布局、顺序动画与关键帧填充、动作跟随与重叠、慢进慢出、弧形运行等动画原则。

简介:无论动画以何种技术载体呈现,无论是传统的手绘动画,还是电脑生成的3D动画,也无论是用Flash还是CSS, 动画的基本原理和设计准则都未曾变过的。 在这篇文章中,我们会先解释CSS动画的基本概念,并且介绍使用CSS创建动画的要点。我们以一个例子贯穿始终,利用传统动画的准则来逐步构建这个动画。


作者: Tom Waterhouse

原文连接:http://coding.smashingmagazine.com/2011/09/14/the-guide-to-css-animation-principles-and-examples/#more-105335

译者: feijia  (tiimfei@gmail.com)

(译者注:本文章中的示例页面需要翻墙,并推荐使用最新的FF,Chrome等查看)

下篇已经发表:

CSS 动画指南: 原理和实战(二)


Firefox和Webkit系列的浏览器都已经支持CSS 动画,是时候动手学习这个新的技术了。 不管动画以何种技术载体呈现,无论是传统的手绘动画,还是电脑生成的3D动画,也无论是使用Flash技术还是CSS3, 制作动画的基本原理和设计准则都未曾改变。 在这篇文章中,我们会先解释CSS动画的基本概念,并且介绍使用CSS创建动画的要点。我们将以一个网球下落的例子贯穿始终,利用传统动画的准则来逐步构建这个CSS动画。最后我们会看一些真实世界里的CSS动画用法。 




CSS 动画属性


在开始前,我们需要了解CSS 动画的基础知识。 动画是一种新的CSS 特性,它可以在不借助JavaScript和Flash的情况下使绝大多数HTML元素动起来(例如div,h1,或者Span等等) 。 现在它已经被Webkit家族的浏览器(包括Safari 4+, Safari for iOS(iOS2+),Chrome1+ ) 以及Firefox 5 所支持。不支持这些属性的浏览器则会直接忽略它们,所以使用它们时最好确定你的页面不会完全依赖这些动画属性(译者:或者你可以使用一些代码来检查用户的浏览器是否支持css动画特性 https://developer.mozilla.org/en/CSS/CSS_animations/Detecting_CSS_animation_support)

目前这一属性还比较新,所以各家浏览器厂商在自己支持的属性前都加上了前缀 如-moz- (firefox), -webkit- (Safari 和Chrome)在本文的示例代码中为简洁起见,我们只使用-webkit- 前缀。

CSS动画的声明就是将一段描述动画的样式附加到目标元素上,

/* 这是一段动画代码*/
@-webkit-keyframes example {
   from { transform: scale(2.0); }
   to   { transform: scale(1.0); }
}

/* 这是动画即将应用的目标元素 */
div {
   -webkit-animation-name: example;
   -webkit-animation-duration: 1s;
   -webkit-animation-timing-function: ease; /* ease is the default */
   -webkit-animation-delay: 1s;             /* 0 is the default */
   -webkit-animation-iteration-count: 2;    /* 1 is the default */
   -webkit-animation-direction: alternate;  /* normal is the default */
}

这段代码中,第一部分是描述动画的样式,名字叫“example",它可以出现在样式表中的任何位置,或前或后。在描述元素的类中可以使用animation-name 属性来指定要使用哪个动画效果。

跟其他的样式写法类似的,上面例子中的几个动画属性都可以简写成如下格式:


div {
-webkit-animation: example 1s ease 1s 2 alternate;
}

甚至你也可以把所有的值都省略掉,这时浏览器会直接使用默认值。 好了,这些就是基本概念了,应该挺简单的吧?

传统动画的基本准则

迪士尼 - 传动动画的鼻祖和大师- 很早就提出了制作动画的12条准则,并出版了著作:The Illusion of life 来阐述这些准则。 这些基本的准则可以应用到所有的动画中去,实际上你不需要是个动画专家也可以学着遵循这些准则。 我们会试着遵循这12条“动画军规”,并使用CSS来实现更逼真可信的动画效果。


挤压与拉伸(Squash and Stretch)



如果物体在运动过程中它本身的形体不发生任何变化,那会显得的非常僵硬。上图演示是一个夸张的弹跳的网球的草图。当网球从高处落下并撞击地面时,你会看到球被压扁了,而后它再次离地弹起时,又被拉长了。

球被压扁和拉伸的过程能够让人感觉到网球的弹性,想象一下如果是一个又重又硬的保龄球掉落下来,肯定不会有这样的效果, 那肯定要把地板砸出个窟窿。
实现上面草图中网球球落地压扁再拉伸的效果,我们只要应用CSS3中的transform属性就能实现:

@-webkit-keyframes example {
   0% { -webkit-transform: scaleY(1.0); }
   50% { -webkit-transform: scaleY(1.2); }
   100% { -webkit-transform: scaleY(1.0); }
}

上述代码会在动画的不同阶段把页面对象按照纵向(y轴) 拉伸1.2倍再变回原样。

这段代码中我们使用了百分比的方式来指定了变形在动画过程中发生具体时间(也叫关键帧)。对于简单的动画,你可以直接使用from和to来指定开始和结束的动画状态。使用百分比,则可以更加精细的控制动画播放的关键过程。

接下来我们可以使用translate 属性来让物体动起来。我们可以把transform和translate合并使用:

50% {
-webkit-transform: translateY(-300px) scaleY(1.2);
}

使用translate属性可以在不改变对象其他属性(例如位置,高度或宽度)的前提下操纵对象的位置,因此该属性常用于CSS动画制作。上述例子代码,指定了球在动画播放中点(50%)处的样子,使它看起来像是正在反弹离开地面。


注意:要看到我们的例子运行时的效果,你需要使用最新的FF,Chrome或Safari, 在本文写作时,Safari提供了最好的动画体验)

查看示例

好吧,我得承认到目前为止,这个动画还是挺垃圾的。但是我们已经向“逼真”这个目标迈进了第一步!

预期(Aniticipation)


预期,就是在人物出场或动作开始前的先兆,它可以增加悬念。例如,当一个人屈腿下蹲,就会让观众联想到他马上将要起跳了。在我们的掉落小球的动画里,如果我们在球出现之前,加上一个球的阴影,那么无疑是在为观众构造了一个悬念:马上要有一个球掉下来了!

查看示例

我们使用了一个新的DIV元素来表示阴影,这样我们就可以在动画中分别控制阴影和小球。 为了制造这种球即将下落的悬念,我们故意在动画开始时增加一点延时,让小球不是立即掉下来。 只要稍稍调整一下我们动画设置的百分比的位置即可:

@-webkit-keyframes example {
   0% { -webkit-transform: translateY(-300px) scaleY(1.2); }
   35% { -webkit-transform: translateY(-300px) scaleY(1.2); } /* 和开始时同样的位置,即让球等待一会儿再下落 0% */
   65% { -webkit-transform: translateY(0px) scaleY(1.2); }    /* 当动画播放到65%时,球再开始下落 */
   67% { -webkit-transform: translateY(10px) scaleY(0.8); }
   85% { -webkit-transform: translateY(-100px) scaleY(1.2); }
   100% { -webkit-transform: translateY(0px); }
}


在动画35%的关键帧设置中,球的位置没有变化,而到65%时,球才完全落地。 除了使用这种方法,你还可以用 animate-delay属性来设置动画延迟以达到增加悬念的效果

div {
-webkit-animation-delay: 1s;
}

舞台布局(Staging)

迪士尼动画电影里绚丽多彩的背景是表现人物的重要手段!因此我们也需要为我们的动画创造一个舞台。


舞台同时也是帮助动画观众集中注意力的方法,就像在一个剧院中舞台上的聚光灯,会牵引观众的视线。 在我们的小球动画中,我已经加入了一个简单的背景,这个背景使得观众能够知道动画即将发生在页面的中央。

顺序动画和关键帧填充(Straight-Ahead vs. Pose to Pose)

传统动画中,有两种构建动画的手段。第一种是顺序动画,即从动画的第一帧开始绘制按照时间顺序一帧一帧的完成整个动画。第二种方法称为"Pose to Pose", 直译为从姿势到姿势。即先描绘出动画过程中若干关键帧的内容,然后再去填充关键帧之间的部分从而逐步完成整个动画。 填充关键帧之间内容的过程称为”in-betweening,” or “tweening,” 如果你制作过Flash动画,应该对这些术语不会陌生。

对CSS动画而言,我们一般使用关键帧填充的方式来完成动画。我们先描述动画过程中的关键帧,而后浏览器会自动帮我们完成填充。 不过,有时候我们也需要借助顺序动画的方法来达到精细控制动画效果的目的,浏览器能够自动实现的效果总是有限的。

动作跟随和重叠(Follow-Through and Overlapping)

动作跟随的本质是物理学,要让动画逼真就得让其中的物体和人物的行为符合物理定律。动作跟随和动作重叠常常会用在人物动画中,尤其是肢体的运动,例如当人物把手臂或长发放下时,手臂或头发会在放下后继续前后摇摆一阵。再设想一下一个有啤酒肚的人物(比如史莱克)快速转身时的情形: 他的身体会先转过来,而他突出的肚子则会比身体转动的要慢一些。


对我们的例子而言,就是要让球下落时更符合物理定律。而我们之前展示的动画的小球下落时还不够自然。我们希望看到球可以自由落体式的下落然后再弹起来。 不过,且让我们继续看下一条军规。

慢进慢出 (Slow  in and Slow Out)

这条规则讲得是物体的运动都是渐变的,加速和减速都需要过程。设想一辆高速行驶的汽车需要停下,如果画面中的汽车突然停下,那肯定让观众觉得不真实。大家都知道汽车停下来会经过减速的过程。因此要做到逼真,就必须模拟汽车先刹车减速,并最终慢慢停下的过程。

这条规则和重力的效果也有关系。设想一个正在荡秋千的小孩子。当他从低荡到最高点时,他在逐渐减速,由高处再荡回来的过程又是逐渐加速的过程,他的将在秋千的最低点达到最快的速度。 然后他再此经历减速过程荡向反方向的高点。



把这一准则应用到我们的例子中,通过调整小球进入画面和弹出画面的速度,我们可以让观众感到更加逼真的效果:当小球落到地面,并反弹起来的过程中,反弹的越接近高点它的速度就越慢。


在css中我们可以使用animation-timing-function 属性来配置动画随时间变化的速率:

	-webkit-animation-timing-function: ease-out;

这一属性有4个可选值:

ease-in :开始时慢,并逐渐加速
ease-out: 开始时快,并逐渐减速停下
ease-in-out: 开始慢并加速,到中间时最快,然后又逐渐减速并停下
linear :匀速播放

你还可以使用bezier-curve 函数来创建自己的速率函数(easing speed)

查看示例


弧形运行(Arc)


和跟随准则一样,弧度准则也是基于对基本物理定律的观察:”弹起来的物体最终总会落下“, 考虑物体运行轨迹时,恰当运用弧线。

设想我们把小球从画面的左侧掷向舞台。 逼真的动画应该能够模拟出它沿着弧线(抛物线)落下,并弹起,再次沿弧线落下的过程。


使用CSS制作这样一个动画需要一些更加精细的控制。我们需要同时控制小球在纵向和横向两个方向上的运行。 因此我们实际上需要让小球一面平滑的自左向右运动,再结合上之前我们已经制作出的自由下落的动画。与其用一个复杂的动画来描述这两个方向的运动,我们可以直接使用2个动画来实现,更加简单。为了达到这一目的,我们需要在我们的小球之外再添加一个div并为它单独配置动画效果(横向运动)

HTML 代码:

<div class="ball-arc">
   <div class="ball"></div>
</div>

CSS代码:

.ball-arc {
-webkit-animation: ball-x 2.5s cubic-bezier(0, 0, 0.35, 1);
}
   /* cubic-bezier 函数的使用是用来调节动画运行的速度,这里我们使球慢慢减速*/

@-webkit-keyframes ball-x {
   0% { -webkit-transform: translateX(-275px); }
   100% { -webkit-transform: translateX(0px); }
}

上述代码可以看到,我们新加了一个动画ball-x 它作用在外层div上,负责小球的横向运动,而ball-y则作用在内层div上负责纵向运动。

当然,这样将动作拆分为横向和纵向的写法有它的缺点,当你真的要创作一些非常复杂的动画时,这些代码在语义上比较难以理解。
查看示例


下篇已经发表:

CSS 动画指南: 原理和实战(二)



CSS动画与 :scope:限定作用域的动画效果 本文旨在帮助前端开发者理解并掌握使用:scope伪类限定CSS动画作用域的技术。我们将覆盖从基础概念到高级应用的完整知识体系,包括性能优化和实际开发中的最佳实践。文章将从:scope伪类的基础概念开始,逐步深入到与CSS动画的结合应用,最后通过实战案例展示实际开发中的使用场景。:scope:CSS伪类,表示当前样式作用域的根元素CSS动画:使用@keyframes和animation属性创建的动态效果作用域限定:将样式影响范围限制在特定DOM子树内:scope伪类标识了CSS作用域的根元素。 阅读详情

相关推荐

JavaScript是如何工作的: CSS 和 JS 动画底层原理及如何优化它们的性能

摘要: 理解浏览器渲染。 原文:JavaScript是如何工作的: CSS 和 JS 动画底层原理及如何优化它们的性能 作者:前端小智 Fundebug经授权转载,版权归原作者所有。 这是专门探索 JavaScript 及其所构建的组件的系列文章的第 13 篇。 如果你错过了前面的章节,可以在这里找到它们: JavaScript 是如何工作的:引擎,运行时和调用堆栈的概述! JavaScri...

Fundebug博客 3040

css动画详解

1、使⽤css技术来控制⻚⾯元素css属性的变化。2、css动画优势:不需要⽤js也能写,⽐较流畅,由浏览器去执⾏动画,减少代码量,性能⽐较⾼3、⼀般兼容到ie10以上浏览器(⼀般没太⼤问题)二、过渡1.过渡的理解过渡(transition)[træn'siʒǝn]-通过过渡可以指定⼀个属性发⽣变化时的切换⽅式,平滑的过渡-需要在某种条件下触发,例如hover、active、focus情况下-⼀次性的效果,不能循环,只能做简单的动画-只有两帧,设置动画初始值和结束值。

m0_56713342的博客 1万+

CSS动画:性能优化指南

重排重绘、硬件加速、合成层、性能分析。

caishuangxi111的博客 1288

CSS动画技术(css-animation)

CSS Transition是一种用于实现元素状态变化平滑过渡的CSS技术。它允许你在元素从一种状态到另一种状态的过渡中添加动画效果,例如改变颜色、大小、位置等属性。过渡属性:在transition属性中指定需要过渡的属性(如颜色、宽度、高度等)。持续时间:使用时间单位(秒或毫秒)定义过渡的持续时间,控制动画的速度。缓动函数:指定过渡效果的缓动函数,它定义了动画过程中属性值的变化速度。过渡属性是你希望在元素状态变化时产生动画效果的CSS属性。这些属性定义了在过渡期间发生变化的元素属性。

Zarathusa的博客 7942

CSS动画:逐帧动画与steps()函数

steps()函数、雪碧图、精灵动画、帧动画优化。

caishuangxi111的博客 1390

精通CSS3:鼠标悬停按钮动画效果实战指南

阴影颜色的设置不仅限于传统的黑色,CSS允许使用任何颜色值。合理选择颜色可以增强视觉效果或与页面主题风格保持一致。深色的阴影通常会给人一种凹陷的感觉,而浅色则可能使元素看起来突出或浮起。通过box-shadow属性的综合运用,开发者能够根据设计需求,创建出丰富多样的视觉效果,提高用户界面的美观度和互动性。下一章将介绍:hover伪类的使用,进一步扩展我们对交互动效的理解。在Web开发中,:hover。

weixin_28949937的博客 992

深入浅出 CSS 动画

关注公众号前端开发博客,领27本电子书回复加群,自助秒进前端群本文将比较全面细致的梳理一下 CSS 动画的方方面面,针对每个属性用法的讲解及进阶用法的示意,希望能成为一个比较好的从入门到进阶的教程。CSS 动画介绍及语法首先,我们来简单介绍一下 CSS 动画。最新版本的 CSS 动画由规范 -- CSS Animations Level 1[1] 定义。CSS 动画用于...

前端开发博客 2万+

Vivado实战:AXI转PCIe IP核配置全流程(含性能优化技巧)

本文详细介绍了在Vivado环境中配置AXI转PCIe IP核的全流程,包括工程准备、IP核参数设置、BAR空间配置、中断系统优化以及TLP传输效率提升等关键步骤。特别分享了经过验证的性能优化技巧,帮助开发者显著提升PCIe链路的吞吐量和稳定性,适用于视频采集、高速数据记录等应用场景。

weixin_30892037的博客 552

css之动画使用 (详解)

动画使用案例

jw_xiaoming的博客 1952

5分钟搞定Unity+Visual Studio开发环境配置(含C#游戏开发工作负载)

本文提供了一份详细的Unity与Visual Studio开发环境配置指南,帮助开发者在5分钟内完成C#游戏开发工作负载的设置。从Unity Hub安装到Visual Studio关键组件选择,再到常见问题排查,全面覆盖环境搭建的各个环节,显著提升游戏开发效率。

weixin_29014237的博客 249

别再死记硬背了!用‘小乌龟’实战图解ROS1核心指令(rosnode/rostopic/rosparam保姆级手册)

本文通过经典的turtlesim乌龟仿真器,以可视化实战方式讲解ROS1核心指令(rosnode/rostopic/rosparam),帮助初学者摆脱死记硬背,在操控乌龟的过程中轻松掌握节点管理、话题通信和参数设置等ROS1核心概念。

weixin_28731223的博客 371

这里推荐几个前端动画效果网站

6. Magic AnimationsMagic Animations 是一个 CSS 动画效果代码片段收集库,里面包含注意动画、淡入动画、旋转动画等近百种动画效果,图像清晰易懂。7. Anime.jsAnime.js 是一个轻量级的 JavaScript 动画库,具有简单易用、高性能和灵活定制等特点,可以用于 CSS、SVG 和 DOM 元素的动画。3. Framer MotionFramer Motion 是一款功能强大的动画和拖拽库,用于创建网站和应用程序的交互式动画/拖拽体验。

T3165919332的博客 1万+

【processing】创意编程

首先接到这个作业的时候,我是很崩溃的,我是真的不会画画QAQ,还画自己,这也太难了,于是我决定!还是祸害我爱豆吧!于是我从微博太太那里找了个图临摹 下面是太太的图 先给太太道歉!都是为了作业! 然后我画出来是这样子的 还可以!!!没有特别丑!(虽然也不是特别像吧) 但是画这个真是画死我了,下面贴上代码吧,没啥特殊的就是各种贝塞尔曲线各种圆各种线 //face stroke(70,27,11...

qq_25700571的博客 1267

CSS动画与变换全解析:从原理到性能优化的深度指南

本文系统分析了现代Web动画三大核心技术:CSS变换(Transform)通过4x4矩阵运算实现高效图形处理,触发GPU加速;CSS过渡(Transition)采用贝塞尔曲线插值机制,需谨慎选择过渡属性以避免性能损耗;CSS动画(Animation)在独立合成线程运行,与JS动画相比具有更低的主线程占用。研究揭示了三维变换的透视投影模型,并提供了分层优化、复合属性、帧率控制等实战技巧。数据表明,优化后的CSS动画可实现60fps流畅效果,相比传统JS动画内存占用降低40%,但需注意避免"层爆炸"问题。

Yue 1267

关于mos管的压降问题(项目遇到问题总结)

在研发过程中没有出现问题的板子,到了小批时竟出现雷达一直在触发???找了大几天,没有头绪。心中疑惑颇多,加上老板催促,自考等原因,真是压力山大。4月份自考,只有差不多一个月时间了吧,没有什么大的收获,反而在查找硬件问题的过程中,发现了一个自己忽视的一个问题,就是关于Mos管的压降问题。 备考的过程崎岖不平,工作又问题多多,孰轻孰重,如何取舍?从心理来说,不想取舍什么,只是有所得就可以,过不了就过不了呗,已经毕业十五年了,没这个本科文凭不也过来了吗?只是代表了自己在这一段时间的思考,自己兴趣吧,没什么大不了

guangod的博客 2万+

论文代码复现 | 无人机与卡车联合配送(Python+Gurobi)(The flying sidekick traveling salesman problem)

无人机配送-代码复现The flying sidekick traveling salesman problem-Part 1文献笔记:(无人机配送-代码复现)The flying sidekick traveling salesman problem-Part 1摘要论文主要图标摘录数值实验算例结果参考文献 文献笔记:(无人机配送-代码复现)The flying sidekick traveling salesman problem-Part 1 摘要 Once limited to the milit

HsinglukLiu的博客 3万+

CSS动画完全指南:让你的网页动起来

前端开发工程师

qq_63520660的博客 2139

LVGL 组件对齐方式说明

本文说明 LVGL(以 v8 为例)中常用的 lv_align_t对齐选项的含义与用法,对应界面设计工具里下拉列表中的以及等命名。

摸鱼专家 131

JavaScript性能优化实战:利用 CSS 动画替代 JavaScript 动画

本文探讨了CSS动画相比JavaScript动画在性能上的显著优势。通过浏览器渲染机制解析和性能指标对比,指出CSS动画能稳定保持60fps帧率,降低80%CPU占用和75%内存消耗。文章详细介绍了将JS动画转换为CSS动画的实战步骤,包括简单过渡、复杂关键帧动画的实现方法,并通过电商轮播、移动菜单等案例验证优化效果,显示帧率提升达25%、内存占用减少50MB。最后提出优先使用CSS动画、监测性能等最佳实践,同时指出在需要复杂交互时仍需结合JS。建议开发者从简单动画开始逐步优化,达成更流畅的用户体验。

qinzhenyan的博客 1277

第95章 安全工程师:Shell 脚本实现安全扫描、漏洞检测、日志审计

随着网络安全威胁日益复杂,传统的手动安全管理已无法满足现代企业的安全需求。Shell 脚本为安全工程师提供了强大的自动化能力,能够实现 7×24 小时的安全监控、快速漏洞扫描、智能日志分析和实时威胁响应。本章将系统介绍如何使用 Shell 脚本构建完整的安全防护体系,从基线检查到实时监控,帮助你打造自动化的安全运维能力。

猪猪侠 90

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

CSS动画和JavaScript动画,大扫盲,有代码示例。

小伙伴们都知道,css和JavaScript都可以做动画,但是大都不知道二者的区分,该如何选择,贝格前端工场借助本文为大家分享一下。

贝格前端工场的博客 987

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

上一篇: 庆祝Dojo中文博客成为优快云博客专家!
下一篇: CSS 动画指南: 原理和实战(二)
dojotoolkit
博客等级 码龄16年 1205粉丝 61原创
评论 15
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值