• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 动画
2
3动画分为[静态动画](#静态动画)和[连续动画](#连续动画)。
4
5
6## 静态动画
7
8静态动画的核心是transform样式,主要可以实现以下三种变换类型,一次样式设置只能实现一种类型变换。
9
10- **translate**:沿水平或垂直方向将指定组件移动所需距离。
11
12- **scale**:横向或纵向将指定组件缩小或放大到所需比例。
13
14- **rotate**:将指定组件沿横轴或纵轴或中心点旋转指定的角度。
15
16具体的使用示例如下,更多信息请参考[组件方法](../reference/arkui-js/js-components-common-methods.md)。
17
18```html
19<!-- xxx.hml -->
20<div class="container">
21  <text class="translate">hello</text>
22  <text class="rotate">hello</text>
23  <text class="scale">hello</text>
24</div>
25```
26
27```css
28/* xxx.css */
29.container {
30  width: 100%;
31  flex-direction: column;
32  align-items: center;
33}
34.translate {
35  height: 150px;
36  width: 300px;
37  margin: 50px;
38  font-size: 50px;
39  background-color: #008000;
40  transform: translate(200px);
41}
42.rotate {
43  height: 150px;
44  width: 300px;
45  margin: 50px;
46  font-size: 50px;
47  background-color: #008000;
48  transform-origin: 200px 100px;
49  transform: rotate(45deg);
50}
51.scale {
52  height: 150px;
53  width: 300px;
54  margin: 50px;
55  font-size: 50px;
56  background-color: #008000;
57  transform: scaleX(1.5);
58}
59```
60
61
62**图1** 静态动画效果图
63
64![zh-cn_image_0000001071134933](figures/zh-cn_image_0000001071134933.png)
65
66
67## 连续动画
68
69静态动画只有开始状态和结束状态,没有中间状态,如果需要设置中间的过渡状态和转换效果,需要使用连续动画实现。
70
71连续动画的核心是animation样式,它定义了动画的开始状态、结束状态以及时间和速度的变化曲线。通过animation样式可以实现的效果有:
72
73- **animation-name**:设置动画执行后应用到组件上的背景颜色、透明度、宽高和变换类型。
74
75- **animation-delay**和**animation-duration**:分别设置动画执行后元素延迟和持续的时间。
76
77- **animation-timing-function**:描述动画执行的速度曲线,使动画更加平滑。
78
79- **animation-iteration-count**:定义动画播放的次数。
80
81- **animation-fill-mode**:指定动画执行结束后是否恢复初始状态。
82
83animation样式需要在css文件中先定义keyframe,在keyframe中设置动画的过渡效果,并通过一个样式类型在hml文件中调用。animation-name的使用示例如下:
84
85```html
86<!-- xxx.hml -->
87<div class="item-container">
88    <div class="item {{colorParam}}">
89        <text class="txt">color</text>
90    </div>
91    <div class="item {{opacityParam}}">
92        <text class="txt">opacity</text>
93    </div>
94    <input class="button" type="button" name="" value="show" onclick="showAnimation"/>
95</div>
96```
97
98```css
99/* xxx.css */
100.item-container {
101  margin: 60px;
102  flex-direction: column;
103}
104.item {
105  width: 80%;
106  background-color: #f76160;
107}
108.txt {
109  text-align: center;
110  width: 200px;
111  height: 100px;
112}
113.button {
114  width: 200px;
115  margin: 10px;
116  font-size: 30px;
117  background-color: #09ba07;
118}
119.color {
120  animation-name: Color;
121  animation-duration: 8000ms;
122}
123.opacity {
124  animation-name: Opacity;
125  animation-duration: 8000ms;
126}
127@keyframes Color {
128  from {
129    background-color: #f76160;
130  }
131  to {
132    background-color: #09ba07;
133  }
134}
135@keyframes Opacity {
136  from {
137    opacity: 0.9;
138  }
139  to {
140    opacity: 0.1;
141  }
142}
143```
144
145```js
146// xxx.js
147export default {
148  data: {
149    colorParam: '',
150    opacityParam: '',
151  },
152  showAnimation: function () {
153    this.colorParam = '';
154    this.opacityParam = '';
155    this.colorParam = 'color';
156    this.opacityParam = 'opacity';
157  }
158}
159```
160
161**图2** 连续动画效果图
162
163![zh-cn_image_0000001063148757](figures/zh-cn_image_0000001063148757.gif)
164