当前位置: 首页 > Web前端 > HTML

10分钟上手CSS3Animation

时间:2023-04-03 00:51:24 HTML

介绍Animation可以让你在不依赖javascript或jquery的情况下,用纯CSS轻松实现网页中的各种动画效果。大多数主要浏览器都很好地支持兼容性动画!尚兼容IE9的同学慎用。CSS坐标系在了解动画之前,我们需要先了解一下CSS的坐标系,因为很多动画效果都与元素的坐标密切相关。在css3中,网页不再是二维平面,而是三维空间。水平方向、垂直方向和垂直屏幕方向分别对应三维坐标系的x、y、z轴,如下图所示。箭头方向为正,否则为负(注意y轴方向与常规笛卡尔坐标系相反)。动画1。Transformstransform中文翻译为“变换”,但我更喜欢叫它“变换”(大名鼎鼎的Transformer就叫变形金刚)。我们可以使用transform函数对html元素进行各种变形,如平移、缩放、旋转、扭曲等,并且不会影响正常的文档流(documentflow)。(1)TranslateTranslate一般翻译为“翻译”,但在css中一般用作“平移”,因为translate是用来改变html元素在3d坐标系中的位置。translate支持在坐标系内任意方向移动(通过x、y、z方向向量的任意组合),单位可以是长度单位和百分比(百分比是相对于被翻译元素本身的大小,和x轴是相对于width,y轴是相对于height,z轴方向,由于元素没有'thickness',所以对于z轴不能用百分比表示),为例子:transform:translateX(100px)translateY(50%)translateZ(-100px);//或缩写transform:translate3d(100px,50%,2em);注:translate是xy平面的2维平移,translate3d是xyz空间的3维平移;translate也可以单独写,比如translate:50%105px5rem;,但是这个特性还在实验阶段,很多浏览器都不支持,所以现阶段还是配合transform使用。有关详细信息,请参阅MDN翻译。(2)ScaleScale的意思是“缩放”,顾名思义,就是用来改变元素的大小。例如:transform:scaleX(2)scaleY(0.5)scaleZ(1);//或缩写transform:scale3d(2,0.5,1);scale方法接受任意数(正负整数、小数、0)作为参数,参数为缩放因子,系数>1的效果是放大,0<因子<1的效果是缩小,factor=0,元素的尺寸变得无限小,不可见,factor<0的效果是>0时的镜像(具体效果可以自己实验)。和translate类似,scale也有2D的scale()和3D的scale3d(),也可以单独写,这里不再赘述。(3)RotateRotate是“旋转”的意思。它支持围绕x、y和z轴旋转元素。旋转的正方向是面向正坐标轴的逆时针方向。请参考上面的坐标系图。rotate方法接受一个角度作为参数。Angle>0表示正旋转,angle<0表示负旋转。例如://默认绕z轴旋转transform:rotate(90deg);变换:旋转X(30度)旋转Y(60度)旋转Z(-90度);rotate与translate和scale不同,不能简写为transform:rotate3d(30deg,60deg,90deg)。rotate3d的用法是:前三个参数为数字,表示x、y、z方向的向量,对应添加向量v,第四个参数为角度,表示以向量v为逆时针旋转的角度轴,语法如下:transform:rotate3d(1,2,3,90deg);类似于平移和缩放,旋转也可以用作单独的css属性,但仍处于试验阶段。为了篇幅,我只列出三个最常用的变换函数。其余的transform函数请参考MDNtransform函数。(4)组合我们可以将不同的变换方式组合起来,比如:transform:translateY(200px)rotateZ(90deg)scale(3);组合方式的执行顺序是从右到左,即先执行scale,然后rotate,最后translate,效果依次累加。方法的编写顺序对最终的效果影响很大。请参见以下示例。沿y轴平移缩放,顺序不同,结果明显不同:如果先平移再缩放,平移距离也会按比例缩放。但是先缩放再翻译不会。所以在使用transform的时候需要按照translate->rotate->scale的顺序来写,让scale先执行,以免放大translate的效果,rotate先执行translate,防止随着平移距离旋转。我觉得这就是transform目前不方便的地方,因为方法之间的干扰不好理解,写的顺序也不好记。未来有望通过使用独立的csstransform属性来解决这个问题,因为独立的transform属性对书写顺序没有依赖,方法之间不会相互干扰。TransitionTransition译为“过渡”,强调过程。在css中,指的是元素在一段时间内从一种状态(对应css属性)过渡到另一种状态的动态过程。我们可以决定如何过渡以及花费多少时间。例如,当我们将鼠标悬停在云上使其变大时,我们可以这样写:.cloud{width:240px;transition:1s;}.cloud:hover{width:320px;}效果:transition可以和transform结合使用,比如我们可以把云变大,同时转身:.cloud:hover{width:320像素;transform:rotate(360deg);}效果:我们可以为不同的效果设置不同的过渡时间:.cloud{width:240px;transition:width1s,transform0.5s;}我们还可以给效果设置一个延迟时间,比如我们等width增加了再旋转:.cloud{width:240px;transition:width1s,transform0.5s1s;}效果:我们还可以为每个效果设置不同的计时函数来控制加速效果。例如,我们可以逐渐提高旋转速度:.cloud{width:240px;transition:transform2sease-in;}.cloud:hover{transform:rotate(1080deg);}效果:更多的定时函数请关注讨论,也可以参考MDNtransition-timing-functionsKeyframes(1)基本用法Keyframe翻译中文为“关键帧”,这是动画中非常强大的功能。通俗地说,我们可以定义动画中的关键点和关键状态。创建动画。关键帧比过渡更能控制动画过程和细节。先看一个例子(部分代码省略)html:

css:.mario{位置:绝对的;左:0px;width:100px;}.animated{animation-name:drive;动画持续时间:1s;animation-timing-function:linear;}@keyframesdrive{from{transform:translateX(0)}to{transform:translateX(700px)}}效果:其中drive是关键帧的名称,from,to是开始和关键帧播放过程的结束点,时间点也可以用百分比表示,比如50%、from、to相当于0%、100%。每个时间点对应一个css状态,代表一个关键帧(keyframe)。关键帧定义完成后,使用方法如下:动画也有缩写形式,如:动画:slidein3sease-in1sinfinitereversebothrunning;但是这种写顺序有一定的要求(delay要写在duration之后,其他参数没有顺序要求,css会根据传入的关键字来识别)。(2)动画延迟通过animation-delay,我们可以延迟动画的执行:animation-delay:2s;(3)AnimationFillModeforwards在上面的例子中,我们可以看到马里奥向右移动,然后回到起点。如果我们要让他在演习完成后留在右边?很简单,我们可以设置动画填充模式:animation-fill-mode:forwardsforwards表示动画完成后,元素会保持上一帧的状态。向后的反义词是向后。backwards是指元素在动画结束后不会回到第一帧的状态,而是指当设置了animation-delay时,在动画开始前的等待过程中元素立即应用到第一帧。帧的状态。我们把上面的例子稍微修改一下看看效果:.animated{animation-name:drive;动画持续时间:1s;动画填充模式:backwords;动画延迟:1s;animation-timing-function:linear;}@keyframesdrive{from{transform:translateX(350px)}to{transform:translateX(700px)scale(2)}}效果:你可以看到小人移动到350px之前动画开始,1s后动画开始。两者都很明显,两者都会同时应用forwards和backwards规则,即在delay的时候先应用第一帧的状态,最后保持最后一帧的状态。(3)AnimationRepeat我们可以通过animation-iteration-count来设置动画循环的次数,例如:animation-iteration-count:3;//无限循环animation-iteration-count:infinite;像这样:(4)AnimationDirectionnormal是法线方向,也是默认方向,即fromfirst,然后to。reverse与正常方向相反,即tofirst,然后from。例如:.animated{...animation-direction:reverse;}@keyframesdrive{from{transform:translateX(-100px)rotateY(180deg)}to{transform:translateX(862px)rotateY(180deg)}}效果:alternatealternate是“交替”的意思,即正反交替,先正反。reversealternate反向交替,先反向再正常。(4)AnimationTiming函数和transition一样,keyframes也可以设置计时函数,常用的计时函数总结如下:ease:默认方式,初始速度慢,然后加速再减速ease-in:初始速度最慢,然后继续加速ease-out:初始速度最快,然后一直减速。ease-in-out:初始速度较慢,然后加速再减速。与ease不同的是,加减速过程是对称线性的:等速运动的直观表现如下(codepen):除了上面现成的方法,我们还可以通过贝塞尔曲线自定义速度曲线。我们可以在http://cubic-bezier.com上直观地创建我们自己的贝塞尔曲线。例如,创建一条开始非常缓慢然后突然变得非常快的曲线:css:animation-timing-function:cubic-bezier(1,.03,1,-0.03);效果:是不是很神奇!(5)ChainAnimation我们可以串联使用多个动画。例如,如果我们想让小人在开车时跳跃,我们可以这样写:css:.mario{...animation:drive3sbothinfinitelinear,jump0.5s1.2sease-in-outinfinite;}@keyframesjump{0%{顶部:-40px;}50%{顶部:-120px;}100%{顶部:-40px;}}作用:练习本文的目的是普及css3动画的基础,并没有完全涵盖动画的知识。有没有涵盖和解释的知识还请见谅。掌握了以上知识后,我们就已经可以使用动画来制作丰富的动画效果了。以下是codepen上的一些小示例:完整的马里奥演示动画popupflyitemstoshoppingcartflippingcards