ui-js-animate-transform.md 13.2 KB
Newer Older
Z
zengyawen 已提交
1
# transform样式动画
Z
zengyawen 已提交
2 3 4 5

设置transform属性对组件进行旋转、缩放、移动和倾斜。


Z
zengyawen 已提交
6 7
## 设置静态动画

8
创建一个正方形并旋转90°变成菱形,并用下方的长方形把菱形下半部分遮盖形成屋顶,设置长方形translate属性值为(150px,-150px)确定坐标位置形成门,再使用position属性使横纵线跟随父组件(正方形)移动到指定坐标位置,接着设置scale属性使父子组件一起变大形成窗户大小,最后使用skewX属性使组件倾斜后设置坐标translate(200px,-710px)得到烟囱。
Z
zengyawen 已提交
9

H
HelloCrease 已提交
10
```html
Z
zengyawen 已提交
11 12 13 14 15 16 17 18 19 20 21 22 23 24
<!-- xxx.hml -->
<div class="container">
  <div class="top"></div>
  <div class="content"></div>
  <div class="door"></div>
  <!-- 窗户 -->
  <div class="window">
    <div class="horizontal"></div>
    <div class="vertical"></div>
  </div>
  <div class="chimney"></div>
</div>
```

H
HelloCrease 已提交
25
```css
Z
zengyawen 已提交
26 27
/* xxx.css */
.container {
W
wangshuainan1 已提交
28 29
  width:100%;
  height:100%;
Z
zengyawen 已提交
30 31 32 33 34 35 36 37 38 39 40
  background-color:#F1F3F5;
  align-items: center;
  flex-direction: column;
}
.top{
  z-index: -1;
  position: absolute;
  width: 428px;
  height: 428px;
  background-color: #860303;
  transform: rotate(45deg);
H
HelloCrease 已提交
41 42
  margin-top: 284px;
  margin-left: 148px;
Z
zengyawen 已提交
43 44 45 46 47 48 49 50 51 52
}
.content{
  margin-top: 500px;
  width: 600px;
  height: 400px;
  background-color: white;
  border:  1px solid black;
}
.door{
  width: 100px;
H
HelloCrease 已提交
53
  height: 135px;
Z
zengyawen 已提交
54
  background-color: #1033d9;
H
HelloCrease 已提交
55
  transform: translate(150px,-137px);
Z
zengyawen 已提交
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
}
.window{
  z-index: 1;
  position: relative;   
  width: 100px;
  height: 100px;
  background-color: white;
  border: 1px solid black;
  transform: translate(-150px,-400px) scale(1.5);
}
/* 窗户的横轴 */
.horizontal{
  position: absolute;
  top: 50%;
  width: 100px;
  height: 5px;
  background-color: black;
}
/* 窗户的纵轴 */
.vertical{
  position: absolute;
  left: 50%;
  width: 5px;
  height: 100px;
  background-color: black;
}
.chimney{
  z-index: -2;
  width: 40px;
  height: 100px;
  border-radius: 15px;
  background-color: #9a7404;
H
HelloCrease 已提交
88
  transform: translate(200px,-710px) skewX(-5deg);
Z
zengyawen 已提交
89 90 91
}
```

Z
zengyawen 已提交
92 93
![zh-cn_image_0000001220634677](figures/zh-cn_image_0000001220634677.png)

Z
zengyawen 已提交
94

Z
zengyawen 已提交
95
## 设置平移动画
Z
zengyawen 已提交
96 97 98

小球下降动画,改变小球的Y轴坐标实现小球下落,在下一段是时间内减小Y轴坐标实现小球回弹,让每次回弹的高度逐次减小直至回弹高度为0,就模拟出了小球下降的动画。

H
HelloCrease 已提交
99
```html
Z
zengyawen 已提交
100 101 102 103 104 105 106
<!-- xxx.hml -->
<div class="container">
  <div class="circle"></div>
  <div class="flower"></div>
</div>
```

H
HelloCrease 已提交
107
```css
Z
zengyawen 已提交
108 109
/* xxx.css */
.container {
W
wangshuainan1 已提交
110 111
  width:100%;
  height:100%;
Z
zengyawen 已提交
112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170
  background-color:#F1F3F5;
  display: flex;
  justify-content: center;
}
.circle{
  width: 100px;
  height: 100px;
  border-radius: 50px;
  background-color: red;
  /* forwards停在动画的最后一帧 */
  animation: down 3s fast-out-linear-in forwards;
}
.flower{
  position: fixed;
  width: 80%;
  margin-left: 10%;
  height: 5px;
  background-color: black;
  top: 1000px;
}
@keyframes down {
  0%{
    transform: translate(0px,0px);
  }
  /* 下落 */
  15%{
    transform: translate(10px,900px);
  }
  /* 开始回弹 */
  25%{
    transform: translate(20px,500px);
  }
  /* 下落 */
  35%{
    transform: translate(30px,900px);
  }
  /* 回弹 */
  45%{
    transform: translate(40px,700px);
  }
  55%{
    transform: translate(50px,900px);
  }
  65%{
    transform: translate(60px,800px);
  }
  80%{
    transform: translate(70px,900px);
  }
  90%{
    transform: translate(80px,850px);
  }
  /* 停止 */
  100%{
    transform: translate(90px,900px);
  }
}
```

Z
zengyawen 已提交
171 172
![zh-cn_image_0000001174756438](figures/zh-cn_image_0000001174756438.gif)

Z
zengyawen 已提交
173

Z
zengyawen 已提交
174
## 设置旋转动画
Z
zengyawen 已提交
175 176 177

设置不同的原点位置(transform-origin)改变元素所围绕的旋转中心。rotate3d属性前三个参数值分别为X轴、Y轴、Z轴的旋转向量,第四个值为旋转角度,旋转向角度可为负值,负值则代表旋转方向为逆时针方向。

H
HelloCrease 已提交
178
```html
Z
zengyawen 已提交
179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196
<!-- xxx.hml -->
<div class="container">
  <div class="rotate">
    <div class="rect rect1"></div>
    <div class="rect rect2"></div>
    <div class="rect rect3"></div>
  </div>
  <!-- 3d属性 -->
  <div class="rotate3d">
    <div class="content">
        <div class="rect4"></div>
        <div class="rect5"> </div>
    </div>
    <div class="mouse"></div>
  </div>
</div>
```

H
HelloCrease 已提交
197
```css
Z
zengyawen 已提交
198 199
/* xxx.css */
.container {
H
HelloCrease 已提交
200 201 202 203 204 205 206
    flex-direction: column;
    background-color:#F1F3F5;
    display: flex;
    align-items: center;
    justify-content: center;
    width: 100%;
    height: 100%;
Z
zengyawen 已提交
207
}
L
luoying_ace_admin 已提交
208
.rect {
H
HelloCrease 已提交
209 210 211 212
    width: 100px;
    height: 100px;
    animation: rotate 3s infinite;
    margin-left: 30px;
Z
zengyawen 已提交
213
}
L
luoying_ace_admin 已提交
214
.rect1 {
H
HelloCrease 已提交
215
    background-color: #f76160;
Z
zengyawen 已提交
216
}
L
luoying_ace_admin 已提交
217
.rect2 {
H
HelloCrease 已提交
218 219 220
    background-color: #60f76f;
/* 改变原点位置*/
    transform-origin: 10% 10px;
Z
zengyawen 已提交
221
}
L
luoying_ace_admin 已提交
222
.rect3 {
H
HelloCrease 已提交
223 224 225
    background-color: #6081f7;
/*  改变原点位置*/
    transform-origin: right bottom;
Z
zengyawen 已提交
226 227
}
@keyframes rotate {
H
HelloCrease 已提交
228 229 230 231 232 233
    from {
        transform: rotate(0deg)
    }
    to {
        transform: rotate(360deg);
    }
Z
zengyawen 已提交
234 235
}
/* 3d示例样式 */
L
luoying_ace_admin 已提交
236
.rotate3d {
H
HelloCrease 已提交
237 238 239 240 241 242 243 244 245
    margin-top: 150px;
    flex-direction: column;
    background-color:#F1F3F5;
    display: flex;
    align-items: center;
    width: 80%;
    height: 600px;
    border-radius: 300px;
    border: 1px solid #ec0808;
Z
zengyawen 已提交
246
}
L
luoying_ace_admin 已提交
247
.content {
H
HelloCrease 已提交
248 249 250 251
    padding-top: 150px;
    display: flex;
    align-items: center;
    justify-content: center;
Z
zengyawen 已提交
252 253
}
/* react4 react5 翻转形成眼睛 */
L
luoying_ace_admin 已提交
254
.rect4 {
H
HelloCrease 已提交
255 256 257 258
    width: 100px;
    height: 100px;
    animation: rotate3d1 1000ms infinite;
    background-color: darkmagenta;
Z
zengyawen 已提交
259
}
L
luoying_ace_admin 已提交
260
.rect5 {
H
HelloCrease 已提交
261 262 263 264 265
    width: 100px;
    height: 100px;
    animation: rotate3d1 1000ms infinite;
    margin-left: 100px;
    background-color: darkmagenta;
Z
zengyawen 已提交
266
}
L
luoying_ace_admin 已提交
267
.mouse {
H
HelloCrease 已提交
268 269 270 271 272 273
    margin-top: 150px;
    width: 200px;
    height: 100px;
    border-radius: 50px;
    border: 1px solid #e70303;
    animation: rotate3d2 1000ms infinite;
Z
zengyawen 已提交
274 275
}
/* 眼睛的动效 */
L
luoying_ace_admin 已提交
276
@keyframes rotate3d1 {
H
HelloCrease 已提交
277 278 279 280 281 282 283 284 285
    0% {
        transform:rotate3d(0,0,0,0deg)
    }
    50% {
        transform:rotate3d(20,20,20,360deg);
    }
    100% {
        transform:rotate3d(0,0,0,0deg);
    }
Z
zengyawen 已提交
286 287
}
/* 嘴的动效 */
L
luoying_ace_admin 已提交
288
@keyframes rotate3d2 {
H
HelloCrease 已提交
289 290 291 292 293 294 295 296 297 298 299 300
    0% {
        transform:rotate3d(0,0,0,0deg)
    }
    33% {
        transform:rotate3d(0,0,10,30deg);
    }
    66% {
        transform:rotate3d(0,0,10,-30deg);
    }
    100% {
        transform:rotate3d(0,0,0,0deg);
    }
Z
zengyawen 已提交
301 302 303
}
```

Z
zengyawen 已提交
304
![zh-cn_image_0000001220316305](figures/zh-cn_image_0000001220316305.gif)
Z
zengyawen 已提交
305

H
HelloCrease 已提交
306
> **说明:**
Z
zengyawen 已提交
307
> transform-origin变换对象的原点位置,如果仅设置一个值,另一个值为50%,若设置两个值第一个值表示X轴的位置,第二个值表示Y轴的位置。
Z
zengyawen 已提交
308

Z
zengyawen 已提交
309 310

## 设置缩放动画
Z
zengyawen 已提交
311 312 313 314 315

设置scale样式属性实现涟漪动画,先使用定位确定元素的位置,确定坐标后创建多个组件实现重合效果,再设置opacity属性改变组件不透明度实现组件隐藏与显示,同时设置scale值使组件可以一边放大一边隐藏,最后设置两个组件不同的动画执行时间,实现扩散的效果。

设置sacle3d中X轴、Y轴、Z轴的缩放参数实现动画。

H
HelloCrease 已提交
316
```html
Z
zengyawen 已提交
317 318 319 320 321 322 323 324 325 326 327 328 329 330
<!-- xxx.hml -->
<div class="container">
  <div class="circle">
    <text>ripple</text>
  </div>
  <div class="ripple"></div>
  <div class="ripple ripple2"></div>
  <!-- 3d -->
  <div class="content">
    <text>spring</text>
  </div>
</div>
```

H
HelloCrease 已提交
331
```css
Z
zengyawen 已提交
332 333
/* xxx.css */
.container {
H
HelloCrease 已提交
334 335 336 337
    flex-direction: column;
    background-color:#F1F3F5;
    width: 100%;
    position: relative;
Z
zengyawen 已提交
338 339
}
.circle{
H
HelloCrease 已提交
340 341 342 343 344 345 346
    margin-top: 400px;
    margin-left: 40%;
    width: 100px;
    height: 100px;
    border-radius: 50px;
    background-color: mediumpurple;
    z-index: 1;  position: absolute;
Z
zengyawen 已提交
347 348
}
.ripple{
H
HelloCrease 已提交
349 350 351 352 353 354 355 356
    margin-top: 400px;
    margin-left: 40%;
    position: absolute;  z-index: 0;
    width: 100px;
    height: 100px;
    border-radius: 50px;
    background-color: blueviolet;
    animation: ripple 5s infinite;
Z
zengyawen 已提交
357 358 359
}
/* 设置不同的动画时间 */
.ripple2{
H
HelloCrease 已提交
360
    animation-duration: 2.5s;
Z
zengyawen 已提交
361 362
}
@keyframes ripple{
H
HelloCrease 已提交
363 364 365 366 367 368 369 370 371 372 373 374
    0%{
        transform: scale(1);
        opacity: 0.5;
    }
    50%{
        transform: scale(3);
        opacity: 0;
    }
    100%{
        transform: scale(1);
        opacity: 0.5;
    }
Z
zengyawen 已提交
375 376
}
text{
H
HelloCrease 已提交
377 378 379 380
    color: white;
    text-align: center;
    height: 100%;
    width: 100%;
Z
zengyawen 已提交
381 382
}
.content {
H
HelloCrease 已提交
383 384 385 386 387 388 389
    margin-top: 700px;
    margin-left: 33%;
    width: 200px;
    height: 100px;
    animation:rubberBand 1s infinite;
    background-color: darkmagenta;
    position: absolute;
Z
zengyawen 已提交
390 391
}
@keyframes rubberBand {
H
HelloCrease 已提交
392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412
    0% {
        transform: scale3d(1, 1, 1);
    }
    30% {
        transform: scale3d(1.25, 0.75, 1.1);
    }
    40% {
        transform: scale3d(0.75, 1.25, 1.2);
    }
    50% {
        transform: scale3d(1.15, 0.85, 1.3);
    }
    65% {
        transform: scale3d(.95, 1.05, 1.2);
    }
    75% {
        transform: scale3d(1.05, .95, 1.1);
    }
    100%{
        transform: scale3d(1, 1, 1);
    }
Z
zengyawen 已提交
413 414 415
}
```

Z
zengyawen 已提交
416
![zh-cn_image_0000001220396251](figures/zh-cn_image_0000001220396251.gif)
Z
zengyawen 已提交
417

H
HelloCrease 已提交
418
> **说明:**
Z
zengyawen 已提交
419 420
> 设置transform属性值后,子元素会跟着父元素一起改变,若只改变父元素其他属性值时(如:height,width),子元素不会改变。

Z
zengyawen 已提交
421

Z
zengyawen 已提交
422
## 设置matrix属性
Z
zengyawen 已提交
423

Z
zengyawen 已提交
424
matrix是一个入参为六个值的矩阵,6个值分别代表:scaleX, skewY, skewX, scaleY, translateX, translateY。下面示例中设置 了matrix属性为matrix(1,0,0,1,0,200)使组件移动和倾斜。
Z
zengyawen 已提交
425

H
HelloCrease 已提交
426
```html
Z
zengyawen 已提交
427 428 429 430 431 432
<!-- xxx.hml -->
<div class="container">
  <div class="rect"> </div>
</div>
```

H
HelloCrease 已提交
433
```css
Z
zengyawen 已提交
434 435 436 437 438
/* xxx.css */
.container{
  background-color:#F1F3F5;
  display: flex;
  justify-content: center;
L
luoying_ace_admin 已提交
439 440
  width: 100%;
  height: 100%;
Z
zengyawen 已提交
441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463
}
.rect{
  width: 100px;
  height: 100px;
  background-color: red;
  animation: down 3s infinite forwards;
}
@keyframes down{
  0%{
    transform: matrix(1,0,0,1,0,0);
  }
  10%{
    transform: matrix(1,0,0,1,0,200);
  }
  60%{
    transform: matrix(2,1.5,1.5,2,0,700);
  }
  100%{
    transform: matrix(1,0,0,1,0,0);
  }
}
```

Z
zengyawen 已提交
464 465
![zh-cn_image_0000001174756580](figures/zh-cn_image_0000001174756580.gif)

Z
zengyawen 已提交
466

Z
zengyawen 已提交
467
## 整合transform属性
Z
zengyawen 已提交
468 469 470

transform可以设置多个值并且多个值可同时设置,下面案例中展示同时设置缩放(scale),平移(translate),旋转(rotate)属性时的动画效果。

H
HelloCrease 已提交
471
```html
Z
zengyawen 已提交
472 473 474 475 476 477 478 479 480 481
<!-- xxx.hml -->
<div class="container">
  <div class="rect1"></div>
  <div class="rect2"></div>
  <div class="rect3"></div>
  <div class="rect4"></div>
  <div class="rect5"></div>
</div>
```

H
HelloCrease 已提交
482
```css
Z
zengyawen 已提交
483 484
/* xxx.css */
.container{
H
HelloCrease 已提交
485 486 487 488 489
    width: 100%;
    height: 100%;
    flex-direction:column;
    background-color:#F1F3F5;
    padding:50px;
Z
zengyawen 已提交
490 491
}
.rect1{
H
HelloCrease 已提交
492 493 494 495
    width: 100px;
    height: 100px;
    background-color: red;
    animation: change1 3s infinite forwards;
Z
zengyawen 已提交
496 497
}
.rect2{
H
HelloCrease 已提交
498 499 500 501 502
    margin-top: 50px;
    width: 100px;
    height: 100px;
    background-color: darkblue;
    animation: change2 3s infinite forwards;
Z
zengyawen 已提交
503 504
}
.rect3{
H
HelloCrease 已提交
505 506 507 508 509
    margin-top: 50px;
    width: 100px;
    height: 100px;
    background-color: darkblue;
    animation: change3 3s infinite;
Z
zengyawen 已提交
510 511
}
.rect4{
H
HelloCrease 已提交
512 513 514 515 516 517 518
    align-self: center;
    margin-left: 50px;
    margin-top: 200px;
    width: 100px;
    height: 100px;
    background-color: darkmagenta;
    animation: change4 3s infinite;
Z
zengyawen 已提交
519 520
}
.rect5{
H
HelloCrease 已提交
521 522 523 524 525
    margin-top: 300px;
    width: 100px;
    height: 100px;
   background-color: cadetblue;
    animation: change5 3s infinite;
Z
zengyawen 已提交
526 527 528
}
/* change1 change2 对比 */
@keyframes change1{
H
HelloCrease 已提交
529 530 531 532 533 534 535
    0%{
        transform: translate(0,0);    transform: rotate(0deg)
    }
    100%{
        transform: translate(0,500px);
        transform: rotate(360deg)
    }
Z
zengyawen 已提交
536 537 538
}
/* change2 change3 对比属性顺序不同的动画效果 */
@keyframes change2{
H
HelloCrease 已提交
539 540 541 542 543 544
    0%{
        transform:translate(0,0) rotate(0deg) ;
    }
    100%{
        transform: translate(300px,0) rotate(360deg);
    }
Z
zengyawen 已提交
545 546
}
@keyframes change3{
H
HelloCrease 已提交
547 548 549 550 551 552
    0%{
        transform:rotate(0deg) translate(0,0);
    }
    100%{
        transform:rotate(360deg)  translate(300px,0);
    }
Z
zengyawen 已提交
553 554 555
}
/* 属性值不对应的情况 */
@keyframes change4{
H
HelloCrease 已提交
556 557 558 559 560 561
    0%{
        transform: scale(0.5);
    }
    100%{
        transform:scale(2) rotate(45deg);
    }
Z
zengyawen 已提交
562 563 564
}
/* 多属性的写法 */
@keyframes change5{
H
HelloCrease 已提交
565 566 567 568 569 570
    0%{
        transform:scale(0) translate(0,0) rotate(0);
    }
    100%{
        transform: scale(1.5) rotate(360deg) translate(200px,0);
    }
Z
zengyawen 已提交
571 572 573
}
```

Z
zengyawen 已提交
574
![zh-cn_image_0000001220554911](figures/zh-cn_image_0000001220554911.gif)
Z
zengyawen 已提交
575

H
HelloCrease 已提交
576
> **说明:**
577
> - 当设置多个transform时,后续的transform值会把前面的覆盖掉。若想同时使用多个动画样式可用复合写法,例:transform: scale(1) rotate(0) translate(0,0)。
H
HelloCrease 已提交
578
>
579
> - transform进行复合写法时,变化样式内多个样式值顺序的不同会呈现不一样的动画效果。
H
HelloCrease 已提交
580
>
581
> - transform属性设置的样式值要一一对应,若前后不对应,则该动画不生效。若设置多个样式值则只会呈现出已对应值的动画效果。
582 583 584 585 586 587


## 相关实例

针对transform样式动画开发,有以下相关实例可供参考:

Z
zwx1094577 已提交
588
- [`JsComponentCollection`:组件集合(JS)(API9)](https://gitee.com/openharmony/applications_app_samples/tree/master/code/UI/JsComponentClollection/JsComponentCollection)
589

Z
zwx1094577 已提交
590
- [`JsClock`:时钟(JS)(API10)](https://gitee.com/openharmony/applications_app_samples/tree/master/code/Solutions/Tools/JsClock)
591

592
- [`JsAnimator`:动画(JS)(API8)](https://gitee.com/openharmony/applications_app_samples/tree/master/UI/JsAnimation)
593

594
- [动画样式(JS)(API8)](https://gitee.com/openharmony/codelabs/tree/master/JSUI/AnimationDemo)
595

596
- [图片常见操作(JS)(API8)](https://gitee.com/openharmony/codelabs/tree/master/Media/ImageJsDemo)