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

有用的css3特性——动画和3d变换

时间:2023-03-30 15:26:35 CSS

上一篇总结了transitions和2D变换。本文总结了动画和3D变换。有许多场景可用于动画。比如加载页面的时候,可以放一张gif,也可以自定义一个小动画来缓解用户等待的焦虑,比如下面三个小圆圈的动画。想要完成一个动画效果,首先要知道定义的语法。使用animation实现动画,@keyframes定义元素的运动规律(1)animation-name:动画的名称,即@keyframes定义的动画名称(必填)(2)animation-duration:动画的执行时间,一个动画需要多长时间完成(必填)(3)animation-timing-function:动画的速度曲线,默认ease(逐渐变慢),还有这些选项线性匀速ease-in加速ease-in-out先加速再减速ease-out减速(4)animation-delay:动画执行延迟时间,默认0s(5)animation-iteration-count:动画执行次数,默认为1、也可以选择infinite表示无限次(6)animation-direction:指定动画是否在下一个循环中反向播放。默认为normal,不反向播放。您也可以选择交替播放。比如一个盒子从左往右走,如果执行次数为1,执行完盒子后,会立马从右往左弹。如果设置了交替反向播放,盒子会按照设置的速度曲线走完动画,然后向左返回。(7)animation-fill-mode:指定动画的结束状态,默认backwards回到初始状态,也可以选择保持状态。设置forwards后,animation-direction不会生效。(8)animation-play-state:设置动画的运行状态。默认是running,也可以选择paused停止//这么多属性可以组合在一起写,不是每一个都需要写,如果使用默认项可以省略,animation-play-state没有组合写法动画:namedurationtiming-functiondelayiteration-countdirectionfill-mode用一个简单的动画来展示以上属性,同时区分ease,ease-in,ease速度曲线的区别-in-out和ease-out时间位移@keyframesmove{0%{transform:translateX(0px)}100%{transform:translateX(1000px);}}.box{margin-top:20px;宽度:100px;高度:80px;背景颜色:棕色;动画名称:移动;//动画名称animation-duration:6s;//动画执行时间animation-timing-function:ease;//动画速度曲线,分别是ease,ease-in,ease-in-out,ease-out动画-delay:1s;//动画延迟1s执行animation-fill-mode:forwards;//执行完成后保持状态}下面先演示如何使用animation-direction,animation-fill-mode,animation-play-state每个方块的animation-direction和animation-fill-mode都是默认配置.正常不倒退,倒退回到起始位置。不需要定义默认属性。第二个方框显示animation-derection:alternatereverseplayback,reverseplayback需要匹配播放次数,animation-direction,如果默认只播放一次,则不生效。第三个框表示animation-fill-mode:forwards保持动画结束后的状态。第四个框表示当鼠标经过时框停止移动animation-play-state:paused了解了动画的各种配置属性后,可以根据2D或3D的变化制作一些小动画。上面三个小圆圈的加载动画使用了动画+2D变化,通过缩放盒子的大小来达到动态的效果。实现代码如下//html代码

//csscode.parent{width:80px;}.circle{display:inline-block;宽度:20px;高度:20px;背景颜色:橙色;边界半径:50%;动画:移动1.4sease-in-out0sinfiniteboth;}.circle:nth-child(1){animation-delay:-0.32s;}.circle:nth-child(2){animation-delay:-0.16s;}@keyframesmove{0%,80%,100%{transform:scale(0)}40%{transform:scale(1)}}animation-timing-function运动曲线也可以选择steps步长,代表完成动画需要多少步。比如动画执行时间为2s,定义步长steps(10),表示2s内10步完成变化,即每步0.2s。步长的执行效果有点像老式打印机。内容是一个字一个字打出来的。可以参考下面的效果。那么利用步长可以做出什么样的效果呢?让我们看看下面的图片。下图中奔跑的白熊在页面上显示的是gif图片吗?事实上,它只是一张由不同形状的白熊组成的图片。计算每只白熊的宽度和高度。通过控制步长,动画实现代码如下。熊{位置:绝对;左:0;宽度:200px;高度:200px;背景:url(./media/bear.png)不重复;动画:运行1ssteps(8)7sinfinite,向前移动3slinear7s;}@keyframesrun{100%{background-position:-1600px0;}}@keyframes移动{100%{左:50%;transform:translate(-50%)}}动画还可以结合3d变换使用,3d变换就是在2d的基础上增加一个轴,Z轴,表示从人眼到眼睛的距离屏幕,如果不进行其他设置,您将无法看到3D和2D变化之间的差异。这时候就需要使用一个属性透视图将其添加到父元素中。透视表示人眼到屏幕的距离。越小,图像越大,距离越大,图像越小。transform中带位移的3D变换为translateZ,表示物体沿Z轴移动的距离。如果移动为正值,则此时物体在眼睛和屏幕之间。离屏幕越远,离眼睛越近,屏幕上显示的物体就越大。如果移动是负值,就相当于往屏幕后面走。屏幕上的对象较小。如下图,d代表perspective透视,z代表translateZ的大小。用一个图表来展示3D的变化和自身的元素大小对比。左边框的视角设置为300px,perspective:300px,不同电脑显示屏显示的尺寸可能不一样。translateZ通常配合rotate进行3D变化。Rotate可以分别沿x轴/y轴/z轴旋转。沿x轴旋转的效果可以想象为运动员在沿单杠上下空翻。沿y轴旋转可以想象钢管舞者沿着竖直的钢管移动。沿z轴的旋转可以参考彩票的大转盘,是平面内的旋转,没有三维效果。左手法则可以用来判断旋转的方向。左手掌心向外握拳,大拇指指向x轴正方向。手指弯曲的方向是物体沿x轴旋转时旋转的正方形,判断物体沿y轴旋转。此时左手掌心朝外握拳,左手掌心朝外用大拇指握拳,五指弯曲的方向为正方向。亲自动手做个示范。有很多旋转方向。各个方向旋转的效果可以参考下面的动图,从x轴,y轴,z轴,x轴和y轴同时旋转是什么样子的.,3d效果必须给父元素加上透视!总结一下3d位移和3d旋转的语法//父元素必须定义perspectiveperspective:500px//displacementtransform:translateZ(100px)transform:translate3d(0,0,100px)//也可以在x和y中定义移动轴方向,即2d平面内的运动,不受3d近大远小的影响//Rotationtransform:rotateX(45deg)transform:rotateY(45deg)transform:rotateZ(45deg)transform:rotate3d(1,1,0,deg)//x轴和y轴都旋转45度。这时候我们要找的是向量,还有一个属性是对角线位置的3D变换。请注意,上面演示的旋转仅适用于当前元素。如果父子元素都要进行3D变换,如果不设置transform-style,当父元素进行3D变换时,子元素的3D变换会失效,如下图,可以使一些动画通过结合透视、变换样式、位移变换和旋转rotation来工作。下面是一个3D导航栏。定义多个导航时,可以选择导航进行向上翻转的效果。实现代码如下//html代码helloworld//css代码body{perspective:500px;}.box{position:relative;边距:100px自动;宽度:100px;高度:40px;变换样式:保留3d;transition:transform1s;}.box:hover{变换:rotateX(90deg)}.boxdiv{位置:绝对;顶部:0;左:0;宽度:100%;高度:100%;文本对齐:居中;颜色:#fff;行高:40px;背景颜色:rosybrown;}.box.bottom{transform:translateY(20px)rotateX(-90deg)}.box.top{background-color:sandybrown;transform:translateZ(20px)}结合位移和旋转,可以实现如下图所示的旋转木马效果,当鼠标移入图片时,轮播暂停并旋转,实现如下代码//html代码<部分>
/div>
//csscodebody{/*设置透视距离*/perspective:1400px;}section{position:relative;宽度:300px;高度:200px;边距:100px自动;背景:url(./media/pig.jpg)不重复;变换样式:保留3d;animation:rotateDog10slinearinfinite;}section:hover{/*当鼠标滑动时动画状态暂停停止*/animation-play-state:paused;}sectiondiv{position:absolute;顶部:0;左:0;高度:100%;宽度:100%;背景:url(./media/dog.jpg)不重复;}@keyframesrotateDog{0%{变换:rotateY(0);}100%{变换:旋转Y(deg);}}sectiondiv:nth-child(1){transform:translateZ(300px)}sectiondiv:nth-child(2){transform:rotateY(60deg)translateZ(300px)}sectiondiv:nth-child(3){变换:rotateY(120deg)translateZ(300px)}sectiondiv:nth-child(4){变换:rotateY(180deg)translateZ(300px)}sectiondiv:nth-child(5){变换:rotateY(240deg)translateZ(300px)}sectiondiv:nth-child(6){transform:rotateY(300deg)translateZ(300px)}上面是动画和3d变换的结合,使用transition,animation,2d/3d变换提供更好的用户体验