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 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 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 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