被拒绝是悲伤的,但是拒绝的一方也很痛苦
纯白交响曲
简介
CSS transitions 提供了一种在更改CSS属性时控制动画速度的方法。 其可以让属性变化成为一个持续一段时间的过程,而不是立即生效的。比如,将一个元素的颜色从白色改为黑色,通常这个改变是立即生效的,使用 CSS transitions 后该元素的颜色将逐渐从白色变为黑色,按照一定的曲线速率变化。这个过程可以自定义。
通常将两个状态之间的过渡称为隐式过渡(implicit transitions),因为开始与结束之间的状态由浏览器决定。
CSS transitions 可以决定哪些属性发生动画效果 (明确地列出这些属性),何时开始 (设置 delay),持续多久 (设置 duration) 以及如何动画 (定义timing funtion,比如匀速地或先快后慢)。
浏览器兼容性
以下浏览器数据支持来自 Caniuse ,可以看出支持程度相当好了
PC端浏览器:
| Chrome | Opera | FireFox | IE | Edge | Safari | 
|---|---|---|---|---|---|
| 26 | 12.1 | 16 | 10 | YES | 6.1 | 
移动端浏览器:
| iOS Safari | Opera Mobile | Opera Mini | Android | Android Chrome | Android Firefox | 
|---|---|---|---|---|---|
| 7.1 | 12.1 | 12.1 | 4.4 | 62 | 57 | 
基本用法
1  | transition: transition-property transition-duration transition-timing-function transition-delay;  | 
transition-property:规定设置过渡效果的 CSS 属性的名称
transition-duration:规定完成过渡效果的时间,单位是秒或毫秒
transition-timing-function:规定速度效果的速度曲线
transition-delay:定义过渡效果延迟时间,单位是秒或毫秒 
下面重点介绍property和timing-function这两个属性:
transition-property
这个属性的取值有很多,建议到 MDN官方文档 中查阅,经常用到的有color类的,width/height类的等等transition-duration
这个属性严格意义上不能分类,官方单独将五种(不包含step类的)比较特别的单独命名出来,便于大家使用,分别是:
linear:规定以相同速度开始至结束的过渡效果
ease:规定慢速开始,然后变快,然后慢速结束的过渡效果
ease-in:规定以慢速开始的过渡效果
ease-out:规定以慢速结束的过渡效果
ease-in-out:规定以慢速开始和结束的过渡效果
其实最基本的都是依赖于cubic-bezier(n,n,n,n),n的取值范围是0到1
实例
demo1:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22<a href="javascript:void(0);" class="demo">我是一个demo</a>
.demo {
  position: relative;
  text-decoration: none;
  font-size: 20px;
  color: #333;
}
.demo:before {
  content: "";
  position: absolute;
  left: 0;
  bottom: -2px;
  height: 2px;
  width: 100%;
  background: #4285f4;
  transform: scale(0);
  transition: all 0.3s;
}
.demo:hover:before {
  transform: scale(1);
}
demo2:
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
66<a class="l-border border-line">我是另一个demo</a>
.l-border{
  display: inline-block;
  padding: 16px 32px;
  border: 1px solid #ebebeb;
  -webkit-transition: all 0.6s ease-in;
  transition: all 0.6s ease-in;
}
.l-border:hover{
  border: 1px solid #367dff;
}
.border-line {
  position: relative;
  display: inline-block;
  height: 100%;
  background: none;
  box-sizing: border-box;
  box-shadow: inset 0 0 0 0px transparent;
}
.border-line::after,
.border-line::before {
  position: absolute;
  content: '';
  display: block;
  width: 0;
  height: 0;
  box-sizing: border-box;
  border: 1px solid transparent;
}
.border-line::after {
  top: 0;
  left: 0;
  -webkit-transition: border-color 0s ease-in 0.8s, width 0.2s ease-in 0.6s, height 0.2s ease-in 0.4s;
  transition: border-color 0s ease-in 0.8s, width 0.2s ease-in 0.6s, height 0.2s ease-in 0.4s;
}
.border-line::before {
  bottom: 0;
  right: 0;
  -webkit-transition: border-color 0s ease-in 0.4s, width 0.2s ease-in 0.2s, height 0.2s ease-in;
  transition: border-color 0s ease-in 0.4s, width 0.2s ease-in 0.2s, height 0.2s ease-in;
}
.border-line:hover::after,
.border-line:hover::before {
  width: 100%;
  height: 100%;
}
.border-line:hover::after {
  border-top-color: #367dff;
  border-right-color: #367dff;
  -webkit-transition: width 0.2s ease-out, height 0.2s ease-out 0.2s;
  transition: width 0.2s ease-out, height 0.2s ease-out 0.2s;
}
.border-line:hover::before {
  border-bottom-color: #367dff;
  border-left-color: #367dff;
  -webkit-transition: border-color 0s ease-out 0.4s, width 0.2s ease-out 0.4s, height 0.2s ease-out 0.6s;
  transition: border-color 0s ease-out 0.4s, width 0.2s ease-out 0.4s, height 0.2s ease-out 0.6s;
}
demo3:
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102<div class="effect-box">
  <div class="border-line2">
    <p> XXX </p>
    <p> demo </p>
    <p>Read More</p>
  </div>
</div>
.effect-box {
  position: relative;
  display: inline-block;
  overflow: hidden;
  width: 250px;
  height: 158px;
  background: #367dff;
  cursor: pointer
}
.effect-box img {
  display: block;
  width: 100%;
  height: 100%;
  opacity: .7;
  -webkit-transition: opacity .35s;
  transition: opacity .35s
}
.effect-box:hover img {
  opacity: .4
}
.effect-box .border-line2 {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  box-sizing: border-box;
  padding: 2em;
  font-size: 1.25em;
  color: #fff;
  text-transform: uppercase;
  -webkit-backface-visibility: hidden;
  backface-visibility: hidden
}
.effect-box .border-line2::after,
.effect-box .border-line2::before {
  position: absolute;
  top: 30px;
  right: 30px;
  bottom: 30px;
  left: 30px;
  content: '';
  opacity: 0;
  pointer-events: none;
  -webkit-transition: opacity .35s, -webkit-transform .35s;
  transition: opacity .35s, transform .35s
}
.effect-box .border-line2::before {
  border-top: 1px solid #fff;
  border-bottom: 1px solid #fff;
  -webkit-transform: scale(0, 1);
  transform: scale(0, 1)
}
.effect-box .border-line2::after {
  border-right: 1px solid #fff;
  border-left: 1px solid #fff;
  -webkit-transform: scale(1, 0);
  transform: scale(1, 0)
}
.effect-box:hover .border-line2::after,
.effect-box:hover .border-line2::before {
  opacity: 1;
  -webkit-transform: scale(1);
  transform: scale(1)
}
.effect-box .border-line2 p {
  padding: 4px 10px;
  margin: 0;
  font-size: 16px;
  line-height: 1.0;
  text-align: center;
  color: #fff;
  letter-spacing: 1px;
  opacity: 0;
  -webkit-transition: opacity .35s, -webkit-transform .35s;
  transition: opacity .35s, transform .35s;
  -webkit-transform: translate3d(0, 20px, 0);
  transform: translate3d(0, 20px, 0)
}
.effect-box:hover .border-line2 p {
  opacity: 1;
  -webkit-transform: translate3d(0, 0, 0);
  transform: translate3d(0, 0, 0)
}