1e41f4b71Sopenharmony_ci# Defining Animations with the transform Attribute 2e41f4b71Sopenharmony_ci 3e41f4b71Sopenharmony_ci 4e41f4b71Sopenharmony_ciSet the transform attribute for component rotation, scaling, translation, and skewing. 5e41f4b71Sopenharmony_ci 6e41f4b71Sopenharmony_ci 7e41f4b71Sopenharmony_ci## Designing Static Animation 8e41f4b71Sopenharmony_ci 9e41f4b71Sopenharmony_ciCreate a square and rotate it by 90 degrees to form a rhombus. Cover the lower part of the rhombus with a rectangle to form a roof. Set the **translate** attribute of the rectangle to the coordinate (150px, -150px) to form a door, use the **position** attribute to translate the horizontal and vertical axes to the specified coordinates of the parent component (square), set the **scale** attribute to scale up the parent and child components together to determine the window size, and use the **skewX** attribute to skew the component and set the coordinate translate(200px,-830px) to form a chimney. 10e41f4b71Sopenharmony_ci 11e41f4b71Sopenharmony_ci```html 12e41f4b71Sopenharmony_ci<!-- xxx.hml --> 13e41f4b71Sopenharmony_ci<div class="container"> 14e41f4b71Sopenharmony_ci <div class="top"></div> 15e41f4b71Sopenharmony_ci <div class="content"></div> 16e41f4b71Sopenharmony_ci <div class="door"></div> 17e41f4b71Sopenharmony_ci <!-- Window --> 18e41f4b71Sopenharmony_ci <div class="window"> 19e41f4b71Sopenharmony_ci <div class="horizontal"></div> 20e41f4b71Sopenharmony_ci <div class="vertical"></div> 21e41f4b71Sopenharmony_ci </div> 22e41f4b71Sopenharmony_ci <div class="chimney"></div> 23e41f4b71Sopenharmony_ci</div> 24e41f4b71Sopenharmony_ci``` 25e41f4b71Sopenharmony_ci 26e41f4b71Sopenharmony_ci```css 27e41f4b71Sopenharmony_ci/* xxx.css */ 28e41f4b71Sopenharmony_ci.container { 29e41f4b71Sopenharmony_ci width:100%; 30e41f4b71Sopenharmony_ci height:100%; 31e41f4b71Sopenharmony_ci background-color:#F1F3F5; 32e41f4b71Sopenharmony_ci align-items: center; 33e41f4b71Sopenharmony_ci flex-direction: column; 34e41f4b71Sopenharmony_ci} 35e41f4b71Sopenharmony_ci.top{ 36e41f4b71Sopenharmony_ci z-index: -1; 37e41f4b71Sopenharmony_ci position: absolute; 38e41f4b71Sopenharmony_ci width: 428px; 39e41f4b71Sopenharmony_ci height: 428px; 40e41f4b71Sopenharmony_ci background-color: #860303; 41e41f4b71Sopenharmony_ci transform: rotate(45deg); 42e41f4b71Sopenharmony_ci margin-top: 284px; 43e41f4b71Sopenharmony_ci margin-left: 148px; 44e41f4b71Sopenharmony_ci} 45e41f4b71Sopenharmony_ci.content{ 46e41f4b71Sopenharmony_ci margin-top: 500px; 47e41f4b71Sopenharmony_ci width: 600px; 48e41f4b71Sopenharmony_ci height: 400px; 49e41f4b71Sopenharmony_ci background-color: white; 50e41f4b71Sopenharmony_ci border: 1px solid black; 51e41f4b71Sopenharmony_ci} 52e41f4b71Sopenharmony_ci.door{ 53e41f4b71Sopenharmony_ci width: 100px; 54e41f4b71Sopenharmony_ci height: 135px; 55e41f4b71Sopenharmony_ci background-color: #1033d9; 56e41f4b71Sopenharmony_ci transform: translate(150px,-137px); 57e41f4b71Sopenharmony_ci} 58e41f4b71Sopenharmony_ci.window{ 59e41f4b71Sopenharmony_ci z-index: 1; 60e41f4b71Sopenharmony_ci position: relative; 61e41f4b71Sopenharmony_ci width: 100px; 62e41f4b71Sopenharmony_ci height: 100px; 63e41f4b71Sopenharmony_ci background-color: white; 64e41f4b71Sopenharmony_ci border: 1px solid black; 65e41f4b71Sopenharmony_ci transform: translate(-150px,-400px) scale(1.5); 66e41f4b71Sopenharmony_ci} 67e41f4b71Sopenharmony_ci/* Horizontal axis of the window */ 68e41f4b71Sopenharmony_ci.horizontal{ 69e41f4b71Sopenharmony_ci position: absolute; 70e41f4b71Sopenharmony_ci top: 50%; 71e41f4b71Sopenharmony_ci width: 100px; 72e41f4b71Sopenharmony_ci height: 5px; 73e41f4b71Sopenharmony_ci background-color: black; 74e41f4b71Sopenharmony_ci} 75e41f4b71Sopenharmony_ci/* Vertical axis of the window */ 76e41f4b71Sopenharmony_ci.vertical{ 77e41f4b71Sopenharmony_ci position: absolute; 78e41f4b71Sopenharmony_ci left: 50%; 79e41f4b71Sopenharmony_ci width: 5px; 80e41f4b71Sopenharmony_ci height: 100px; 81e41f4b71Sopenharmony_ci background-color: black; 82e41f4b71Sopenharmony_ci} 83e41f4b71Sopenharmony_ci.chimney{ 84e41f4b71Sopenharmony_ci z-index: -2; 85e41f4b71Sopenharmony_ci width: 40px; 86e41f4b71Sopenharmony_ci height: 100px; 87e41f4b71Sopenharmony_ci border-radius: 15px; 88e41f4b71Sopenharmony_ci background-color: #9a7404; 89e41f4b71Sopenharmony_ci transform: translate(200px,-710px) skewX(-5deg); 90e41f4b71Sopenharmony_ci} 91e41f4b71Sopenharmony_ci``` 92e41f4b71Sopenharmony_ci 93e41f4b71Sopenharmony_ci 94e41f4b71Sopenharmony_ci 95e41f4b71Sopenharmony_ci 96e41f4b71Sopenharmony_ci## Designing Translation Animation 97e41f4b71Sopenharmony_ci 98e41f4b71Sopenharmony_ciDecrease the y-coordinate over a time frame to make the ball bounce back. Gradually decrease the bounce height until it drops to 0. An animation where the ball falls is hereby created. 99e41f4b71Sopenharmony_ci 100e41f4b71Sopenharmony_ci```html 101e41f4b71Sopenharmony_ci<!-- xxx.hml --> 102e41f4b71Sopenharmony_ci<div class="container"> 103e41f4b71Sopenharmony_ci <div class="circle"></div> 104e41f4b71Sopenharmony_ci <div class="flower"></div> 105e41f4b71Sopenharmony_ci</div> 106e41f4b71Sopenharmony_ci``` 107e41f4b71Sopenharmony_ci 108e41f4b71Sopenharmony_ci```css 109e41f4b71Sopenharmony_ci/* xxx.css */ 110e41f4b71Sopenharmony_ci.container { 111e41f4b71Sopenharmony_ci width:100%; 112e41f4b71Sopenharmony_ci height:100%; 113e41f4b71Sopenharmony_ci background-color:#F1F3F5; 114e41f4b71Sopenharmony_ci display: flex; 115e41f4b71Sopenharmony_ci justify-content: center; 116e41f4b71Sopenharmony_ci} 117e41f4b71Sopenharmony_ci.circle{ 118e41f4b71Sopenharmony_ci width: 100px; 119e41f4b71Sopenharmony_ci height: 100px; 120e41f4b71Sopenharmony_ci border-radius: 50px; 121e41f4b71Sopenharmony_ci background-color: red; 122e41f4b71Sopenharmony_ci /* Use forwards to enable the animation stop at the last frame. */ 123e41f4b71Sopenharmony_ci animation: down 3s fast-out-linear-in forwards; 124e41f4b71Sopenharmony_ci} 125e41f4b71Sopenharmony_ci.flower{ 126e41f4b71Sopenharmony_ci position: fixed; 127e41f4b71Sopenharmony_ci width: 80%; 128e41f4b71Sopenharmony_ci margin-left: 10%; 129e41f4b71Sopenharmony_ci height: 5px; 130e41f4b71Sopenharmony_ci background-color: black; 131e41f4b71Sopenharmony_ci top: 1000px; 132e41f4b71Sopenharmony_ci} 133e41f4b71Sopenharmony_ci@keyframes down { 134e41f4b71Sopenharmony_ci 0%{ 135e41f4b71Sopenharmony_ci transform: translate(0px,0px); 136e41f4b71Sopenharmony_ci } 137e41f4b71Sopenharmony_ci /* Start ball falling. */ 138e41f4b71Sopenharmony_ci 15%{ 139e41f4b71Sopenharmony_ci transform: translate(10px,900px); 140e41f4b71Sopenharmony_ci } 141e41f4b71Sopenharmony_ci /* Start bouncing back. */ 142e41f4b71Sopenharmony_ci 25%{ 143e41f4b71Sopenharmony_ci transform: translate(20px,500px); 144e41f4b71Sopenharmony_ci } 145e41f4b71Sopenharmony_ci /* Let the ball fall. */ 146e41f4b71Sopenharmony_ci 35%{ 147e41f4b71Sopenharmony_ci transform: translate(30px,900px); 148e41f4b71Sopenharmony_ci } 149e41f4b71Sopenharmony_ci /* Let the ball bounce back. */ 150e41f4b71Sopenharmony_ci 45%{ 151e41f4b71Sopenharmony_ci transform: translate(40px,700px); 152e41f4b71Sopenharmony_ci } 153e41f4b71Sopenharmony_ci 55%{ 154e41f4b71Sopenharmony_ci transform: translate(50px,900px); 155e41f4b71Sopenharmony_ci } 156e41f4b71Sopenharmony_ci 65%{ 157e41f4b71Sopenharmony_ci transform: translate(60px,800px); 158e41f4b71Sopenharmony_ci } 159e41f4b71Sopenharmony_ci 80%{ 160e41f4b71Sopenharmony_ci transform: translate(70px,900px); 161e41f4b71Sopenharmony_ci } 162e41f4b71Sopenharmony_ci 90%{ 163e41f4b71Sopenharmony_ci transform: translate(80px,850px); 164e41f4b71Sopenharmony_ci } 165e41f4b71Sopenharmony_ci /* Stop falling. */ 166e41f4b71Sopenharmony_ci 100%{ 167e41f4b71Sopenharmony_ci transform: translate(90px,900px); 168e41f4b71Sopenharmony_ci } 169e41f4b71Sopenharmony_ci} 170e41f4b71Sopenharmony_ci``` 171e41f4b71Sopenharmony_ci 172e41f4b71Sopenharmony_ci 173e41f4b71Sopenharmony_ci 174e41f4b71Sopenharmony_ci 175e41f4b71Sopenharmony_ci## Designing Rotation Animation 176e41f4b71Sopenharmony_ci 177e41f4b71Sopenharmony_ciSet the rotation center around an element in different transform-origin positions. Of the **rotate3d** values, the first three values are the rotation vectors of the x-axis, y-axis, and z-axis, respectively; the fourth value is the rotation angle, which can be a negative value to indicate that the rotation is performed counterclockwise. 178e41f4b71Sopenharmony_ci 179e41f4b71Sopenharmony_ci```html 180e41f4b71Sopenharmony_ci<!-- xxx.hml --> 181e41f4b71Sopenharmony_ci<div class="container"> 182e41f4b71Sopenharmony_ci <div class="rotate"> 183e41f4b71Sopenharmony_ci <div class="rect rect1"></div> 184e41f4b71Sopenharmony_ci <div class="rect rect2"></div> 185e41f4b71Sopenharmony_ci <div class="rect rect3"></div> 186e41f4b71Sopenharmony_ci </div> 187e41f4b71Sopenharmony_ci <!-- 3D attributes --> 188e41f4b71Sopenharmony_ci <div class="rotate3d"> 189e41f4b71Sopenharmony_ci <div class="content"> 190e41f4b71Sopenharmony_ci <div class="rect4"></div> 191e41f4b71Sopenharmony_ci <div class="rect5"> </div> 192e41f4b71Sopenharmony_ci </div> 193e41f4b71Sopenharmony_ci <div class="mouse"></div> 194e41f4b71Sopenharmony_ci </div> 195e41f4b71Sopenharmony_ci</div> 196e41f4b71Sopenharmony_ci``` 197e41f4b71Sopenharmony_ci 198e41f4b71Sopenharmony_ci```css 199e41f4b71Sopenharmony_ci/* xxx.css */ 200e41f4b71Sopenharmony_ci.container { 201e41f4b71Sopenharmony_ci flex-direction: column; 202e41f4b71Sopenharmony_ci background-color:#F1F3F5; 203e41f4b71Sopenharmony_ci display: flex; 204e41f4b71Sopenharmony_ci align-items: center; 205e41f4b71Sopenharmony_ci justify-content: center; 206e41f4b71Sopenharmony_ci width: 100%; 207e41f4b71Sopenharmony_ci height: 100%; 208e41f4b71Sopenharmony_ci} 209e41f4b71Sopenharmony_ci.rect { 210e41f4b71Sopenharmony_ci width: 100px; 211e41f4b71Sopenharmony_ci height: 100px; 212e41f4b71Sopenharmony_ci animation: rotate 3s infinite; 213e41f4b71Sopenharmony_ci margin-left: 30px; 214e41f4b71Sopenharmony_ci} 215e41f4b71Sopenharmony_ci.rect1 { 216e41f4b71Sopenharmony_ci background-color: #f76160; 217e41f4b71Sopenharmony_ci} 218e41f4b71Sopenharmony_ci.rect2 { 219e41f4b71Sopenharmony_ci background-color: #60f76f; 220e41f4b71Sopenharmony_ci/* Change the origin position.*/ 221e41f4b71Sopenharmony_ci transform-origin: 10% 10px; 222e41f4b71Sopenharmony_ci} 223e41f4b71Sopenharmony_ci.rect3 { 224e41f4b71Sopenharmony_ci background-color: #6081f7; 225e41f4b71Sopenharmony_ci/* Change the origin position.*/ 226e41f4b71Sopenharmony_ci transform-origin: right bottom; 227e41f4b71Sopenharmony_ci} 228e41f4b71Sopenharmony_ci@keyframes rotate { 229e41f4b71Sopenharmony_ci from { 230e41f4b71Sopenharmony_ci transform: rotate(0deg) 231e41f4b71Sopenharmony_ci } 232e41f4b71Sopenharmony_ci to { 233e41f4b71Sopenharmony_ci transform: rotate(360deg); 234e41f4b71Sopenharmony_ci } 235e41f4b71Sopenharmony_ci} 236e41f4b71Sopenharmony_ci/* 3D sample style */ 237e41f4b71Sopenharmony_ci.rotate3d { 238e41f4b71Sopenharmony_ci margin-top: 150px; 239e41f4b71Sopenharmony_ci flex-direction: column; 240e41f4b71Sopenharmony_ci background-color:#F1F3F5; 241e41f4b71Sopenharmony_ci display: flex; 242e41f4b71Sopenharmony_ci align-items: center; 243e41f4b71Sopenharmony_ci width: 80%; 244e41f4b71Sopenharmony_ci height: 600px; 245e41f4b71Sopenharmony_ci border-radius: 300px; 246e41f4b71Sopenharmony_ci border: 1px solid #ec0808; 247e41f4b71Sopenharmony_ci} 248e41f4b71Sopenharmony_ci.content { 249e41f4b71Sopenharmony_ci padding-top: 150px; 250e41f4b71Sopenharmony_ci display: flex; 251e41f4b71Sopenharmony_ci align-items: center; 252e41f4b71Sopenharmony_ci justify-content: center; 253e41f4b71Sopenharmony_ci} 254e41f4b71Sopenharmony_ci/* Use react4 and react5 to shape eyes. */ 255e41f4b71Sopenharmony_ci.rect4 { 256e41f4b71Sopenharmony_ci width: 100px; 257e41f4b71Sopenharmony_ci height: 100px; 258e41f4b71Sopenharmony_ci animation: rotate3d1 1000ms infinite; 259e41f4b71Sopenharmony_ci background-color: darkmagenta; 260e41f4b71Sopenharmony_ci} 261e41f4b71Sopenharmony_ci.rect5 { 262e41f4b71Sopenharmony_ci width: 100px; 263e41f4b71Sopenharmony_ci height: 100px; 264e41f4b71Sopenharmony_ci animation: rotate3d1 1000ms infinite; 265e41f4b71Sopenharmony_ci margin-left: 100px; 266e41f4b71Sopenharmony_ci background-color: darkmagenta; 267e41f4b71Sopenharmony_ci} 268e41f4b71Sopenharmony_ci.mouse { 269e41f4b71Sopenharmony_ci margin-top: 150px; 270e41f4b71Sopenharmony_ci width: 200px; 271e41f4b71Sopenharmony_ci height: 100px; 272e41f4b71Sopenharmony_ci border-radius: 50px; 273e41f4b71Sopenharmony_ci border: 1px solid #e70303; 274e41f4b71Sopenharmony_ci animation: rotate3d2 1000ms infinite; 275e41f4b71Sopenharmony_ci} 276e41f4b71Sopenharmony_ci/* Eye animation */ 277e41f4b71Sopenharmony_ci@keyframes rotate3d1 { 278e41f4b71Sopenharmony_ci 0% { 279e41f4b71Sopenharmony_ci transform:rotate3d(0,0,0,0deg) 280e41f4b71Sopenharmony_ci } 281e41f4b71Sopenharmony_ci 50% { 282e41f4b71Sopenharmony_ci transform:rotate3d(20,20,20,360deg); 283e41f4b71Sopenharmony_ci } 284e41f4b71Sopenharmony_ci 100% { 285e41f4b71Sopenharmony_ci transform:rotate3d(0,0,0,0deg); 286e41f4b71Sopenharmony_ci } 287e41f4b71Sopenharmony_ci} 288e41f4b71Sopenharmony_ci/* Mouth animation */ 289e41f4b71Sopenharmony_ci@keyframes rotate3d2 { 290e41f4b71Sopenharmony_ci 0% { 291e41f4b71Sopenharmony_ci transform:rotate3d(0,0,0,0deg) 292e41f4b71Sopenharmony_ci } 293e41f4b71Sopenharmony_ci 33% { 294e41f4b71Sopenharmony_ci transform:rotate3d(0,0,10,30deg); 295e41f4b71Sopenharmony_ci } 296e41f4b71Sopenharmony_ci 66% { 297e41f4b71Sopenharmony_ci transform:rotate3d(0,0,10,-30deg); 298e41f4b71Sopenharmony_ci } 299e41f4b71Sopenharmony_ci 100% { 300e41f4b71Sopenharmony_ci transform:rotate3d(0,0,0,0deg); 301e41f4b71Sopenharmony_ci } 302e41f4b71Sopenharmony_ci} 303e41f4b71Sopenharmony_ci``` 304e41f4b71Sopenharmony_ci 305e41f4b71Sopenharmony_ci 306e41f4b71Sopenharmony_ci 307e41f4b71Sopenharmony_ci> **NOTE** 308e41f4b71Sopenharmony_ci> 309e41f4b71Sopenharmony_ci> **transform-origin** specifies the origin of an element's transformation. If only one value is set, the other value is 50%. If both values are set, the first value indicates the position on the x-axis, and the second value indicates the position on the y-axis. 310e41f4b71Sopenharmony_ci 311e41f4b71Sopenharmony_ci 312e41f4b71Sopenharmony_ci## Designing Scaling Animation 313e41f4b71Sopenharmony_ci 314e41f4b71Sopenharmony_ciThis example implements a ripple animation with the scale attribute. Here is the overall procedure: First, use the positioning function to determine the coordinates of the element's position. Then, create multiple components to achieve the overlapping effect. After that, set the opacity attribute to hide or display the components. To scale and hide/display a component at the same time, set both the scale and opacity attributes. Finally, set different animation durations for different components to achieve the diffusion effect. 315e41f4b71Sopenharmony_ci 316e41f4b71Sopenharmony_ciSet the scaling values for the x-axis, y-axis, and z-axis in **scale3d** to implement the animation. 317e41f4b71Sopenharmony_ci 318e41f4b71Sopenharmony_ci```html 319e41f4b71Sopenharmony_ci<!-- xxx.hml --> 320e41f4b71Sopenharmony_ci<div class="container"> 321e41f4b71Sopenharmony_ci <div class="circle"> 322e41f4b71Sopenharmony_ci <text>ripple</text> 323e41f4b71Sopenharmony_ci </div> 324e41f4b71Sopenharmony_ci <div class="ripple"></div> 325e41f4b71Sopenharmony_ci <div class="ripple ripple2"></div> 326e41f4b71Sopenharmony_ci <!-- 3d --> 327e41f4b71Sopenharmony_ci <div class="content"> 328e41f4b71Sopenharmony_ci <text>spring</text> 329e41f4b71Sopenharmony_ci </div> 330e41f4b71Sopenharmony_ci</div> 331e41f4b71Sopenharmony_ci``` 332e41f4b71Sopenharmony_ci 333e41f4b71Sopenharmony_ci```css 334e41f4b71Sopenharmony_ci/* xxx.css */ 335e41f4b71Sopenharmony_ci.container { 336e41f4b71Sopenharmony_ci flex-direction: column; 337e41f4b71Sopenharmony_ci background-color:#F1F3F5; 338e41f4b71Sopenharmony_ci width: 100%; 339e41f4b71Sopenharmony_ci position: relative; 340e41f4b71Sopenharmony_ci} 341e41f4b71Sopenharmony_ci.circle{ 342e41f4b71Sopenharmony_ci margin-top: 400px; 343e41f4b71Sopenharmony_ci margin-left: 40%; 344e41f4b71Sopenharmony_ci width: 100px; 345e41f4b71Sopenharmony_ci height: 100px; 346e41f4b71Sopenharmony_ci border-radius: 50px; 347e41f4b71Sopenharmony_ci background-color: mediumpurple; 348e41f4b71Sopenharmony_ci z-index: 1; position: absolute; 349e41f4b71Sopenharmony_ci} 350e41f4b71Sopenharmony_ci.ripple{ 351e41f4b71Sopenharmony_ci margin-top: 400px; 352e41f4b71Sopenharmony_ci margin-left: 40%; 353e41f4b71Sopenharmony_ci position: absolute; z-index: 0; 354e41f4b71Sopenharmony_ci width: 100px; 355e41f4b71Sopenharmony_ci height: 100px; 356e41f4b71Sopenharmony_ci border-radius: 50px; 357e41f4b71Sopenharmony_ci background-color: blueviolet; 358e41f4b71Sopenharmony_ci animation: ripple 5s infinite; 359e41f4b71Sopenharmony_ci} 360e41f4b71Sopenharmony_ci/* Set different animation durations for different components. */ 361e41f4b71Sopenharmony_ci.ripple2{ 362e41f4b71Sopenharmony_ci animation-duration: 2.5s; 363e41f4b71Sopenharmony_ci} 364e41f4b71Sopenharmony_ci@keyframes ripple{ 365e41f4b71Sopenharmony_ci 0%{ 366e41f4b71Sopenharmony_ci transform: scale(1); 367e41f4b71Sopenharmony_ci opacity: 0.5; 368e41f4b71Sopenharmony_ci } 369e41f4b71Sopenharmony_ci 50%{ 370e41f4b71Sopenharmony_ci transform: scale(3); 371e41f4b71Sopenharmony_ci opacity: 0; 372e41f4b71Sopenharmony_ci } 373e41f4b71Sopenharmony_ci 100%{ 374e41f4b71Sopenharmony_ci transform: scale(1); 375e41f4b71Sopenharmony_ci opacity: 0.5; 376e41f4b71Sopenharmony_ci } 377e41f4b71Sopenharmony_ci} 378e41f4b71Sopenharmony_citext{ 379e41f4b71Sopenharmony_ci color: white; 380e41f4b71Sopenharmony_ci text-align: center; 381e41f4b71Sopenharmony_ci height: 100%; 382e41f4b71Sopenharmony_ci width: 100%; 383e41f4b71Sopenharmony_ci} 384e41f4b71Sopenharmony_ci.content { 385e41f4b71Sopenharmony_ci margin-top: 700px; 386e41f4b71Sopenharmony_ci margin-left: 33%; 387e41f4b71Sopenharmony_ci width: 200px; 388e41f4b71Sopenharmony_ci height: 100px; 389e41f4b71Sopenharmony_ci animation:rubberBand 1s infinite; 390e41f4b71Sopenharmony_ci background-color: darkmagenta; 391e41f4b71Sopenharmony_ci position: absolute; 392e41f4b71Sopenharmony_ci} 393e41f4b71Sopenharmony_ci@keyframes rubberBand { 394e41f4b71Sopenharmony_ci 0% { 395e41f4b71Sopenharmony_ci transform: scale3d(1, 1, 1); 396e41f4b71Sopenharmony_ci } 397e41f4b71Sopenharmony_ci 30% { 398e41f4b71Sopenharmony_ci transform: scale3d(1.25, 0.75, 1.1); 399e41f4b71Sopenharmony_ci } 400e41f4b71Sopenharmony_ci 40% { 401e41f4b71Sopenharmony_ci transform: scale3d(0.75, 1.25, 1.2); 402e41f4b71Sopenharmony_ci } 403e41f4b71Sopenharmony_ci 50% { 404e41f4b71Sopenharmony_ci transform: scale3d(1.15, 0.85, 1.3); 405e41f4b71Sopenharmony_ci } 406e41f4b71Sopenharmony_ci 65% { 407e41f4b71Sopenharmony_ci transform: scale3d(.95, 1.05, 1.2); 408e41f4b71Sopenharmony_ci } 409e41f4b71Sopenharmony_ci 75% { 410e41f4b71Sopenharmony_ci transform: scale3d(1.05, .95, 1.1); 411e41f4b71Sopenharmony_ci } 412e41f4b71Sopenharmony_ci 100%{ 413e41f4b71Sopenharmony_ci transform: scale3d(1, 1, 1); 414e41f4b71Sopenharmony_ci } 415e41f4b71Sopenharmony_ci} 416e41f4b71Sopenharmony_ci``` 417e41f4b71Sopenharmony_ci 418e41f4b71Sopenharmony_ci 419e41f4b71Sopenharmony_ci 420e41f4b71Sopenharmony_ci> **NOTE** 421e41f4b71Sopenharmony_ci> 422e41f4b71Sopenharmony_ci> After the **transform** attributes are set, the child element changes with the parent element. Value changing of other attributes (such as height and width) of the parent element will not affect the child element. 423e41f4b71Sopenharmony_ci 424e41f4b71Sopenharmony_ci 425e41f4b71Sopenharmony_ci## Setting matrix 426e41f4b71Sopenharmony_ci 427e41f4b71Sopenharmony_ciThe matrix attribute defines a transformation matrix with six input parameters: scaleX, skewY, skewX, scaleY, translateX, and translateY. In the following example, matrix is set to matrix(1,0,0,1,0,200) to skew and translate the component. 428e41f4b71Sopenharmony_ci 429e41f4b71Sopenharmony_ci```html 430e41f4b71Sopenharmony_ci<!-- xxx.hml --> 431e41f4b71Sopenharmony_ci<div class="container"> 432e41f4b71Sopenharmony_ci <div class="rect"> </div> 433e41f4b71Sopenharmony_ci</div> 434e41f4b71Sopenharmony_ci``` 435e41f4b71Sopenharmony_ci 436e41f4b71Sopenharmony_ci```css 437e41f4b71Sopenharmony_ci/* xxx.css */ 438e41f4b71Sopenharmony_ci.container{ 439e41f4b71Sopenharmony_ci background-color:#F1F3F5; 440e41f4b71Sopenharmony_ci display: flex; 441e41f4b71Sopenharmony_ci justify-content: center; 442e41f4b71Sopenharmony_ci width: 100%; 443e41f4b71Sopenharmony_ci height: 100%; 444e41f4b71Sopenharmony_ci} 445e41f4b71Sopenharmony_ci.rect{ 446e41f4b71Sopenharmony_ci width: 100px; 447e41f4b71Sopenharmony_ci height: 100px; 448e41f4b71Sopenharmony_ci background-color: red; 449e41f4b71Sopenharmony_ci animation: down 3s infinite forwards; 450e41f4b71Sopenharmony_ci} 451e41f4b71Sopenharmony_ci@keyframes down{ 452e41f4b71Sopenharmony_ci 0%{ 453e41f4b71Sopenharmony_ci transform: matrix(1,0,0,1,0,0); 454e41f4b71Sopenharmony_ci } 455e41f4b71Sopenharmony_ci 10%{ 456e41f4b71Sopenharmony_ci transform: matrix(1,0,0,1,0,200); 457e41f4b71Sopenharmony_ci } 458e41f4b71Sopenharmony_ci 60%{ 459e41f4b71Sopenharmony_ci transform: matrix(2,1.5,1.5,2,0,700); 460e41f4b71Sopenharmony_ci } 461e41f4b71Sopenharmony_ci 100%{ 462e41f4b71Sopenharmony_ci transform: matrix(1,0,0,1,0,0); 463e41f4b71Sopenharmony_ci } 464e41f4b71Sopenharmony_ci} 465e41f4b71Sopenharmony_ci``` 466e41f4b71Sopenharmony_ci 467e41f4b71Sopenharmony_ci 468e41f4b71Sopenharmony_ci 469e41f4b71Sopenharmony_ci 470e41f4b71Sopenharmony_ci## Integrating transform Attributes 471e41f4b71Sopenharmony_ci 472e41f4b71Sopenharmony_ciYou can set multiple **transform** attributes at the same time to apply different transformations to a component. The following example applies the **scale**, **translate**, and **rotate** attributes simultaneously. 473e41f4b71Sopenharmony_ci 474e41f4b71Sopenharmony_ci```html 475e41f4b71Sopenharmony_ci<!-- xxx.hml --> 476e41f4b71Sopenharmony_ci<div class="container"> 477e41f4b71Sopenharmony_ci <div class="rect1"></div> 478e41f4b71Sopenharmony_ci <div class="rect2"></div> 479e41f4b71Sopenharmony_ci <div class="rect3"></div> 480e41f4b71Sopenharmony_ci <div class="rect4"></div> 481e41f4b71Sopenharmony_ci <div class="rect5"></div> 482e41f4b71Sopenharmony_ci</div> 483e41f4b71Sopenharmony_ci``` 484e41f4b71Sopenharmony_ci 485e41f4b71Sopenharmony_ci```css 486e41f4b71Sopenharmony_ci/* xxx.css */ 487e41f4b71Sopenharmony_ci.container{ 488e41f4b71Sopenharmony_ci width: 100%; 489e41f4b71Sopenharmony_ci height: 100%; 490e41f4b71Sopenharmony_ci flex-direction:column; 491e41f4b71Sopenharmony_ci background-color:#F1F3F5; 492e41f4b71Sopenharmony_ci padding:50px; 493e41f4b71Sopenharmony_ci} 494e41f4b71Sopenharmony_ci.rect1{ 495e41f4b71Sopenharmony_ci width: 100px; 496e41f4b71Sopenharmony_ci height: 100px; 497e41f4b71Sopenharmony_ci background-color: red; 498e41f4b71Sopenharmony_ci animation: change1 3s infinite forwards; 499e41f4b71Sopenharmony_ci} 500e41f4b71Sopenharmony_ci.rect2{ 501e41f4b71Sopenharmony_ci margin-top: 50px; 502e41f4b71Sopenharmony_ci width: 100px; 503e41f4b71Sopenharmony_ci height: 100px; 504e41f4b71Sopenharmony_ci background-color: darkblue; 505e41f4b71Sopenharmony_ci animation: change2 3s infinite forwards; 506e41f4b71Sopenharmony_ci} 507e41f4b71Sopenharmony_ci.rect3{ 508e41f4b71Sopenharmony_ci margin-top: 50px; 509e41f4b71Sopenharmony_ci width: 100px; 510e41f4b71Sopenharmony_ci height: 100px; 511e41f4b71Sopenharmony_ci background-color: darkblue; 512e41f4b71Sopenharmony_ci animation: change3 3s infinite; 513e41f4b71Sopenharmony_ci} 514e41f4b71Sopenharmony_ci.rect4{ 515e41f4b71Sopenharmony_ci align-self: center; 516e41f4b71Sopenharmony_ci margin-left: 50px; 517e41f4b71Sopenharmony_ci margin-top: 200px; 518e41f4b71Sopenharmony_ci width: 100px; 519e41f4b71Sopenharmony_ci height: 100px; 520e41f4b71Sopenharmony_ci background-color: darkmagenta; 521e41f4b71Sopenharmony_ci animation: change4 3s infinite; 522e41f4b71Sopenharmony_ci} 523e41f4b71Sopenharmony_ci.rect5{ 524e41f4b71Sopenharmony_ci margin-top: 300px; 525e41f4b71Sopenharmony_ci width: 100px; 526e41f4b71Sopenharmony_ci height: 100px; 527e41f4b71Sopenharmony_ci background-color: cadetblue; 528e41f4b71Sopenharmony_ci animation: change5 3s infinite; 529e41f4b71Sopenharmony_ci} 530e41f4b71Sopenharmony_ci/* Use change1 and change2 for comparison. */ 531e41f4b71Sopenharmony_ci@keyframes change1{ 532e41f4b71Sopenharmony_ci 0%{ 533e41f4b71Sopenharmony_ci transform: translate(0,0); transform: rotate(0deg) 534e41f4b71Sopenharmony_ci } 535e41f4b71Sopenharmony_ci 100%{ 536e41f4b71Sopenharmony_ci transform: translate(0,500px); 537e41f4b71Sopenharmony_ci transform: rotate(360deg) 538e41f4b71Sopenharmony_ci } 539e41f4b71Sopenharmony_ci} 540e41f4b71Sopenharmony_ci/*change2 and change3 compare the animation effects with different attribute sequences.*/ 541e41f4b71Sopenharmony_ci@keyframes change2{ 542e41f4b71Sopenharmony_ci 0%{ 543e41f4b71Sopenharmony_ci transform:translate(0,0) rotate(0deg) ; 544e41f4b71Sopenharmony_ci } 545e41f4b71Sopenharmony_ci 100%{ 546e41f4b71Sopenharmony_ci transform: translate(300px,0) rotate(360deg); 547e41f4b71Sopenharmony_ci } 548e41f4b71Sopenharmony_ci} 549e41f4b71Sopenharmony_ci@keyframes change3{ 550e41f4b71Sopenharmony_ci 0%{ 551e41f4b71Sopenharmony_ci transform:rotate(0deg) translate(0,0); 552e41f4b71Sopenharmony_ci } 553e41f4b71Sopenharmony_ci 100%{ 554e41f4b71Sopenharmony_ci transform:rotate(360deg) translate(300px,0); 555e41f4b71Sopenharmony_ci } 556e41f4b71Sopenharmony_ci} 557e41f4b71Sopenharmony_ci/* Where the attribute values do not match. */ 558e41f4b71Sopenharmony_ci@keyframes change4{ 559e41f4b71Sopenharmony_ci 0%{ 560e41f4b71Sopenharmony_ci transform: scale(0.5); 561e41f4b71Sopenharmony_ci } 562e41f4b71Sopenharmony_ci 100%{ 563e41f4b71Sopenharmony_ci transform:scale(2) rotate(45deg); 564e41f4b71Sopenharmony_ci } 565e41f4b71Sopenharmony_ci} 566e41f4b71Sopenharmony_ci/* Multi-attribute format */ 567e41f4b71Sopenharmony_ci@keyframes change5{ 568e41f4b71Sopenharmony_ci 0%{ 569e41f4b71Sopenharmony_ci transform:scale(0) translate(0,0) rotate(0); 570e41f4b71Sopenharmony_ci } 571e41f4b71Sopenharmony_ci 100%{ 572e41f4b71Sopenharmony_ci transform: scale(1.5) rotate(360deg) translate(200px,0); 573e41f4b71Sopenharmony_ci } 574e41f4b71Sopenharmony_ci} 575e41f4b71Sopenharmony_ci``` 576e41f4b71Sopenharmony_ci 577e41f4b71Sopenharmony_ci 578e41f4b71Sopenharmony_ci 579e41f4b71Sopenharmony_ci> **NOTE** 580e41f4b71Sopenharmony_ci> 581e41f4b71Sopenharmony_ci> - When multiple **transform** attributes are set, the later one overwrites the previous one. To apply multiple transform styles at the same time, use the shorthand notation; that is, write multiple style values in one transform, for example, transform: scale(1) rotate(0) translate(0,0). 582e41f4b71Sopenharmony_ci> 583e41f4b71Sopenharmony_ci> - When using the shorthand notation, note that the animation effect varies according to the sequence of the style values. 584e41f4b71Sopenharmony_ci> 585e41f4b71Sopenharmony_ci> - The style values in the **transform** attribute used when the animation starts and ends must be in one-to-one mapping. Only the styles that have value mappings are played.