CSS动画

151 阅读5分钟

animation语法

描述
@keyframes定义一个动画,@keyframes定义动画名称用来被animation-name所使用
animation-name检索和设置对象对应的动画名称,必须与规则@keyframes配合使用,因为动画名称有@keyframse定义
animation-duration检索或设置对象动画的持续是时间
animation-timing-function检索或设置对象动画的过渡类型
animation-delay检索或设置对象动画的延迟时间
animation-iteration-count检索或设置对象动画的循环次数
animation-direction检索或设置对象动画在循环中是否反向活动
animation-play-state检索或设置对象动画的状态

@keframes 和 animation-name

定义一个动画,定义的动画名称被animation-name使用

.animation1 {
    border-radius: 50%;;
    background-color: pink;
    animation-name: mymove;
    animation-duration: 2s;
    animation-iteration-count: infinite;
}
@keyframes mymove{
    0% { width: 50px; height: 50px; }
    50% { width: 100px; height: 100px; }
    100% { width: 50px; height: 50px; }
}

@keyframes主要是来做关键帧动画的,每个@keyframes后面都跟一个名字,示例中使用mymove作为帧动画的名字,然后可以在样式内对关键帧添加样式,然后根据关键帧@keyframes就能自动形成流畅的动画了。
animation-name 使用之前,我们已经定义了一个名为mymove的帧动画,这里把帧动画的名字作为了animation-name的值.

animation-duration

仅仅有帧动画需要执行的动画名称是不足以形成动画的,我们还需要设置一个动画执行所需要的时间,这里用到了animation-duration属性,所以上面案例所展示的时间为两秒钟执行一次。

animation-timing-function

检索或设置对象动画的过渡类型

// 来回移动的 长方形
.animation2 {
    position: relative;
    background-color: rgb(122, 126, 126);
    width: 200px;
    height: 100px;
    animation-name: animation2;
    animation-duration: 4s;
    animation-timing-function: ease-in-out;
    animation-iteration-count: infinite;
}
@keyframes animation2 {
    0% { left: 0 }
    50% { left: 250px; }
    100% { left: 0; }
}

animation-timg-function的作用是改变动画在每一帧的快慢。

描述
linear匀速变化
ease默认,低速开始,然后加快,在结束前变慢
ease-in从低速开始
ease-out低速结束
ease-in-out低速开始和结束
cubic-bezier(n, n, n, n)定义自己的值,0到1的值

animation-delay

检索或设置对象的延迟时间。

animation-delay: 2s;

表示动画将在2s后执行。

animation-iteration-count

检索或设置对象动画的循环次数

animation-iteration-count: infinite;

动画无限循环执行

animation-direction

检索或设置对象动画在循环中是否反向运动

描述
normal默认值,动画按正常播放
reverse动画反向播放
alernate动画在播放次(1,3,5……)正向播放,在偶数次(2,4,6)反向播放
alernate-reverse动画在播放次(1,3,5……)反向播放,在偶数次(2,4,6)正向播放
initial设置该属性为它的默认值
inherit从父元素继承该属性

animation-play-state

检索或设置对象动画的动态

描述
running默认值,动画执行
paused停止动画,可以使用js来操作这个属性,从而控制动画的播放和暂停

transition

transition: property duration timing-function delay;

transiton语法

属性描述
transition-durationtransition效果需要制定多长时间才能完成
transition-property指定CSS属性的name,transition效果
transition-timing-function指定transition效果的转换曲线
transition-delay定义transition效果延迟执行时间
.transition1 {
    width: 100px;
    height: 100px;
    border-radius: 50%;
    background-color: red;
    transition-duration: 2s;
}
.transition1:hover {
    width: 200px;
    height: 200px;
}

transition-property

指定css属性的name,transition的效果。

transition-property: width;

表示只在width上使用动画,如果没有加的话,就是所有的变化,都有动画效果

width和height其中一个变化值是auto的时候,transition设置的动画会失效

transition-timing-function

指定transition效果的转速曲线

描述速度
linear默认属性,匀速,等同于cubic-bezier(0, 0, 1, 1)匀速
ease规定慢速开始,然后变快,最后慢速结束的国度效果,等同于cubic-beizier(0.25, 0.1,0.25,1)快-慢-慢
ease-in以慢速开始的过渡效果,等同于cubic-beizier(0.42, 0, 1, 1)快-开
ease-out以慢速结束的过渡效果,等同于cubic-beizier(0, 0, 0.58, 1)慢-慢
ease-in-out规定以慢速开始和结束的过度效果,等同于cubic-bezier(0.42, 0, 0.58, 1)慢-快-慢
cubic-bezier在cubic-bezier函数中定义自己的值,0~1自定义

值大体上是animation-timg-functiony一致的

transtion-delay

定义transition延迟开始的时间

transform

就它自身来说,是无法实现动画效果,结合 animation 或者 transition可以实现比较炫酷的动画。

transform语法

描述
none定义不进行转换
translate(x, y)2D转换
translate3D(x, y, z)定义3D转换
translateX(x)只是X轴的值
translateY(y)只是用Y值的值
translateZ(z)只是用Z轴的值
scale(x[,y]?)2D缩放
scale3d(x, y, z)3D缩放
scaleX(x)通过设置x轴来定义缩放转换
scaleY(y)通过设置y轴来定义缩放转换
scaleZ(z)通过设置z轴来定义缩放转换
rotate(angle)定义2D旋转,在参数重规定角度
rotate3d(x, y, z, angle)定义3D旋转
rotateX(x)沿着x轴进行3D旋转
rotateY(y)沿着y轴进行3D旋转
rotateZ(z)沿着z轴进行3D旋转
skew(x-angle, y-angle)定义沿着X和Y轴的2D倾斜旋转
shewX(angle)定义沿着X轴的2D倾斜旋转
skewY(angle)定义沿着Y轴2D倾斜转换
perspeactive(n)为3D转换元素定义透视视图

rotate旋转

<style>
    .rotate {
        display: inline-block;
        width: 150px;
        height: 150px;
        background-image: url(https://gimg2.baidu.com/image_search/src=http%3A%2F%2F5b0988e595225.cdn.sohucs.com%2Fimages%2F20190801%2Faa1de5fd9e9043c1b947d9a1e886e147.jpeg&refer=http%3A%2F%2F5b0988e595225.cdn.sohucs.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1649456386&t=da4595ace0b7cbe04d70526195624121);
        background-size: contain;
        margin-left: 50px;
        border-radius: 50%;
    }
    .rotatexyz {
        animation: rotatexyz 2s infinite linear;
    }
    @keyframes rotatexyz {
        0% { transform: rotate(0deg); }
        100% { transform: rotate(360deg); }
    }

    .rotatex {
        animation: rotateX 2s infinite linear;
    }
    @keyframes rotateX {
        0% { transform: rotateX(0deg); }
        100% { transform: rotateX(360deg); }
    }

    .rotatey {
        animation: rotateY 2s infinite linear;
    }
    @keyframes rotateY {
        0%   {transform: rotateY(0deg);}	
        100%   {transform: rotateY(360deg);}
    }

    .rotatez {
        animation: rotateZ 2s infinite linear;
    }
    @keyframes rotateZ {
        0% { transform: rotateZ(0deg); }
        100% { transform: rotateZ(360deg); }
    }
</style>

<body>
    <div class="rotate rotatexyz"></div>
    <div class="rotate rotatex"></div>
    <div class="rotate rotatey"></div>
    <div class="rotate rotatez"></div>
</body>

translate 移动

<style>
    .translate {
        display: inline-block;
        width: 150px;
        height: 150px;
        margin-right: 20px;
        background-image: url(https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimg3.duitang.com%2Fuploads%2Fitem%2F201602%2F08%2F20160208144821_FdAvZ.jpeg&refer=http%3A%2F%2Fimg3.duitang.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1649457509&t=68a818cd5b608a9a0977fccf398069f4);
        background-size: cover;
        border-radius: 50%;
     }
    .translatexy {
        animation: translatexy 2s infinite linear;
    }
    @keyframes translatexy {
        0% { transform: translate(0px, 0px); }
        100% { transform: translate(500px, 500px); }
    }

    .translatex {
        animation: translatex 2s infinite linear;
    }
    @keyframes translatex {
        0% { transform: translateX(0px); }
        100% { transform: translateX(200px); }
    }

    .translatey {
        animation: translatey 2s infinite linear;
    }
    @keyframes translatey {
        0% { transform: translateY(0px); }
        100% { transform: translateY(200px); }
    }
    .translatez {
        animation: translatez 2s infinite linear;
    }
    @keyframes translatez {
        0% { transform: translateZ(0px); }
        100% { transform: translateZ(200px); }
    }
</style>

资料

  1. 前端深入之css篇丨2020年,彻底掌握css动画【animation】

  2. 前端深入之css篇丨2020年,彻底掌握css动画【transform】