# CSS 的运动

就是让一个盒子改变它的状态或位置。

改变位置:用盒模型、偏移属性、浮动

改变状态:鼠标摸上去,添加 class

但是这样的运动没有任何过渡,太突兀了,可以添加过渡样式实现过渡效果,让运动如丝滑般顺滑

# 过渡 transition

该属性可以让元素实现过渡效果,让状态或位置的改变不是瞬间完成而是按照一定的方式和过程完成。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
transition:style duration delay timing-function;
//参数说明
transition:要过渡的样式 持续时间 是否延迟进行 运动形式;
样式:一般写能让元素改变状态或改变位置的。
JQ:
div.show(400)
div.animate({},时间,运动形式,回调)
//写法
最少可以写一个:时间
最多写4个,按照顺序来写
//样式中可以指定某一个样式属性,比如width,也可以指定所有的样式,添加all
//运动形式
ease:(逐渐变慢)默认值
linear:(匀速)
ease-in:(加速)
ease-out:(减速)
ease-in-out:(先加速后减速)

该属性是一个复合属性,可以拆分为以下 4 个属性:

1
2
3
4
5
transition可以拆分为:	
transition-property 要运动的样式 (all || [attr] || none)
transition-duration 运动时间【必选参数】
transition-delay 延迟时间
transition-timing-function 运动形式

# 变换、变形

学一个属性,和 4 个属性值

transform:translate|rotate|skew|scale;

  1. transform:translate;

    作用:类似于 left,top,改变盒子的位置。

    区别:left,top 需要结合定位属性,但是 transform 不需要。

    1
    2
    3
    4
    5
    transform:translate(x,y);
    可以拆分为两个子属性:
    transform:translateX(x);
    transform:translateY(y);
    特点:不会影响周边元素的位置。
  2. transform:rotate(deg);

    作用:让元素根据指定的度数旋转。

    1
    2
    3
    4
    //该属性不能拆分
    transform:rotate(90deg);
    //如果是正数,则是顺时针旋转
    //如果是负数,则是逆时针
  3. transform:skew (deg) -- 用得不太多
    作用:让元素扭曲变形

    1
    2
    3
    4
    5
    6
    7
    8
    transform:skew(x,y)
    //如果只写一个值,表示的是x方向,如果写两个,则x,y都斜切
    x表示水平方向斜切,y表示垂直方向斜切
    //可以拆分为:x,y
    transform:skewX(度数)
    transform:skewY(度数)
    //
    transfrom:skew(45deg)===> transform:skewX(45deg)
  4. transform:scale(x,y)
    作用:让元素缩放。默认是 1,比 1 大则放大,比 1 小,则缩小

    1
    2
    3
    4
    5
    6
    transform:scale(1.2)//放大到原来的1.2
    //写法:
    transform:scale(0.5)
    transform:scale(1.2,1.5)
    transform:scaleX(1.2);//只有一个x方向放大
    transform:scaleY(1.2);//只有一个y方向放大
  5. 如何让一个元素使用多重动画效果

    1
    2
    3
    4
    5
    transform:变换样式1 [变换样式2 变换样式3,4] 
    //也就是不能写成下面的效果
    transform:变换样式1
    transform:变换样式2
    transform:变换样式3

# 改变旋转中心

transform-origin 属性

设置元素转换的基点位置:

1
2
3
4
5
语法:
transform-origin:x y;
x的取值为left、center、right、px、%
y的取值为top、center、bottom、px、%
默认旋转中心为transform-origin50% 50%;

# 运动的规则【总结】

  1. 动画一般是用户触发,所以动画会加在 hover 上或使用 JS 动态添加一个 class 来响应用户操作:比如鼠标摸上去或点击某个按钮等
  2. 行内元素需要转为块级或行内块级才可以使用动画效果(transform 只能用于块级和行内块级)
  3. transition 属性不仅仅只是服务于 transform 属性,还服务于其他的任何可以实现位移或者状态改变的样式,比如盒模型、透明度、偏移属性等。
  4. transition 是一次性的,不能重复发生,除非再次触发
  5. transition 只能定义开始状态和结束状态,不能定义中间状态,也就是说只有两个状态(类似于鼠标摸上去和鼠标离开)。

# CSS3 动画实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>纯CSS实现下拉菜单特效</title>
<style type="text/css">
*{padding:0;margin:0;}
ul{ list-style: none; }
a{ color: #fff; text-decoration: none; font-size: 14px }
.menu{ width: 400px; height: 40px; line-height: 40px; background-color: #DE0031;}
.menu>li{ float: left; width: 25%; position: relative; }
li a{ display: block; text-align: center; }
.sub{position: absolute; top: 40px; left: 0;width:100px;height:0;background-color: #DE0031;
transition: height 1s;
}
.menu>li:hover .sub{ height:120px; }
.sub li{ height: 40px; line-height: 40px; }
</style>
</head>
<body>
<ul class="menu">
<li>
<a href="#">菜单1</a>
<ul class="sub">
<li><a href="#">子菜单1</a></li>
<li><a href="#">子菜单2</a></li>
<li><a href="#">子菜单3</a></li>
</ul>
</li>
<li>
<a href="#">菜单2</a>
<ul class="sub">
<li><a href="#">子菜单1</a></li>
<li><a href="#">子菜单2</a></li>
<li><a href="#">子菜单3</a></li>
</ul>
</li>
<li>
<a href="#">菜单3</a>
<ul class="sub">
<li><a href="#">子菜单1</a></li>
<li><a href="#">子菜单2</a></li>
<li><a href="#">子菜单3</a></li>
</ul>
</li>
<li>
<a href="#">菜单4</a>
<ul class="sub">
<li><a href="#">子菜单1</a></li>
<li><a href="#">子菜单2</a></li>
<li><a href="#">子菜单3</a></li>
</ul>
</li>
</ul>
</body>
</html>

# CSS3 的自定义动画

自定义动画的两个步骤:

  1. 声明一个动画(函数声明)
    function 函数名 (){

    }

  2. 调用动画(让谁动,就写在谁身上)

# 定义关键帧的选择器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
//简配版
@keyframes 动画名字{
//写动画的步骤,状态
//开始状态,用关键字from
from{
//写让css动起来的样式
//昨天学的+之前学的(盒模型、偏移属性、透明度、颜色)
}
//结束状态,用关键字to
to{
//这里的代码同上
}
}
//以上只有两个状态,如果要定制更多的状态,通过百分比来定制
//完全版,0%~100%随便写
@keyframes 动画名字{
//0%相当于是from关键字
0%{

}
。。。
10%{
}
50%{

}
80%{

}
//100%相当于是to
100%{

}
}

# 调用动画的属性 animation

只是比昨天的 transition 多了 3 个属性。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//语法:
animation: 动画名字 动画时间 动画延迟时间 运动方式 动画次数 动画运动方向。
//参数说明:
前面4个参数跟昨天的一样,将样式改为动画名字
动画次数:指的是动画重复的次数,默认值是1,特殊值:infinite(无限次)
运动方向:默认是单一方向(normal,0-100%),可以让它来回走(alternate,0-100-0-100)。
//最少写两个参数:前面两个
比如:
div{
/* 完整写法: */
animation: myfirst 5s linear 2s infinite alternate;
/* 最简单的写法: */
animation: myfirst 5s;
}
/*以上可以简写到animation*/
所有动画属性的简写属性,除了 animation-play-state 属性

控制动画是否播放或暂停的一个属性:
animation-play-state:running (默认值)|paused(暂停)

animation 的拆分写法:

1
2
3
4
5
6
7
8
所有animation属性:
animation-name: myfirst;/*@keyframes动画名称*/
animation-duration: 5s;/*动画完成一个周期所花费的秒或毫秒。默认是 0。*/
animation-timing-function: linear;/*动画的速度曲线。默认是 "ease"。*/
animation-delay: 2s;/*动画何时开始。默认是 0*/
animation-iteration-count: infinite;/*动画被播放的次数。默认是 1。*/值n、infinite(无限次)*/
animation-direction: alternate;/*动画是否在下一周期逆向地播放。默认是 "normal"。也就是偶数次会改变动画方向,动画交替的执行*/
animation-play-state: running;/*动画是否正在运行或已暂停,值running、paused*/

# 第三方的动画库 animate.css

https://animate.style/

  1. 导入他整个样式文件使用

    请看案例

  2. 借鉴它的动画写法(拿来主义),只使用部分

# CSS3 自定义动画实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65

<!DOCTYPE html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>作业3</title>
<style>
@keyframes run {
from {
transform: rotate(0deg);
}

to {
transform: rotate(360deg);
}
}

.box {
margin: 50px auto;
width: 250px;
height: 250px;
border-radius: 50%;
background-color: #c45575;
border: #a64863 solid 5px;
position: relative;
}
.box div{
transform-origin: 25px 5px;
position: absolute;
left: 100px;
top: 125px;
height: 10px;
}
.hour {
width: 100px;
background-color: #edb95b;
animation: run 6s infinite;
}

.min {
width: 120px;
background-color: #676bed;
animation: run 3s infinite;
}

.sec {
width: 148px;
background-color: #f78c5f;
animation: run 1s infinite;
}
</style>
</head>

<body>
<div class="box">
<div class="hour"></div>
<div class="min"></div>
<div class="sec"></div>
</div>
</body>

</html>

更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

tz 微信支付

微信支付

tz 支付宝

支付宝