1e41f4b71Sopenharmony_ci# Developing Animations
2e41f4b71Sopenharmony_ci
3e41f4b71Sopenharmony_ci
4e41f4b71Sopenharmony_ciAnimations are classified into [Static Animation](#static-animation) and [Continuous Animation](#continuous-animation).
5e41f4b71Sopenharmony_ci
6e41f4b71Sopenharmony_ci
7e41f4b71Sopenharmony_ci## Static Animation
8e41f4b71Sopenharmony_ci
9e41f4b71Sopenharmony_ciThe transform attributes are the core of the static animation. A static animation can transform in the following three ways and only once in each way at a time:
10e41f4b71Sopenharmony_ci
11e41f4b71Sopenharmony_ci- translate: moves a specified component horizontally or vertically.
12e41f4b71Sopenharmony_ci
13e41f4b71Sopenharmony_ci- scale: scales a specified component horizontally or vertically to the required scale.
14e41f4b71Sopenharmony_ci
15e41f4b71Sopenharmony_ci- rotate: rotates a specified component by a specified angle along the horizontal axis, vertical axis, or center point.
16e41f4b71Sopenharmony_ci
17e41f4b71Sopenharmony_ciFor more information, see [Component Methods](../reference/apis-arkui/arkui-js/js-components-common-methods.md). The following is an example:
18e41f4b71Sopenharmony_ci
19e41f4b71Sopenharmony_ci```html
20e41f4b71Sopenharmony_ci<!-- xxx.hml -->
21e41f4b71Sopenharmony_ci<div class="container">
22e41f4b71Sopenharmony_ci  <text class="translate">hello</text>
23e41f4b71Sopenharmony_ci  <text class="rotate">hello</text>
24e41f4b71Sopenharmony_ci  <text class="scale">hello</text>
25e41f4b71Sopenharmony_ci</div>
26e41f4b71Sopenharmony_ci```
27e41f4b71Sopenharmony_ci
28e41f4b71Sopenharmony_ci```css
29e41f4b71Sopenharmony_ci/* xxx.css */
30e41f4b71Sopenharmony_ci.container {
31e41f4b71Sopenharmony_ci  width: 100%;
32e41f4b71Sopenharmony_ci  flex-direction: column;
33e41f4b71Sopenharmony_ci  align-items: center;
34e41f4b71Sopenharmony_ci}
35e41f4b71Sopenharmony_ci.translate {
36e41f4b71Sopenharmony_ci  height: 150px;
37e41f4b71Sopenharmony_ci  width: 300px;
38e41f4b71Sopenharmony_ci  margin: 50px;
39e41f4b71Sopenharmony_ci  font-size: 50px;
40e41f4b71Sopenharmony_ci  background-color: #008000;
41e41f4b71Sopenharmony_ci  transform: translate(200px);
42e41f4b71Sopenharmony_ci}
43e41f4b71Sopenharmony_ci.rotate {
44e41f4b71Sopenharmony_ci  height: 150px;
45e41f4b71Sopenharmony_ci  width: 300px;
46e41f4b71Sopenharmony_ci  margin: 50px;
47e41f4b71Sopenharmony_ci  font-size: 50px;
48e41f4b71Sopenharmony_ci  background-color: #008000;
49e41f4b71Sopenharmony_ci  transform-origin: 200px 100px;
50e41f4b71Sopenharmony_ci  transform: rotate(45deg);
51e41f4b71Sopenharmony_ci}
52e41f4b71Sopenharmony_ci.scale {
53e41f4b71Sopenharmony_ci  height: 150px;
54e41f4b71Sopenharmony_ci  width: 300px;
55e41f4b71Sopenharmony_ci  margin: 50px;
56e41f4b71Sopenharmony_ci  font-size: 50px;
57e41f4b71Sopenharmony_ci  background-color: #008000;
58e41f4b71Sopenharmony_ci  transform: scaleX(1.5);
59e41f4b71Sopenharmony_ci}
60e41f4b71Sopenharmony_ci```
61e41f4b71Sopenharmony_ci
62e41f4b71Sopenharmony_ci**Figure 1** Static animation
63e41f4b71Sopenharmony_ci
64e41f4b71Sopenharmony_ci![en-us_image_0000001071134933](figures/en-us_image_0000001071134933.png)
65e41f4b71Sopenharmony_ci
66e41f4b71Sopenharmony_ci
67e41f4b71Sopenharmony_ci## Continuous Animation
68e41f4b71Sopenharmony_ci
69e41f4b71Sopenharmony_ciThe static animation has only the start and end states. To set the transition state and conversion effect, use continuous animations.
70e41f4b71Sopenharmony_ci
71e41f4b71Sopenharmony_ciThe core of a continuous animation is animation attributes, which define the start and end states of the animation and the curve of time and speed. Animation attributes can implement the following effects:
72e41f4b71Sopenharmony_ci
73e41f4b71Sopenharmony_ci- **animation-name**: background color, opacity, width, height, and transformation type applied to the element after the animation is executed
74e41f4b71Sopenharmony_ci
75e41f4b71Sopenharmony_ci- **animation-delay** and **animation-duration**: element delay and duration after the animation is executed
76e41f4b71Sopenharmony_ci
77e41f4b71Sopenharmony_ci- **animation-timing-function**: speed curve of an animation, which makes the animation more fluent
78e41f4b71Sopenharmony_ci
79e41f4b71Sopenharmony_ci- **animation-iteration-count**: number of animation playback times
80e41f4b71Sopenharmony_ci
81e41f4b71Sopenharmony_ci- **animation-fill-mode**: whether to restore the initial state after the animation is executed
82e41f4b71Sopenharmony_ci
83e41f4b71Sopenharmony_ciTo use the animation attributes, you need to define a @keyframes rule in the .css file, set the animation transition effect in **@keyframes**, and invoke the effect through a style class in the .hml file. The following is an example for **animation-name**:
84e41f4b71Sopenharmony_ci
85e41f4b71Sopenharmony_ci```html
86e41f4b71Sopenharmony_ci<!-- xxx.hml -->
87e41f4b71Sopenharmony_ci<div class="item-container">
88e41f4b71Sopenharmony_ci    <div class="item {{colorParam}}">
89e41f4b71Sopenharmony_ci        <text class="txt">color</text>
90e41f4b71Sopenharmony_ci    </div>
91e41f4b71Sopenharmony_ci    <div class="item {{opacityParam}}">
92e41f4b71Sopenharmony_ci        <text class="txt">opacity</text>
93e41f4b71Sopenharmony_ci    </div>
94e41f4b71Sopenharmony_ci    <input class="button" type="button" name="" value="show" onclick="showAnimation"/>
95e41f4b71Sopenharmony_ci</div>
96e41f4b71Sopenharmony_ci```
97e41f4b71Sopenharmony_ci
98e41f4b71Sopenharmony_ci```css
99e41f4b71Sopenharmony_ci/* xxx.css */
100e41f4b71Sopenharmony_ci.item-container {
101e41f4b71Sopenharmony_ci  margin: 60px;
102e41f4b71Sopenharmony_ci  flex-direction: column;
103e41f4b71Sopenharmony_ci}
104e41f4b71Sopenharmony_ci.item {
105e41f4b71Sopenharmony_ci  width: 80%;
106e41f4b71Sopenharmony_ci  background-color: #f76160;
107e41f4b71Sopenharmony_ci}
108e41f4b71Sopenharmony_ci.txt {
109e41f4b71Sopenharmony_ci  text-align: center;
110e41f4b71Sopenharmony_ci  width: 200px;
111e41f4b71Sopenharmony_ci  height: 100px;
112e41f4b71Sopenharmony_ci}
113e41f4b71Sopenharmony_ci.button {
114e41f4b71Sopenharmony_ci  width: 200px;
115e41f4b71Sopenharmony_ci  margin: 10px;
116e41f4b71Sopenharmony_ci  font-size: 30px;
117e41f4b71Sopenharmony_ci  background-color: #09ba07;
118e41f4b71Sopenharmony_ci}
119e41f4b71Sopenharmony_ci.color {
120e41f4b71Sopenharmony_ci  animation-name: Color;
121e41f4b71Sopenharmony_ci  animation-duration: 8000ms;
122e41f4b71Sopenharmony_ci}
123e41f4b71Sopenharmony_ci.opacity {
124e41f4b71Sopenharmony_ci  animation-name: Opacity;
125e41f4b71Sopenharmony_ci  animation-duration: 8000ms;
126e41f4b71Sopenharmony_ci}
127e41f4b71Sopenharmony_ci@keyframes Color {
128e41f4b71Sopenharmony_ci  from {
129e41f4b71Sopenharmony_ci    background-color: #f76160;
130e41f4b71Sopenharmony_ci  }
131e41f4b71Sopenharmony_ci  to {
132e41f4b71Sopenharmony_ci    background-color: #09ba07;
133e41f4b71Sopenharmony_ci  }
134e41f4b71Sopenharmony_ci}
135e41f4b71Sopenharmony_ci@keyframes Opacity {
136e41f4b71Sopenharmony_ci  from {
137e41f4b71Sopenharmony_ci    opacity: 0.9;
138e41f4b71Sopenharmony_ci  }
139e41f4b71Sopenharmony_ci  to {
140e41f4b71Sopenharmony_ci    opacity: 0.1;
141e41f4b71Sopenharmony_ci  }
142e41f4b71Sopenharmony_ci}
143e41f4b71Sopenharmony_ci```
144e41f4b71Sopenharmony_ci
145e41f4b71Sopenharmony_ci```js
146e41f4b71Sopenharmony_ci// xxx.js
147e41f4b71Sopenharmony_ciexport default {
148e41f4b71Sopenharmony_ci  data: {
149e41f4b71Sopenharmony_ci    colorParam: '',
150e41f4b71Sopenharmony_ci    opacityParam: '',
151e41f4b71Sopenharmony_ci  },
152e41f4b71Sopenharmony_ci  showAnimation: function () {
153e41f4b71Sopenharmony_ci    this.colorParam = '';
154e41f4b71Sopenharmony_ci    this.opacityParam = '';
155e41f4b71Sopenharmony_ci    this.colorParam = 'color';
156e41f4b71Sopenharmony_ci    this.opacityParam = 'opacity';
157e41f4b71Sopenharmony_ci  }
158e41f4b71Sopenharmony_ci}
159e41f4b71Sopenharmony_ci```
160e41f4b71Sopenharmony_ci
161e41f4b71Sopenharmony_ci**Figure 2** Continuous animation effect
162e41f4b71Sopenharmony_ci
163e41f4b71Sopenharmony_ci![en-us_image_0000001063148757](figures/en-us_image_0000001063148757.gif)
164