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

CSStransitionandanimation

时间:2023-03-30 13:42:33 CSS

easingeffect反弹动画效果是比较常见的动画,比如小球的运动,使用反弹效果进行大小变化和角度变化可以提升动画体验。小脸介绍了一些带有缓动效果的简单动画。弹跳动画的实现CSS中所有的过渡和动画都与一条曲线(缓动曲线)有关,这条曲线规定了动画过程在整个时间内是如何推进的。在animationtiming-function/transition-timing-function的扩展属性中,默认的速度控制函数可以显式指定为ease关键字。ease也是默认值。四个指定的缓动曲线值分别是ease、ease-in、ease-out(ease-in是反向版本)、ease-in-out和linear。四种缓动曲线分别如下图所示:使用相反版本的ease-in和ease-out来实现回弹效果。比如小球的反弹效果可以这样实现:@keyframesbounce{60%,80%,to{transform:translateY(400px);动画计时功能:轻松;}70%{转换:translateY(300px);}90%{transform:translateY(360px);}}.ball{宽度:50px;高度:50px;边界半径:50px;背景:黄色;animation:bounce3sease-in;}CSS速度函数是只有一段的贝塞尔曲线,所以每个速度函数只有两个控制锚点。同时CSS提供了一个cubic-bezier(x1,y1,x2,y2)函数,可以让我们指定一个自定义的速度控制函数。它接受四个参数,分别代表两个控制锚点的坐标值。如果你想获得任何速度控制功能的反向版本,只需交换控制锚点的水平坐标和垂直坐标。将上述球的动画设置为反弹3scubic-bezier(.1,.25,1,.25);这将使反弹效果更加逼真。一个易于使用的贝塞尔曲线可视化工具。弹性过渡的应用场景,比如输入框。当用户输入时,给出一个提示框。你可以应用上面的cubic-bezier来实现input:not(:focus)+.callout1{transform:scale(0);过渡:.25s;}.callout1{/*cubic-bezier(.5s*50%,.1,.5*60%,1.5)*/transition:.5scubic-bezier(.25,.1,.3,1.5);变换原点:1.4em-.4em;/*CSStransform属性,只对块级元素有效*/display:block;宽度:250px;高度:40px;字体大小:12px;边框:1px实心#eee;margin-top:5px;}实现效果使用transition进行transition时,如果不指定transition-property属性,会自动读取其初始值all,此时可以做的all都会transition属性参与过渡,例如颜色。因此,在设置过渡时,需要将过渡的范围限制在某些特定的属性中。综上所述,上面代码中transition的值要加上transform,即input:not(:focus)+.callout{transform:scale(0);transition:.25stransform;}.callout{transform-origin:1.4em-.4em;transition:.5scubic-bezier(.25,.1,.3,1.5)transform;}逐帧动画用于实现卡通电影或复杂的进度指示框,或加载标志。更适合逐帧动画。实现加载动画时也可以使用GIF动画,但是GIF动画有一些缺点:GIF图像中可以使用的颜色数限制为256种颜色,GIF没有alpha透明的特性。修改动画参数不方便,需要重新编辑生成。你可以使用css中的step函数。所有基于贝塞尔曲线的油门函数都在关键帧之间进行插值以产生平滑的过渡。这种平滑特性不适合逐帧动画的实现。steps()会按照你指定的步数把整个动画分成多帧,整个动画在帧与帧之间硬切,不做任何插值处理。这个加载实现适合这个具体实现如下:Loading...

@keyframesloader{to{background-position:-800px0;}}.loader{宽度:100px;高度:100px;背景:url(img/loader.png)00;动画:装载机1s无限步(8);/*隐藏文本*/text-indent:200%;空白:nowrap;overflow:hidden;}loader.png是所有loading状态下png图片拼接闪烁效果的实现。之前的blink标签可以实现文字的闪烁效果,现在没有了,现在可以通过animation@keyframes创建的动画来实现blink{50%{color:transparent}}.highlight{animation:1sblink3steps(1);}打字动画的实现思路是让容器的宽度成为动画的主体,把所有的文字都包裹在这个容器里,然后让它的宽度从0开始扩展到在一步一步的动画中逐字调整其适当的宽度。只适用于单行的文本实现会使用单位ch,表示0字符的宽度,很少用到,但对于等宽字体,“0”字符的宽度与所有字符的宽度相同其他字形。假设我们要实现的文本是等宽字体。CSS很棒!@keyframestyping{from{width:0}}/*闪烁光标的实现*/@keyframescaret{50%{/*currentColor使边框颜色自动Be与文字颜色一致*/border-color:currentColor;}}.code{宽度:15ch;/*文本宽度*/动画:打字6ssteps(15),caret1ssteps(1)infinite;空白:nowrap;border-right:.05emsolidtransparent;overflow:hidden;}作用:平滑状态动画的应用场景是图片很长,显示位置很有限。这个时候最好做个动画。鼠标悬停或焦点触发动画发生。但是当动画开始播放还没有结束的时候,当鼠标离开的时候,动画会特别生硬的回到画面的初始位置。解决方案是使用属性animation-play-state@keyframespanoramic{to{background-position:100%0;}}.panoramic{宽度:150px;高度:150px;背景:网址(“timg.jpeg”);背景大小:自动100%;-state:paused;}.panoramic:hover,.panoramic:focus{animation-play-state:running;}效果:沿圆形路径平移的动画可以通过设置旋转的动画来实现效果,但是会有图片旋转时的一个问题它也会一起旋转。解决这个问题的方法有两种:(1)需要两个元素的解决方法是给元素再设置一个旋转动画,让它向相反的方向旋转,这样旋转的时候图片本身也会旋转。不会跟着旋转
@keyframesspin{to{transform:rotate(1转);}}.path.avatar{动画:旋转10s无限线性;变换原点:50%150px;/*150px=路径的半径*/}.path.avatar>img{width:50px;高度:50px;边框-半径:25px;位置:绝对;左:120px;顶部:10px;动画:继承;/*反转得到原动画的反转版本*/animation-direction:reverse;}效果如下:(2)单个元素的解决方案每个transform-origin可以模拟两个translate()比如transform:rotate(30deg);transform-origin:200px300px;transform:translate(200px,300px)rotate(30deg)translate(-200px,-300px);transform-origin:00;/*以上两段代码是等价的*/应用translatetransformationfunction相互之间并不独立,每个变形函数不仅对这个元素进行变形,还会对整个元素的坐标系进行变形,从而影响后续所有的变形操作。这也说明了为什么变形函数的顺序很重要,因为如果顺序打乱,变形属性中不同函数的顺序会产生完全不同的结果。可以只用一层dom@keyframesspin{from{transform:rotate(0turn)translateY(-150px)translateY(50%)rotate(1turn);}到{变换:旋转(1turn)translateY(-150px)translateY(50%)旋转(0turn);}}.avatar{动画:自旋3s无限线性;}