LeaVerou 大牛 2014 jsconf > asia speech

    http://lea.verou.me/css-4d/ b站视频资源 https://www.bilibili.com/video/av22257628/
    阮一峰老师推荐 http://www.ruanyifeng.com/blog/2014/02/css_transition_and_animation.html

    1. <!DOCTYPE html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8" />
    5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    6. <title>CSS 3 transition & animation</title>
    7. <link rel="stylesheet" href="style.css" />
    8. </head>
    9. <body>
    10. <img class="spiral" src="./img/spiral.png"></img>
    11. <div class="heart">
    12. <img src="./img/heart.svg"></img>
    13. </div>
    14. <div style="display: flex;">
    15. <div class="barX">
    16. <span>rotateX</span>
    17. <img src="./img/frames.png"></img>
    18. </div>
    19. <div class="barY">
    20. <span>rotateY</span>
    21. <img src="./img/frames.png"></img>
    22. </div>
    23. <div class="barZ">
    24. <span>rotateZ</span>
    25. <img src="./img/frames.png"></img>
    26. </div>
    27. </div>
    28. </body>
    29. </html>
    1. @keyframes living {
    2. from {
    3. transform: rotate(0deg);
    4. }
    5. 50% {
    6. transform: rotate(180deg);
    7. }
    8. to {
    9. transform: rotate(360deg);
    10. }
    11. }
    12. .spiral {
    13. width: 150px;
    14. height: 150px;
    15. animation: 5s 3s living linear infinite;
    16. /* transition-duration */
    17. transition: 3s;
    18. /* transition-property */
    19. /* transition: 3s height; */
    20. /* transition: 2s width, 2s height; */
    21. /* transition-delay */
    22. /* transition: 2s height, 2s 2s width; */
    23. /* transition-timing-function */
    24. /* transition: 2s height linear, 2s 2s width ease-in-out; */
    25. /* transition: 1s cubic-bezier(0.83, 0.97, 0.05, 1.44); */
    26. }
    27. /*
    28. transition需要明确知道,开始状态和结束状态的具体数值,才能计算出中间状态。
    29. 比如,height从0px变化到100px,transition可以算出中间状态。
    30. 但是,transition没法算出0px到auto的中间状态,
    31. 也就是说,如果开始或结束的设置是height: auto,那么就不会产生动画效果。
    32. 类似的情况还有,display: none到block,background: url(foo.jpg)到url(bar.jpg)等等。
    33. */
    34. .spiral:hover {
    35. width: 300px;
    36. height: 300px;
    37. /* transform: none; */
    38. /* 转换——移动 */
    39. /* transform: translate(100px, 50px); */
    40. /* transform: translate3d(100px, 200px, 30px); */
    41. /* transform: translateX(200px); */
    42. /* transform: translateY(200px); */
    43. /* 转换——缩放 */
    44. /* transform: scale(1.2); */
    45. /* transform: scale(0.8, 1.2); */
    46. /* transform: scale3d(0.8, 0.9, 1.1); */
    47. /* transform: scaleX(0.5); */
    48. /* transform: scaleY(0.5); */
    49. /* transform: scaleZ(1); */
    50. /* 转换——旋转 */
    51. /* transform: rotate(90deg); */
    52. /* transform: rotate3d(10, 20, 30, 60deg); */
    53. /* transform: rotateX(60deg); */
    54. /* transform: rotateY(60deg); */
    55. /* transform: rotateZ(60deg); */
    56. /* 转换——倾斜 */
    57. /* transform: skew(30deg, 30deg); */
    58. /* transform: skewX(30deg); */
    59. /* transform: skewY(60deg); */
    60. }
    61. /*
    62. transition的优点在于简单易用,但是它有几个很大的局限。
    63. (1)transition需要事件触发,所以没法在网页加载时自动发生。
    64. (2)transition是一次性的,不能重复发生,除非一再触发。
    65. (3)transition只能定义开始状态和结束状态,不能定义中间状态,也就是说只有两个状态。
    66. (4)一条transition规则,只能定义一个属性的变化,不能涉及多个属性。
    67. CSS Animation就是为了解决这些问题而提出的。
    68. */
    69. /* 三个状态 */
    70. @keyframes rainbow {
    71. from {
    72. background: #c00;
    73. }
    74. 50% {
    75. background: orange;
    76. }
    77. to {
    78. background: yellowgreen;
    79. }
    80. }
    81. @keyframes beats {
    82. from,
    83. to {
    84. transform: scale(0.8) translateX(-50px);
    85. }
    86. /* 25% {
    87. transform: scale(1) translate(0);
    88. } */
    89. 50% {
    90. transform: scale(1.2) translateX(50px);
    91. }
    92. /* 75% {
    93. transform: scale(1) translate(0);
    94. } */
    95. }
    96. .heart {
    97. width: 500px;
    98. height: 300px;
    99. text-align: center;
    100. /* 如果想让动画保持突然终止时的状态,就要使用animation-play-state属性 */
    101. animation: 1s rainbow infinite;
    102. animation-play-state: paused;
    103. }
    104. .heart img {
    105. width: 300px;
    106. height: 300px;
    107. }
    108. .heart:hover {
    109. /* animation: name duration timing-function delay iteration-count direction fill-mode; */
    110. /* 默认情况下,动画只播放一次。 animation-duration animation-name */
    111. /* animation: 1s rainbow; */
    112. /* animation-timing-function linear、ease-in */
    113. /* animation: 1s rainbow linear; */
    114. /* animation-delay */
    115. /* animation: 1s rainbow ease-in 2s; */
    116. /* 指定播放次数 iteration-count */
    117. /* animation: 2s rainbow 3; */
    118. /* infinite关键字,可以让动画无限次播放 infinite... */
    119. /* animation: 1s rainbow infinite; */
    120. /* animation-direction: normal、alternate、reverse、alternate-reverse */
    121. /* animation: 2s rainbow 3 normal; */
    122. /* animation: 2s rainbow 3 alternate; */
    123. /* animation: 2s rainbow 3 reverse; */
    124. /* animation: 2s rainbow 3 alternate-reverse; */
    125. /* 保持在结束状态, animation-fill-mode: none/forwards/backwards/both */
    126. /* animation: 2s rainbow forwards; */
    127. /* 浏览器从一个状态向另一个状态过渡,是平滑过渡。steps函数可以实现分步过渡。 */
    128. /* animation: 1s rainbow infinite steps(10); */
    129. animation-play-state: running;
    130. }
    131. .heart img:hover {
    132. animation: 1s beats infinite;
    133. }
    134. @keyframes rotateX {
    135. from {
    136. transform: rotateX(0deg);
    137. }
    138. 50% {
    139. transform: rotateX(180deg);
    140. }
    141. to {
    142. transform: rotateX(360deg);
    143. }
    144. }
    145. @keyframes rotateY {
    146. from {
    147. transform: rotateY(0deg);
    148. }
    149. 50% {
    150. transform: rotateY(180deg);
    151. }
    152. to {
    153. transform: rotateY(360deg);
    154. }
    155. }
    156. @keyframes rotateZ {
    157. from {
    158. transform: rotateZ(0deg);
    159. }
    160. 50% {
    161. transform: rotateZ(180deg);
    162. }
    163. to {
    164. transform: rotateZ(360deg);
    165. }
    166. }
    167. .barX {
    168. width: 300px;
    169. height: 300px;
    170. line-height: 150px;
    171. }
    172. .barX img {
    173. width: 100%;
    174. animation: 1s rotateX linear infinite;
    175. }
    176. .barY {
    177. width: 300px;
    178. height: 300px;
    179. line-height: 150px;
    180. }
    181. .barY img {
    182. width: 100%;
    183. animation: 3s rotateY linear infinite alternate;
    184. }
    185. .barZ {
    186. width: 300px;
    187. height: 300px;
    188. line-height: 150px;
    189. }
    190. .barZ img {
    191. width: 100%;
    192. animation: 5s rotateZ linear infinite reverse;
    193. }

    spiral.png
    spiral.png

    heart.svg
    heart.svg
    frames.png
    frames.png