1e41f4b71Sopenharmony_ci# Component Animation
2e41f4b71Sopenharmony_ci
3e41f4b71Sopenharmony_ci
4e41f4b71Sopenharmony_ciCreate and run an animation shortcut on the component. For details, see [Universal Methods](../reference/apis-arkui/arkui-js/js-components-common-methods.md).
5e41f4b71Sopenharmony_ci
6e41f4b71Sopenharmony_ci
7e41f4b71Sopenharmony_ci## Obtaining an Animation Object
8e41f4b71Sopenharmony_ci
9e41f4b71Sopenharmony_ciCall the **animate** method to obtain an animation object, which supports animation attributes, methods, and events.
10e41f4b71Sopenharmony_ci
11e41f4b71Sopenharmony_ci```html
12e41f4b71Sopenharmony_ci<!-- xxx.hml -->
13e41f4b71Sopenharmony_ci<div class="container">
14e41f4b71Sopenharmony_ci  <div id="content" class="box" onclick="Show"></div>
15e41f4b71Sopenharmony_ci</div>
16e41f4b71Sopenharmony_ci```
17e41f4b71Sopenharmony_ci
18e41f4b71Sopenharmony_ci```css
19e41f4b71Sopenharmony_ci/* xxx.css */
20e41f4b71Sopenharmony_ci.container {
21e41f4b71Sopenharmony_ci  flex-direction: column;
22e41f4b71Sopenharmony_ci  justify-content: center;
23e41f4b71Sopenharmony_ci  align-items: center;
24e41f4b71Sopenharmony_ci  width: 100%;
25e41f4b71Sopenharmony_ci}
26e41f4b71Sopenharmony_ci.box{
27e41f4b71Sopenharmony_ci  width: 200px;
28e41f4b71Sopenharmony_ci  height: 200px;
29e41f4b71Sopenharmony_ci  background-color: #ff0000;
30e41f4b71Sopenharmony_ci  margin-top: 30px;
31e41f4b71Sopenharmony_ci}
32e41f4b71Sopenharmony_ci```
33e41f4b71Sopenharmony_ci
34e41f4b71Sopenharmony_ci```js
35e41f4b71Sopenharmony_ci/* xxx.js */
36e41f4b71Sopenharmony_ciexport default {
37e41f4b71Sopenharmony_ci    data: {
38e41f4b71Sopenharmony_ci        animation: '',
39e41f4b71Sopenharmony_ci        options: {},
40e41f4b71Sopenharmony_ci        frames: {}
41e41f4b71Sopenharmony_ci    },
42e41f4b71Sopenharmony_ci    onInit() {
43e41f4b71Sopenharmony_ci        this.options = {
44e41f4b71Sopenharmony_ci            duration: 1500,
45e41f4b71Sopenharmony_ci        };
46e41f4b71Sopenharmony_ci        this.frames = [
47e41f4b71Sopenharmony_ci            {
48e41f4b71Sopenharmony_ci                width: 200, height: 200,
49e41f4b71Sopenharmony_ci            },
50e41f4b71Sopenharmony_ci            {
51e41f4b71Sopenharmony_ci                width: 300, height: 300,
52e41f4b71Sopenharmony_ci            }
53e41f4b71Sopenharmony_ci        ];
54e41f4b71Sopenharmony_ci    },
55e41f4b71Sopenharmony_ci    Show() {
56e41f4b71Sopenharmony_ci        this.animation = this.$element('content').animate(this.frames, this.options); // Obtain the animation object.
57e41f4b71Sopenharmony_ci        this.animation.play();
58e41f4b71Sopenharmony_ci    }
59e41f4b71Sopenharmony_ci}
60e41f4b71Sopenharmony_ci```
61e41f4b71Sopenharmony_ci
62e41f4b71Sopenharmony_ci![en-us_image_0000001222807812](figures/en-us_image_0000001222807812.gif)
63e41f4b71Sopenharmony_ci
64e41f4b71Sopenharmony_ci> **NOTE**
65e41f4b71Sopenharmony_ci> - When using the animate method, you must pass the keyframes and options parameters.
66e41f4b71Sopenharmony_ci> - If animate is called multiple times and the replace policy is used, parameters passed to the last call will take effect.
67e41f4b71Sopenharmony_ci
68e41f4b71Sopenharmony_ci
69e41f4b71Sopenharmony_ci## Setting Animation Parameters
70e41f4b71Sopenharmony_ci
71e41f4b71Sopenharmony_ciAfter obtaining an animation object, you can set its style working on the component by using the keyframes parameter.
72e41f4b71Sopenharmony_ci
73e41f4b71Sopenharmony_ci```html
74e41f4b71Sopenharmony_ci<!-- xxx.hml -->
75e41f4b71Sopenharmony_ci<div class="container">
76e41f4b71Sopenharmony_ci   <div id="content" class="box" onclick="Show"></div>
77e41f4b71Sopenharmony_ci</div>
78e41f4b71Sopenharmony_ci```
79e41f4b71Sopenharmony_ci
80e41f4b71Sopenharmony_ci```css
81e41f4b71Sopenharmony_ci/* xxx.css */
82e41f4b71Sopenharmony_ci.container {
83e41f4b71Sopenharmony_ci  flex-direction: column;
84e41f4b71Sopenharmony_ci  justify-content: center;
85e41f4b71Sopenharmony_ci  align-items: center;
86e41f4b71Sopenharmony_ci  width: 100%;
87e41f4b71Sopenharmony_ci  height: 100%;
88e41f4b71Sopenharmony_ci}
89e41f4b71Sopenharmony_ci.box{
90e41f4b71Sopenharmony_ci  width: 200px;
91e41f4b71Sopenharmony_ci  height: 200px;
92e41f4b71Sopenharmony_ci  background-color: #ff0000;
93e41f4b71Sopenharmony_ci  margin-top: 30px;
94e41f4b71Sopenharmony_ci}
95e41f4b71Sopenharmony_ci```
96e41f4b71Sopenharmony_ci
97e41f4b71Sopenharmony_ci```js
98e41f4b71Sopenharmony_ci/* xxx.js */
99e41f4b71Sopenharmony_ciexport default {
100e41f4b71Sopenharmony_ci  data: {
101e41f4b71Sopenharmony_ci    animation: '',
102e41f4b71Sopenharmony_ci    keyframes:{},
103e41f4b71Sopenharmony_ci    options:{}
104e41f4b71Sopenharmony_ci  },
105e41f4b71Sopenharmony_ci  onInit() {
106e41f4b71Sopenharmony_ci    this.options = {
107e41f4b71Sopenharmony_ci      duration: 4000,
108e41f4b71Sopenharmony_ci    }
109e41f4b71Sopenharmony_ci    this.keyframes = [
110e41f4b71Sopenharmony_ci    {
111e41f4b71Sopenharmony_ci      transform: {
112e41f4b71Sopenharmony_ci        translate: '-120px -0px',   
113e41f4b71Sopenharmony_ci        scale: 1,        
114e41f4b71Sopenharmony_ci        rotate: 0
115e41f4b71Sopenharmony_ci        },   
116e41f4b71Sopenharmony_ci        transformOrigin: '100px 100px',  
117e41f4b71Sopenharmony_ci        offset: 0.0, 
118e41f4b71Sopenharmony_ci        width: 200,  
119e41f4b71Sopenharmony_ci        height: 200   
120e41f4b71Sopenharmony_ci      }, 
121e41f4b71Sopenharmony_ci      {
122e41f4b71Sopenharmony_ci        transform: {      
123e41f4b71Sopenharmony_ci          translate: '120px 0px',     
124e41f4b71Sopenharmony_ci          scale: 1.5,     
125e41f4b71Sopenharmony_ci          rotate: 90   
126e41f4b71Sopenharmony_ci          },
127e41f4b71Sopenharmony_ci          transformOrigin: '100px 100px',
128e41f4b71Sopenharmony_ci          offset: 1.0,
129e41f4b71Sopenharmony_ci          width: 300,
130e41f4b71Sopenharmony_ci          height: 300   
131e41f4b71Sopenharmony_ci      }    
132e41f4b71Sopenharmony_ci    ]
133e41f4b71Sopenharmony_ci  },
134e41f4b71Sopenharmony_ci  Show() {
135e41f4b71Sopenharmony_ci    this.animation = this.$element('content').animate(this.keyframes, this.options)
136e41f4b71Sopenharmony_ci    this.animation.play()
137e41f4b71Sopenharmony_ci  }
138e41f4b71Sopenharmony_ci}
139e41f4b71Sopenharmony_ci```
140e41f4b71Sopenharmony_ci
141e41f4b71Sopenharmony_ci![en-us_image_0000001267647897](figures/en-us_image_0000001267647897.gif)
142e41f4b71Sopenharmony_ci
143e41f4b71Sopenharmony_ci> **NOTE**
144e41f4b71Sopenharmony_ci> - The sequence of **translate**, **scale**, and **rotate** affects the animation effect.
145e41f4b71Sopenharmony_ci> 
146e41f4b71Sopenharmony_ci> - **transformOrigin** works only for scale and rotate.
147e41f4b71Sopenharmony_ci
148e41f4b71Sopenharmony_ciSet the animation attributes by using the **options** parameter.
149e41f4b71Sopenharmony_ci
150e41f4b71Sopenharmony_ci```html
151e41f4b71Sopenharmony_ci<!-- xxx.hml -->
152e41f4b71Sopenharmony_ci<div class="container">
153e41f4b71Sopenharmony_ci   <div id="content" class="box" onclick="Show"></div>
154e41f4b71Sopenharmony_ci</div>
155e41f4b71Sopenharmony_ci```
156e41f4b71Sopenharmony_ci
157e41f4b71Sopenharmony_ci```css
158e41f4b71Sopenharmony_ci/* xxx.css */
159e41f4b71Sopenharmony_ci.container {
160e41f4b71Sopenharmony_ci  flex-direction: column;
161e41f4b71Sopenharmony_ci  justify-content: center;
162e41f4b71Sopenharmony_ci  align-items: center;
163e41f4b71Sopenharmony_ci  width: 100%;
164e41f4b71Sopenharmony_ci}
165e41f4b71Sopenharmony_ci.box{
166e41f4b71Sopenharmony_ci  width: 200px;
167e41f4b71Sopenharmony_ci  height: 200px;
168e41f4b71Sopenharmony_ci  background-color: #ff0000;
169e41f4b71Sopenharmony_ci  margin-top: 30px;
170e41f4b71Sopenharmony_ci}
171e41f4b71Sopenharmony_ci```
172e41f4b71Sopenharmony_ci
173e41f4b71Sopenharmony_ci```js
174e41f4b71Sopenharmony_ci/* xxx.js */
175e41f4b71Sopenharmony_ciexport default {
176e41f4b71Sopenharmony_ci    data: {
177e41f4b71Sopenharmony_ci        animation: '',
178e41f4b71Sopenharmony_ci        options: {},
179e41f4b71Sopenharmony_ci        frames: {}
180e41f4b71Sopenharmony_ci    },
181e41f4b71Sopenharmony_ci    onInit() {
182e41f4b71Sopenharmony_ci        this.options = {
183e41f4b71Sopenharmony_ci            duration: 1500,
184e41f4b71Sopenharmony_ci            easing: 'ease-in',
185e41f4b71Sopenharmony_ci            delay: 5,
186e41f4b71Sopenharmony_ci            iterations: 2,
187e41f4b71Sopenharmony_ci            direction: 'normal',
188e41f4b71Sopenharmony_ci        };
189e41f4b71Sopenharmony_ci        this.frames = [
190e41f4b71Sopenharmony_ci            {
191e41f4b71Sopenharmony_ci                transform: {
192e41f4b71Sopenharmony_ci                    translate: '-150px -0px'
193e41f4b71Sopenharmony_ci                }
194e41f4b71Sopenharmony_ci            },
195e41f4b71Sopenharmony_ci            {
196e41f4b71Sopenharmony_ci                transform: {
197e41f4b71Sopenharmony_ci                    translate: '150px 0px'
198e41f4b71Sopenharmony_ci                }
199e41f4b71Sopenharmony_ci            }
200e41f4b71Sopenharmony_ci        ];
201e41f4b71Sopenharmony_ci    },
202e41f4b71Sopenharmony_ci    Show() {
203e41f4b71Sopenharmony_ci        this.animation = this.$element('content').animate(this.frames, this.options);
204e41f4b71Sopenharmony_ci        this.animation.play();
205e41f4b71Sopenharmony_ci    }
206e41f4b71Sopenharmony_ci}
207e41f4b71Sopenharmony_ci```
208e41f4b71Sopenharmony_ci
209e41f4b71Sopenharmony_ci![en-us_image_0000001222967796](figures/en-us_image_0000001222967796.gif)
210e41f4b71Sopenharmony_ci
211e41f4b71Sopenharmony_ci> **NOTE**
212e41f4b71Sopenharmony_ci>
213e41f4b71Sopenharmony_ci> **direction**: mode of playing the animation.
214e41f4b71Sopenharmony_ci>
215e41f4b71Sopenharmony_ci> **normal**: plays the animation in forward loop mode.
216e41f4b71Sopenharmony_ci>
217e41f4b71Sopenharmony_ci> **reverse**: plays the animation in reverse loop mode.
218e41f4b71Sopenharmony_ci>
219e41f4b71Sopenharmony_ci> **alternate**: plays the animation in alternating loop mode. When the animation is played for an odd number of times, the playback is in forward direction. When the animation is played for an even number of times, the playback is in reverse direction.
220e41f4b71Sopenharmony_ci>
221e41f4b71Sopenharmony_ci> **alternate-reverse**: plays the animation in reverse alternating loop mode. When the animation is played for an odd number of times, the playback is in reverse direction. When the animation is played for an even number of times, the playback is in forward direction.
222e41f4b71Sopenharmony_ci
223e41f4b71Sopenharmony_ci
224