js-components-common-transition.md 10.8 KB
Newer Older
Z
zengyawen 已提交
1 2
# 转场样式

H
geshi  
HelloCrease 已提交
3 4
>  **说明:**
>  从API version 4开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
Z
zengyawen 已提交
5 6 7 8 9 10

## 共享元素转场


### 属性

H
geshi  
HelloCrease 已提交
11 12 13
| 名称      | 类型     | 默认值  | 描述                                       |
| ------- | ------ | ---- | ---------------------------------------- |
| shareid | string | 无    | 进行共享元素转场时使用,若不配置,则转场样式不生效。共享元素转场当前支持的组件:list-item、image、text、button、label。 |
Z
zengyawen 已提交
14 15 16 17


### 样式

H
geshi  
HelloCrease 已提交
18 19 20 21
| 名称                                | 类型     | 默认值      | 描述                                       |
| --------------------------------- | ------ | -------- | ---------------------------------------- |
| shared-transition-effect          | string | exchange | 配置共享元素转场时的入场样式。<br/>-&nbsp;exchange(默认值):源页面元素移动到目的页元素位置,并进行适当缩放。<br/>-&nbsp;static:目的页元素位置不变,用户可配置透明度动画。当前仅跳转目标页配置的static效果生效。 |
| shared-transition-name            | string | -        | 转场时,目的页配置的样式优先生效。该样式用于配置共享元素的动画效果,一个由@keyframes定义的动画序列,支持transform和透明度动画。若共享元素效果与自定义的动画冲突,以自定义动画为准。 |
Z
zengyawen 已提交
22 23 24 25
| shared-transition-timing-function | string | friction | 转场时,目的页配置的样式优先生效。该属性定义了共享元素转场时的差值曲线。若不配置,默认使用friction曲线。 |


### 注意事项
Z
zengyawen 已提交
26

Z
zengyawen 已提交
27
1. 若同时配置了共享元素转场和自定义页面转场样式,页面转场效果以自定义效果为准。
Z
zengyawen 已提交
28

Z
zengyawen 已提交
29
2. 共享元素的exchange效果类似下图。
Z
zengyawen 已提交
30

Z
zengyawen 已提交
31 32
**图1** 共享元素转场默认效果
![zh-cn_image_0000001238424309](figures/zh-cn_image_0000001238424309.png)
Z
zengyawen 已提交
33 34 35 36 37

3. 共享元素动画对元素的边框、背景色不生效。

4. 共享元素转场时,由于页面元素会被隐藏,故页面元素配置的动画样式/动画方法失效。

Z
zengyawen 已提交
38
5. 动态修改shareid<sup>5+</sup>:组件A的shareid被组件B的shareid覆盖,则组件A的共享元素效果失效,即使组件B的shareid被修改,此时组件A的共享元素效果也不会恢复。
Z
zengyawen 已提交
39

Z
zengyawen 已提交
40 41

### 示例
Z
zengyawen 已提交
42 43 44

PageA跳转到PageB,跳转的共享元素为image, shareid为“shareImage”。

H
geshi  
HelloCrease 已提交
45
```html
Z
zengyawen 已提交
46 47 48
<!-- PageA -->
<!-- xxx.hml -->
<div>
Z
zengyawen 已提交
49 50
  <list>
    <list-item type="description">
Z
zengyawen 已提交
51
      <image src="item.jpg" shareid="shareImage" onclick="jump" class="shared-transition-style"></image>
G
gmy 已提交
52 53
    </list-item>
    <list-item>
Z
zengyawen 已提交
54
      <text onclick="jump">Click on picture to Jump to ths details</text>
Z
zengyawen 已提交
55 56
    </list-item>
  </list>
Z
zengyawen 已提交
57 58 59
</div>
```

H
geshi  
HelloCrease 已提交
60
```js
Z
zengyawen 已提交
61 62 63 64 65
// xxx.js
import router from '@system.router';
export default {
  jump() {
    router.push({
G
gmy 已提交
66 67
      // 路径要与config.json配置里面的相同
      uri: 'pages/detailpage',
Z
zengyawen 已提交
68 69 70 71 72
    });
  },
}
```

H
geshi  
HelloCrease 已提交
73
```css
Z
zengyawen 已提交
74 75 76 77 78 79 80 81 82 83 84
/* xxx.css */
.shared-transition-style {
  shared-transition-effect: exchange;
  shared-transition-name: shared-transition;
}
@keyframes shared-transition {
  from { opacity: 0; }
  to { opacity: 1; }
}
```

H
geshi  
HelloCrease 已提交
85
```html
Z
zengyawen 已提交
86 87 88 89 90 91 92
<!-- PageB -->
<!-- xxx.hml -->
<div>
  <image src="itemDetail.jpg" shareid="shareImage" onclick="jumpBack" class="shared-transition-style"></image>
</div>
```

H
geshi  
HelloCrease 已提交
93
```js
Z
zengyawen 已提交
94 95 96 97 98 99 100 101 102
// xxx.js
import router from '@system.router';
export default {
  jumpBack() {
    router.back();
  },
}
```

H
geshi  
HelloCrease 已提交
103
```css
Z
zengyawen 已提交
104 105 106 107 108 109 110 111 112 113 114
/* xxx.css */
.shared-transition-style {
  shared-transition-effect: exchange;
  shared-transition-name: shared-transition;
}
@keyframes shared-transition {
  from { opacity: 0; }
  to { opacity: 1; }
}
```

Z
zengyawen 已提交
115 116 117

## 卡片转场样式

H
geshi  
HelloCrease 已提交
118 119
>  **说明:**
>  卡片转场无法和其他转场(包括共享元素转场和自定义转场)共同使用。
Z
zengyawen 已提交
120 121 122 123


### 样式

H
geshi  
HelloCrease 已提交
124 125 126
| 名称                | 类型     | 默认值  | 描述                                       |
| ----------------- | ------ | ---- | ---------------------------------------- |
| transition-effect | string | -    | 用于配置当前页面中的某个组件在卡片转场过程中是否进行转场动效,当前支持如下配置:<br/>-&nbsp;unfold:配置这个属性的组件,如在卡片的上方,则向上移动一个卡片的高度,如在卡片的下方,则向下移动一个卡片的高度。<br/>-&nbsp;none:转场过程中没有动效。 |
Z
zengyawen 已提交
127 128 129 130 131


### 示例

source_page包含顶部内容以及卡片列表,点击卡片可以跳转到target_page。
Z
zengyawen 已提交
132

H
geshi  
HelloCrease 已提交
133
```html
Z
zengyawen 已提交
134 135 136 137 138 139 140 141 142 143 144 145 146 147
<!-- source_page -->
<!-- xxx.hml -->
<div class="container">
  <div class="outer">
    <text style="font-size: 23px; margin-bottom: 20px" >MAIN TITLE</text>
  </div>
  <list style="width:340px;height:600px;flex-direction:column;justify-content:center;align-items:center">
    <list-item type="listItem" class="item" card="true" for="list" id="{{$item.id}}" onclick="jumpPage({{$item.id}}, {{$item.uri}})">
      <text style="margin-left: 10px; font-size: 23px;">{{$item.title}}</text>
    </list-item>
  </list>
</div>
```

H
geshi  
HelloCrease 已提交
148
```js
Z
zengyawen 已提交
149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166
// xxx.js
import router from '@system.router'
export default {
  data: { list: [] },
  onInit() {
    for(var i = 0; i < 10; i++) {
      var item = { uri: "pages/card_transition/target_page/index", 
                   title: "this is title" + i, id: "item_" + i }
      this.list.push(item);
    }
  },
  jumpPage(id, uri) {
    var cardId = this.$element(id).ref;
    router.push({ uri: uri, params : { ref : cardId } });
  }
}
```

H
geshi  
HelloCrease 已提交
167
```css
Z
zengyawen 已提交
168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186
/* xxx.css */
.container {
  flex-direction: column;
  align-items: center;
  background-color: #ABDAFF;
}
.item {
  height: 80px;
  background-color: #FAFAFA;
  margin-top: 2px;
}
.outer {
  width: 300px;
  height: 100px;
  align-items: flex-end;
  transition-effect: unfold;
}
```

H
geshi  
HelloCrease 已提交
187
```html
Z
zengyawen 已提交
188 189 190 191 192 193 194 195 196
<!-- target_page -->
<!-- xxx.hml -->
<div class="container">
  <div class="div">
    <text style="font-size: 30px">this is detail</text>
  </div>
</div>
```

H
geshi  
HelloCrease 已提交
197
```css
Z
zengyawen 已提交
198 199 200 201 202 203 204 205 206 207 208 209 210 211
/* xxx.css */
.container {
  flex-direction: column;
  align-items: center;
  background-color: #EBFFD7;
}
.div {
  height: 600px;
  flex-direction: column;
  align-items: center;
  justify-content: center;
}
```

Z
zengyawen 已提交
212 213 214 215 216 217 218 219
![zh-cn_image_0000001193544358](figures/zh-cn_image_0000001193544358.gif)


## 页面转场样式


### 样式

H
geshi  
HelloCrease 已提交
220 221 222 223 224 225
| 名称                         | 类型     | 默认值           | 描述                                       |
| -------------------------- | ------ | ------------- | ---------------------------------------- |
| transition-enter           | string | -             | 与@keyframes配套使用,支持transform和透明度动画,详见[动画样式 表 @keyframes属性说明](../arkui-js/js-components-common-animation.md)。 |
| transition-exit            | string | -             | 与\@keyframes配套使用,支持transform和透明度动画,详见[动画样式 表 @keyframes属性说明](../arkui-js/js-components-common-animation.md)。 |
| transition-duration        | string | 跟随设备默认的页面转场时间 | 支持的单位为[s(秒)\|ms(毫秒)&nbsp;],默认单位为ms,未配置时使用系统默认值。 |
| transition-timing-function | string | friction      | 描述转场动画执行的速度曲线,用于使转场更为平滑。详细参数见[动画样式](../arkui-js/js-components-common-animation.md)中“animation-timing-function”有效值说明。 |
Z
zengyawen 已提交
226 227 228 229 230 231 232


### 注意事项

1. 配置自定义转场时,建议配置页面背景色为不透明颜色,否则在转场过程中可能会出现衔接不自然的现象。

2. transition-enter和transition-exit可单独配置,没有配置时使用系统默认的参数。
Z
zengyawen 已提交
233

Z
zengyawen 已提交
234
3. transition-enter/transition-exit说明如下:
Z
zengyawen 已提交
235

Z
zengyawen 已提交
236 237
   a. push场景下:进入页面栈的Page2.js应用transition-enter描述的动画配置;进入页面栈第二位置的Page1.js应用transition-exit描述的动画配置。
   ![zh-cn_image_0000001193704354](figures/zh-cn_image_0000001193704354.png)
Z
zengyawen 已提交
238

Z
zengyawen 已提交
239 240
   b. back场景下:退出页面栈的Page2.js应用transition-enter描述的动画配置,并进行倒播;从页面栈第二位置进入栈顶位置的Page1.js应用transition-exit描述的动画配置,并进行倒播。
   ![zh-cn_image_0000001238184345](figures/zh-cn_image_0000001238184345.png)
Z
zengyawen 已提交
241 242 243 244 245 246 247

### 示例

Page1有一个不透明盒子,点击盒子会跳转到Page2,当点击Page2中的盒子,会回退到Page1页面。

1. Page1

H
geshi  
HelloCrease 已提交
248
   ```html
Z
zengyawen 已提交
249 250 251 252 253 254 255
   <!-- xxx.hml -->
   <div class="container">
       <text>index</text>
       <div class="move_page" onclick="jump"></div>
   </div>
   ```

H
geshi  
HelloCrease 已提交
256 257
   ```css
   // xxx.js
Z
zengyawen 已提交
258 259 260
   import router from '@system.router';
   export default {
       data: {
H
geshi  
HelloCrease 已提交
261

Z
zengyawen 已提交
262 263 264 265 266 267 268 269 270
       },
       jump() {
           router.push({
               uri:'pages/transition2/transition2'
           })
       }
   }
   ```

H
geshi  
HelloCrease 已提交
271 272
   ```css
   /* xxx.css */
Z
zengyawen 已提交
273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288
   .container {
       flex-direction: column;
       justify-content: center;
       align-items: center;
       width: 100%;
       height: 100%;
   }
   .move_page {
       width: 100px;
       height: 100px;
       background-color: #72d3fa;
       transition-enter: go_page;
       transition-exit: exit_page;
       transition-duration: 5s;
       transition-timing-function: friction;
   }
H
geshi  
HelloCrease 已提交
289

Z
zengyawen 已提交
290 291 292 293 294
   @keyframes go_page {
       from {
           opacity: 0;
           transform: translate(0px) rotate(60deg) scale(1.0);
       }
H
geshi  
HelloCrease 已提交
295

Z
zengyawen 已提交
296 297 298 299 300 301 302 303 304 305
       to {
           opacity: 1;
           transform: translate(100px) rotate(360deg) scale(1.0);
       }
   }
   @keyframes exit_page {
       from {
           opacity: 1;
           transform: translate(200px) rotate(60deg) scale(2);
       }
H
geshi  
HelloCrease 已提交
306

Z
zengyawen 已提交
307 308 309 310 311 312 313 314 315 316
       to {
           opacity: 0;
           transform: translate(200px) rotate(360deg) scale(2);
       }
   }
   ```


2. Page2

H
geshi  
HelloCrease 已提交
317
   ```html
Z
zengyawen 已提交
318 319 320 321
   <!-- xxx.hml -->
   <div class="container">
       <text>transition</text>
       <div class="move_page" onclick="jumpBack"></div>
Y
yamila 已提交
322
   </div>
Z
zengyawen 已提交
323 324
   ```

H
geshi  
HelloCrease 已提交
325 326
   ```js
   // xxx.js
Z
zengyawen 已提交
327 328 329
   import router from '@system.router';
   export default {
       data: {
H
geshi  
HelloCrease 已提交
330

Z
zengyawen 已提交
331 332 333 334 335 336 337
       },
       jumpBack() {
           router.back()
       }
   }
   ```

H
geshi  
HelloCrease 已提交
338 339
   ```css
   /* xxx.css */
Z
zengyawen 已提交
340 341 342 343 344 345 346
   .container {
       flex-direction: column;
       justify-content: center;
       align-items: center;
       width: 100%;
       height: 100%;
   }
H
geshi  
HelloCrease 已提交
347

Z
zengyawen 已提交
348 349 350 351 352 353 354 355 356
   .move_page {
       width: 100px;
       height: 100px;
       background-color: #f172fa;
       transition-enter: go_page;
       transition-exit: exit_page;
       transition-duration: 5s;
       transition-timing-function: ease;
   }
H
geshi  
HelloCrease 已提交
357

Z
zengyawen 已提交
358 359 360 361 362 363 364 365 366 367
   @keyframes go_page {
       from {
           opacity: 0;
           transform:translate(100px) rotate(0deg) scale(1.0);
       }
       to {
           opacity: 1;
           transform:translate(100px) rotate(180deg) scale(2.0);
       }
   }
H
geshi  
HelloCrease 已提交
368

Z
zengyawen 已提交
369 370 371 372 373 374 375 376 377 378 379
   @keyframes exit_page {
       from {
           opacity: 1;
           transform: translate(0px) rotate(60deg) scale(1);
       }
       to {
           opacity: 0;
           transform: translate(0px) rotate(360deg) scale(1);
       }
   }
   ```
H
geshi  
HelloCrease 已提交
380

Z
zengyawen 已提交
381
   ![transition](figures/transition.gif)