1e41f4b71Sopenharmony_ci# Transition Styles 2e41f4b71Sopenharmony_ci 3e41f4b71Sopenharmony_ci> **NOTE** 4e41f4b71Sopenharmony_ci> 5e41f4b71Sopenharmony_ci> Supported since API version 4. Updates will be marked with a superscript to indicate their earliest API version. 6e41f4b71Sopenharmony_ci 7e41f4b71Sopenharmony_ci## Transition of Shared Elements 8e41f4b71Sopenharmony_ci 9e41f4b71Sopenharmony_ci 10e41f4b71Sopenharmony_ci### Attributes 11e41f4b71Sopenharmony_ci 12e41f4b71Sopenharmony_ci| Name | Type | Default Value | Description | 13e41f4b71Sopenharmony_ci| ------- | ------ | ---- | ---------------------------------------- | 14e41f4b71Sopenharmony_ci| shareid | string | - | Used for the transition of shared elements, which takes effect only when this attribute is set. **\<list-item>**, **\<image>**, **\<text>**, **\<button>**, and **\<label>** components are supported for the transition of shared elements.| 15e41f4b71Sopenharmony_ci 16e41f4b71Sopenharmony_ci 17e41f4b71Sopenharmony_ci### Styles 18e41f4b71Sopenharmony_ci 19e41f4b71Sopenharmony_ci| Name | Type | Default Value | Description | 20e41f4b71Sopenharmony_ci| --------------------------------- | ------ | -------- | ---------------------------------------- | 21e41f4b71Sopenharmony_ci| shared-transition-effect | string | exchange | Entry style of a shared element during transition.<br>- **exchange** (default): The source page element is moved to the position of the target page element and is zoomed in or out properly.<br>- **static**: The position of the target page element remains unchanged. You can configure the opacity animation. Currently, only the static effect configured on the target page takes effect.| 22e41f4b71Sopenharmony_ci| shared-transition-name | string | - | During the transition, the style configured on the target page takes effect preferentially. This style is used to configure the animation effect of shared elements. The animation effect is an animation sequence defined by **@keyframes** supporting transform and opacity animations. If the effect of shared elements conflicts with the custom animation, the latter is used.| 23e41f4b71Sopenharmony_ci| shared-transition-timing-function | string | friction | During the transition, the style configured on the target page takes effect preferentially. This style defines the difference curve during the transition of shared elements. If it is not configured, the friction curve is used.| 24e41f4b71Sopenharmony_ci 25e41f4b71Sopenharmony_ci 26e41f4b71Sopenharmony_ci### Important Notes 27e41f4b71Sopenharmony_ci 28e41f4b71Sopenharmony_ci1. If the shared element transition style and custom page transition style are both configured, the latter is used. 29e41f4b71Sopenharmony_ci 30e41f4b71Sopenharmony_ci2. The exchange effect of shared elements is similar to the transition shown below. 31e41f4b71Sopenharmony_ci 32e41f4b71Sopenharmony_ci**Figure 1** Default transition effect of shared elements 33e41f4b71Sopenharmony_ci 34e41f4b71Sopenharmony_ci 35e41f4b71Sopenharmony_ci3. The animation of a shared element does not take effect for the border and background color of the element. 36e41f4b71Sopenharmony_ci 37e41f4b71Sopenharmony_ci4. During the transition of a shared element, the page element is hidden. Therefore, the animation style and function set for the page element are invalid. 38e41f4b71Sopenharmony_ci 39e41f4b71Sopenharmony_ci5. During the dynamic change of **shareid**<sup>5+</sup>, if the **shareid** value in component A is overwritten by that in component B, the shared element effect of component A becomes ineffective and will not be restored even if the **shareid** value is changed in component B. 40e41f4b71Sopenharmony_ci 41e41f4b71Sopenharmony_ci 42e41f4b71Sopenharmony_ci### Example 43e41f4b71Sopenharmony_ci 44e41f4b71Sopenharmony_ciIn the example below, where **PageA** jumps to **PageB**, the shared element is **image**, and the **shareid** is "shareImage". 45e41f4b71Sopenharmony_ci 46e41f4b71Sopenharmony_ci```html 47e41f4b71Sopenharmony_ci<!-- PageA --> 48e41f4b71Sopenharmony_ci<!-- xxx.hml --> 49e41f4b71Sopenharmony_ci<div> 50e41f4b71Sopenharmony_ci <list> 51e41f4b71Sopenharmony_ci <list-item type="description"> 52e41f4b71Sopenharmony_ci <image src="item.jpg" shareid="shareImage" onclick="jump" class="shared-transition-style"></image> 53e41f4b71Sopenharmony_ci </list-item> 54e41f4b71Sopenharmony_ci <list-item> 55e41f4b71Sopenharmony_ci <text onclick="jump">Click on picture to jump to the details</text> 56e41f4b71Sopenharmony_ci </list-item> 57e41f4b71Sopenharmony_ci </list> 58e41f4b71Sopenharmony_ci</div> 59e41f4b71Sopenharmony_ci``` 60e41f4b71Sopenharmony_ci 61e41f4b71Sopenharmony_ci```js 62e41f4b71Sopenharmony_ci// xxx.js 63e41f4b71Sopenharmony_ciimport router from '@ohos.router'; 64e41f4b71Sopenharmony_ciexport default { 65e41f4b71Sopenharmony_ci jump() { 66e41f4b71Sopenharmony_ci router.push({ 67e41f4b71Sopenharmony_ci // The path must be the same as that in the config.json file. 68e41f4b71Sopenharmony_ci url: 'pages/detailpage', 69e41f4b71Sopenharmony_ci }); 70e41f4b71Sopenharmony_ci }, 71e41f4b71Sopenharmony_ci} 72e41f4b71Sopenharmony_ci``` 73e41f4b71Sopenharmony_ci 74e41f4b71Sopenharmony_ci```css 75e41f4b71Sopenharmony_ci/* xxx.css */ 76e41f4b71Sopenharmony_ci.shared-transition-style { 77e41f4b71Sopenharmony_ci shared-transition-effect: exchange; 78e41f4b71Sopenharmony_ci shared-transition-name: shared-transition; 79e41f4b71Sopenharmony_ci} 80e41f4b71Sopenharmony_ci@keyframes shared-transition { 81e41f4b71Sopenharmony_ci from { opacity: 0; } 82e41f4b71Sopenharmony_ci to { opacity: 1; } 83e41f4b71Sopenharmony_ci} 84e41f4b71Sopenharmony_ci``` 85e41f4b71Sopenharmony_ci 86e41f4b71Sopenharmony_ci```html 87e41f4b71Sopenharmony_ci<!-- PageB --> 88e41f4b71Sopenharmony_ci<!-- xxx.hml --> 89e41f4b71Sopenharmony_ci<div> 90e41f4b71Sopenharmony_ci <image src="itemDetail.jpg" shareid="shareImage" onclick="jumpBack" class="shared-transition-style"></image> 91e41f4b71Sopenharmony_ci</div> 92e41f4b71Sopenharmony_ci``` 93e41f4b71Sopenharmony_ci 94e41f4b71Sopenharmony_ci```js 95e41f4b71Sopenharmony_ci// xxx.js 96e41f4b71Sopenharmony_ciimport router from '@ohos.router'; 97e41f4b71Sopenharmony_ciexport default { 98e41f4b71Sopenharmony_ci jumpBack() { 99e41f4b71Sopenharmony_ci router.back(); 100e41f4b71Sopenharmony_ci }, 101e41f4b71Sopenharmony_ci} 102e41f4b71Sopenharmony_ci``` 103e41f4b71Sopenharmony_ci 104e41f4b71Sopenharmony_ci```css 105e41f4b71Sopenharmony_ci/* xxx.css */ 106e41f4b71Sopenharmony_ci.shared-transition-style { 107e41f4b71Sopenharmony_ci shared-transition-effect: exchange; 108e41f4b71Sopenharmony_ci shared-transition-name: shared-transition; 109e41f4b71Sopenharmony_ci} 110e41f4b71Sopenharmony_ci@keyframes shared-transition { 111e41f4b71Sopenharmony_ci from { opacity: 0; } 112e41f4b71Sopenharmony_ci to { opacity: 1; } 113e41f4b71Sopenharmony_ci} 114e41f4b71Sopenharmony_ci``` 115e41f4b71Sopenharmony_ci 116e41f4b71Sopenharmony_ci 117e41f4b71Sopenharmony_ci## Widget Transition 118e41f4b71Sopenharmony_ci 119e41f4b71Sopenharmony_ci> **NOTE** 120e41f4b71Sopenharmony_ci> Widget transitions are not available when other transitions (including shared element transitions and custom transitions) are used. 121e41f4b71Sopenharmony_ci 122e41f4b71Sopenharmony_ci 123e41f4b71Sopenharmony_ci### Styles 124e41f4b71Sopenharmony_ci 125e41f4b71Sopenharmony_ci| Name | Type | Default Value | Description | 126e41f4b71Sopenharmony_ci| ----------------- | ------ | ---- | ---------------------------------------- | 127e41f4b71Sopenharmony_ci| transition-effect | string | - | Whether a component on the current page displays the transition effect during a widget transition. Available values are as follows:<br>- **unfold**: The component will move upwards by one widget height if the component is located above the widget tapped by the user, or move downwards by one widget height if the component is located below the widget.<br>- **none**: No transition effect is displayed.| 128e41f4b71Sopenharmony_ci 129e41f4b71Sopenharmony_ci 130e41f4b71Sopenharmony_ci### Example 131e41f4b71Sopenharmony_ci 132e41f4b71Sopenharmony_ciThe **source_page** has a title area on the top and a widget list. Users can tap a widget to switch to the **target_page**. 133e41f4b71Sopenharmony_ci 134e41f4b71Sopenharmony_ci```html 135e41f4b71Sopenharmony_ci<!-- source_page --> 136e41f4b71Sopenharmony_ci<!-- xxx.hml --> 137e41f4b71Sopenharmony_ci<div class="container"> 138e41f4b71Sopenharmony_ci <div class="outer"> 139e41f4b71Sopenharmony_ci <text style="font-size: 23px; margin-bottom: 20px" >MAIN TITLE</text> 140e41f4b71Sopenharmony_ci </div> 141e41f4b71Sopenharmony_ci <list style="width:340px;height:600px;flex-direction:column;justify-content:center;align-items:center"> 142e41f4b71Sopenharmony_ci <list-item type="listItem" class="item" card="true" for="list" id="{{$item.id}}" onclick="jumpPage({{$item.id}}, {{$item.url}})"> 143e41f4b71Sopenharmony_ci <text style="margin-left: 10px; font-size: 23px;">{{$item.title}}</text> 144e41f4b71Sopenharmony_ci </list-item> 145e41f4b71Sopenharmony_ci </list> 146e41f4b71Sopenharmony_ci</div> 147e41f4b71Sopenharmony_ci``` 148e41f4b71Sopenharmony_ci 149e41f4b71Sopenharmony_ci```js 150e41f4b71Sopenharmony_ci// xxx.js 151e41f4b71Sopenharmony_ciimport router from '@ohos.router' 152e41f4b71Sopenharmony_ciexport default { 153e41f4b71Sopenharmony_ci data: { list: [] }, 154e41f4b71Sopenharmony_ci onInit() { 155e41f4b71Sopenharmony_ci for(var i = 0; i < 10; i++) { 156e41f4b71Sopenharmony_ci var item = { url: "pages/card_transition/target_page/index", 157e41f4b71Sopenharmony_ci title: "this is title" + i, id: "item_" + i } 158e41f4b71Sopenharmony_ci this.list.push(item); 159e41f4b71Sopenharmony_ci } 160e41f4b71Sopenharmony_ci }, 161e41f4b71Sopenharmony_ci jumpPage(id, url) { 162e41f4b71Sopenharmony_ci var cardId = this.$element(id).ref; 163e41f4b71Sopenharmony_ci router.push({ url: url, params : { ref : cardId } }); 164e41f4b71Sopenharmony_ci } 165e41f4b71Sopenharmony_ci} 166e41f4b71Sopenharmony_ci``` 167e41f4b71Sopenharmony_ci 168e41f4b71Sopenharmony_ci```css 169e41f4b71Sopenharmony_ci/* xxx.css */ 170e41f4b71Sopenharmony_ci.container { 171e41f4b71Sopenharmony_ci width: 100%; 172e41f4b71Sopenharmony_ci height: 100%; 173e41f4b71Sopenharmony_ci flex-direction: column; 174e41f4b71Sopenharmony_ci align-items: center; 175e41f4b71Sopenharmony_ci background-color: #ABDAFF; 176e41f4b71Sopenharmony_ci} 177e41f4b71Sopenharmony_ci.item { 178e41f4b71Sopenharmony_ci height: 80px; 179e41f4b71Sopenharmony_ci background-color: #FAFAFA; 180e41f4b71Sopenharmony_ci margin-top: 2px; 181e41f4b71Sopenharmony_ci} 182e41f4b71Sopenharmony_ci.outer { 183e41f4b71Sopenharmony_ci width: 300px; 184e41f4b71Sopenharmony_ci height: 100px; 185e41f4b71Sopenharmony_ci align-items: flex-end; 186e41f4b71Sopenharmony_ci transition-effect: unfold; 187e41f4b71Sopenharmony_ci} 188e41f4b71Sopenharmony_ci``` 189e41f4b71Sopenharmony_ci 190e41f4b71Sopenharmony_ci```html 191e41f4b71Sopenharmony_ci<!-- target_page --> 192e41f4b71Sopenharmony_ci<!-- xxx.hml --> 193e41f4b71Sopenharmony_ci<div class="container"> 194e41f4b71Sopenharmony_ci <div class="div"> 195e41f4b71Sopenharmony_ci <text style="font-size: 30px">this is detail</text> 196e41f4b71Sopenharmony_ci </div> 197e41f4b71Sopenharmony_ci</div> 198e41f4b71Sopenharmony_ci``` 199e41f4b71Sopenharmony_ci 200e41f4b71Sopenharmony_ci```css 201e41f4b71Sopenharmony_ci/* xxx.css */ 202e41f4b71Sopenharmony_ci.container { 203e41f4b71Sopenharmony_ci width: 100%; 204e41f4b71Sopenharmony_ci height: 100%; 205e41f4b71Sopenharmony_ci flex-direction: column; 206e41f4b71Sopenharmony_ci align-items: center; 207e41f4b71Sopenharmony_ci background-color: #EBFFD7; 208e41f4b71Sopenharmony_ci} 209e41f4b71Sopenharmony_ci.div { 210e41f4b71Sopenharmony_ci height: 600px; 211e41f4b71Sopenharmony_ci flex-direction: column; 212e41f4b71Sopenharmony_ci align-items: center; 213e41f4b71Sopenharmony_ci justify-content: center; 214e41f4b71Sopenharmony_ci} 215e41f4b71Sopenharmony_ci``` 216e41f4b71Sopenharmony_ci 217e41f4b71Sopenharmony_ci 218e41f4b71Sopenharmony_ci 219e41f4b71Sopenharmony_ci 220e41f4b71Sopenharmony_ci## Page Transition 221e41f4b71Sopenharmony_ci 222e41f4b71Sopenharmony_ci 223e41f4b71Sopenharmony_ci### Styles 224e41f4b71Sopenharmony_ci 225e41f4b71Sopenharmony_ci| Name | Type | Default Value | Description | 226e41f4b71Sopenharmony_ci| -------------------------- | ------ | ------------- | ---------------------------------------- | 227e41f4b71Sopenharmony_ci| transition-enter | string | - | Works with **@keyframes** and supports transform and opacity animations. For details, see [Attributes available for the @keyframes rule](js-components-common-animation.md).| 228e41f4b71Sopenharmony_ci| transition-exit | string | - | Works with **@keyframes** and supports transform and opacity animations. For details, see [Attributes available for the @keyframes rule](js-components-common-animation.md).| 229e41f4b71Sopenharmony_ci| transition-duration | string | Follows the default page transition time of the device| The unit can be s|or ms. The default unit is ms. If no value is specified, the default value is used.| 230e41f4b71Sopenharmony_ci| transition-timing-function | string | friction | Speed curve of the transition animation, which makes the animation more fluent. For details, see the description of **animation-timing-function **in [Animation Styles](js-components-common-animation.md).| 231e41f4b71Sopenharmony_ci 232e41f4b71Sopenharmony_ci 233e41f4b71Sopenharmony_ci### Important Notes 234e41f4b71Sopenharmony_ci 235e41f4b71Sopenharmony_ci1. When defining a custom transition, set the page background color to an opaque color. Otherwise, the transition effect can be harsh. 236e41f4b71Sopenharmony_ci 237e41f4b71Sopenharmony_ci2. The **transition-enter** and **transition-exit** styles can be configured separately. The default settings are used if they are not configured. 238e41f4b71Sopenharmony_ci 239e41f4b71Sopenharmony_ci3. Notes on the **transition-enter** and **transition-exit** styles: 240e41f4b71Sopenharmony_ci 241e41f4b71Sopenharmony_ci a. In the push scenario, the animation defined by **transition-enter** is used for entering the **Page2.js** in the page stack; the animation defined by **transition-exit** is used for entering the **Page1.js** in the page stack. 242e41f4b71Sopenharmony_ci  243e41f4b71Sopenharmony_ci 244e41f4b71Sopenharmony_ci b. In the back scenario, the animation defined by **transition-enter** is used for exiting the **Page2.js** in the page stack, with the animation played in reverse sequence; the animation defined by **transition-exit** is used for exiting the **Page1.js** in the page stack, with the animation played in reverse sequence. 245e41f4b71Sopenharmony_ci  246e41f4b71Sopenharmony_ci 247e41f4b71Sopenharmony_ci### Example 248e41f4b71Sopenharmony_ci 249e41f4b71Sopenharmony_ci**Page1** has an opaque box. When you tap the box, **Page2** is displayed. When you tap the box on **Page2**, **Page1** is displayed. 250e41f4b71Sopenharmony_ci 251e41f4b71Sopenharmony_ci1. Page1 252e41f4b71Sopenharmony_ci 253e41f4b71Sopenharmony_ci ```html 254e41f4b71Sopenharmony_ci <!-- xxx.hml --> 255e41f4b71Sopenharmony_ci <div class="container"> 256e41f4b71Sopenharmony_ci <text>index</text> 257e41f4b71Sopenharmony_ci <div class="move_page" onclick="jump"></div> 258e41f4b71Sopenharmony_ci </div> 259e41f4b71Sopenharmony_ci ``` 260e41f4b71Sopenharmony_ci 261e41f4b71Sopenharmony_ci ```js 262e41f4b71Sopenharmony_ci // xxx.js 263e41f4b71Sopenharmony_ci import router from '@ohos.router'; 264e41f4b71Sopenharmony_ci export default { 265e41f4b71Sopenharmony_ci data: { 266e41f4b71Sopenharmony_ci 267e41f4b71Sopenharmony_ci }, 268e41f4b71Sopenharmony_ci jump() { 269e41f4b71Sopenharmony_ci router.push({ 270e41f4b71Sopenharmony_ci url:'pages/transition2/transition2' 271e41f4b71Sopenharmony_ci }) 272e41f4b71Sopenharmony_ci } 273e41f4b71Sopenharmony_ci } 274e41f4b71Sopenharmony_ci ``` 275e41f4b71Sopenharmony_ci 276e41f4b71Sopenharmony_ci ```css 277e41f4b71Sopenharmony_ci /* xxx.css */ 278e41f4b71Sopenharmony_ci .container { 279e41f4b71Sopenharmony_ci flex-direction: column; 280e41f4b71Sopenharmony_ci justify-content: center; 281e41f4b71Sopenharmony_ci align-items: center; 282e41f4b71Sopenharmony_ci width: 100%; 283e41f4b71Sopenharmony_ci height: 100%; 284e41f4b71Sopenharmony_ci } 285e41f4b71Sopenharmony_ci .move_page { 286e41f4b71Sopenharmony_ci width: 100px; 287e41f4b71Sopenharmony_ci height: 100px; 288e41f4b71Sopenharmony_ci background-color: #72d3fa; 289e41f4b71Sopenharmony_ci transition-enter: go_page; 290e41f4b71Sopenharmony_ci transition-exit: exit_page; 291e41f4b71Sopenharmony_ci transition-duration: 5s; 292e41f4b71Sopenharmony_ci transition-timing-function: friction; 293e41f4b71Sopenharmony_ci } 294e41f4b71Sopenharmony_ci 295e41f4b71Sopenharmony_ci @keyframes go_page { 296e41f4b71Sopenharmony_ci from { 297e41f4b71Sopenharmony_ci opacity: 0; 298e41f4b71Sopenharmony_ci transform: translate(0px) rotate(60deg) scale(1.0); 299e41f4b71Sopenharmony_ci } 300e41f4b71Sopenharmony_ci 301e41f4b71Sopenharmony_ci to { 302e41f4b71Sopenharmony_ci opacity: 1; 303e41f4b71Sopenharmony_ci transform: translate(100px) rotate(360deg) scale(1.0); 304e41f4b71Sopenharmony_ci } 305e41f4b71Sopenharmony_ci } 306e41f4b71Sopenharmony_ci @keyframes exit_page { 307e41f4b71Sopenharmony_ci from { 308e41f4b71Sopenharmony_ci opacity: 1; 309e41f4b71Sopenharmony_ci transform: translate(200px) rotate(60deg) scale(2); 310e41f4b71Sopenharmony_ci } 311e41f4b71Sopenharmony_ci 312e41f4b71Sopenharmony_ci to { 313e41f4b71Sopenharmony_ci opacity: 0; 314e41f4b71Sopenharmony_ci transform: translate(200px) rotate(360deg) scale(2); 315e41f4b71Sopenharmony_ci } 316e41f4b71Sopenharmony_ci } 317e41f4b71Sopenharmony_ci ``` 318e41f4b71Sopenharmony_ci 319e41f4b71Sopenharmony_ci 320e41f4b71Sopenharmony_ci2. Page2 321e41f4b71Sopenharmony_ci 322e41f4b71Sopenharmony_ci ```html 323e41f4b71Sopenharmony_ci <!-- xxx.hml --> 324e41f4b71Sopenharmony_ci <div class="container"> 325e41f4b71Sopenharmony_ci <text>transition</text> 326e41f4b71Sopenharmony_ci <div class="move_page" onclick="jumpBack"></div> 327e41f4b71Sopenharmony_ci </div> 328e41f4b71Sopenharmony_ci ``` 329e41f4b71Sopenharmony_ci 330e41f4b71Sopenharmony_ci ```js 331e41f4b71Sopenharmony_ci // xxx.js 332e41f4b71Sopenharmony_ci import router from '@ohos.router'; 333e41f4b71Sopenharmony_ci export default { 334e41f4b71Sopenharmony_ci data: { 335e41f4b71Sopenharmony_ci 336e41f4b71Sopenharmony_ci }, 337e41f4b71Sopenharmony_ci jumpBack() { 338e41f4b71Sopenharmony_ci router.back() 339e41f4b71Sopenharmony_ci } 340e41f4b71Sopenharmony_ci } 341e41f4b71Sopenharmony_ci ``` 342e41f4b71Sopenharmony_ci 343e41f4b71Sopenharmony_ci ```css 344e41f4b71Sopenharmony_ci /* xxx.css */ 345e41f4b71Sopenharmony_ci .container { 346e41f4b71Sopenharmony_ci flex-direction: column; 347e41f4b71Sopenharmony_ci justify-content: center; 348e41f4b71Sopenharmony_ci align-items: center; 349e41f4b71Sopenharmony_ci width: 100%; 350e41f4b71Sopenharmony_ci height: 100%; 351e41f4b71Sopenharmony_ci } 352e41f4b71Sopenharmony_ci 353e41f4b71Sopenharmony_ci .move_page { 354e41f4b71Sopenharmony_ci width: 100px; 355e41f4b71Sopenharmony_ci height: 100px; 356e41f4b71Sopenharmony_ci background-color: #f172fa; 357e41f4b71Sopenharmony_ci transition-enter: go_page; 358e41f4b71Sopenharmony_ci transition-exit: exit_page; 359e41f4b71Sopenharmony_ci transition-duration: 5s; 360e41f4b71Sopenharmony_ci transition-timing-function: ease; 361e41f4b71Sopenharmony_ci } 362e41f4b71Sopenharmony_ci 363e41f4b71Sopenharmony_ci @keyframes go_page { 364e41f4b71Sopenharmony_ci from { 365e41f4b71Sopenharmony_ci opacity: 0; 366e41f4b71Sopenharmony_ci transform:translate(100px) rotate(0deg) scale(1.0); 367e41f4b71Sopenharmony_ci } 368e41f4b71Sopenharmony_ci to { 369e41f4b71Sopenharmony_ci opacity: 1; 370e41f4b71Sopenharmony_ci transform:translate(100px) rotate(180deg) scale(2.0); 371e41f4b71Sopenharmony_ci } 372e41f4b71Sopenharmony_ci } 373e41f4b71Sopenharmony_ci 374e41f4b71Sopenharmony_ci @keyframes exit_page { 375e41f4b71Sopenharmony_ci from { 376e41f4b71Sopenharmony_ci opacity: 1; 377e41f4b71Sopenharmony_ci transform: translate(0px) rotate(60deg) scale(1); 378e41f4b71Sopenharmony_ci } 379e41f4b71Sopenharmony_ci to { 380e41f4b71Sopenharmony_ci opacity: 0; 381e41f4b71Sopenharmony_ci transform: translate(0px) rotate(360deg) scale(1); 382e41f4b71Sopenharmony_ci } 383e41f4b71Sopenharmony_ci } 384e41f4b71Sopenharmony_ci ``` 385e41f4b71Sopenharmony_ci 386e41f4b71Sopenharmony_ci  387