5.1 贝塞尔曲线

贝塞尔曲线的特点:

  1. 控制点不总是在曲线上。
  2. 曲线的阶次等于控制点的数量减一。 对于两个点我们能得到一条线性曲线(直线),三个点 — 一条二阶曲线,四个点 — 一条三阶曲线。
  3. 曲线总是在控制点的凸包内部

贝塞尔曲线沿控制点的顺序延伸

贝塞尔曲线的两种定义方法:

  • 使用数学方程式。
  • 使用绘图过程:德卡斯特里奥算法

贝塞尔曲线的优点:

  • 我们可以通过控制点移动来用鼠标绘制平滑线条。
  • 复杂的形状可以由多条贝塞尔曲线组成。

工具:https://cubic-bezier.com/

5.2 CSS 动画

transition

css 动画结束之后,会触发 transitionend 事件
有多少个 transition-property,就会触发多少次 transitionend 事件

  1. boat.onclick = function () {
  2. //...
  3. let times = 1;
  4. function go() {
  5. if (times % 2) {
  6. // 向右移动
  7. boat.classList.remove("back");
  8. boat.style.marginLeft = 100 * times + 200 + "px";
  9. } else {
  10. // 向左移动
  11. boat.classList.add("back");
  12. boat.style.marginLeft = 100 * times - 200 + "px";
  13. }
  14. }
  15. go();
  16. boat.addEventListener("transitionend", function () {
  17. times++;
  18. go();
  19. });
  20. };

练习题 1: 放大图片动画

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <style>
  6. img {
  7. cursor: pointer;
  8. }
  9. </style>
  10. <style>
  11. #flyjet {
  12. width: 40px;
  13. /* -> 400px */
  14. height: 24px;
  15. /* -> 240px */
  16. }
  17. /* ID选择器优先级大于类选择器 */
  18. #flyjet.enlarge {
  19. width: 400px;
  20. height: 240px;
  21. transition: all 3s cubic-bezier(0.1, 0.65, 0.72, 1.49);
  22. }
  23. </style>
  24. </head>
  25. <body>
  26. <img id="flyjet" src="https://en.js.cx/clipart/flyjet.jpg" />
  27. <script>
  28. flyjet.onclick = function () {
  29. this.classList.add("enlarge");
  30. // 有多少个transition-property就触发多少次
  31. let transFlag = false;
  32. flyjet.addEventListener("transitionend", function () {
  33. if (!transFlag) {
  34. alert("done!");
  35. }
  36. transFlag = true;
  37. });
  38. };
  39. </script>
  40. </body>
  41. </html>

练习题 2: 画一个圆圈动画

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <style>
  6. .circle {
  7. transition-property: width, height, margin-left, margin-top;
  8. transition-duration: 2s;
  9. position: fixed;
  10. transform: translateX(-50%) translateY(-50%);
  11. background-color: red;
  12. border-radius: 50%;
  13. /* transition必须有初始值,否则看不到变化 */
  14. width: 0;
  15. height: 0;
  16. }
  17. </style>
  18. </head>
  19. <body>
  20. <div class="circle"></div>
  21. <script>
  22. function showCircle(cx, cy, radius) {
  23. let circle = document.getElementsByClassName("circle")[0];
  24. circle.style.width = 2 * radius + "px";
  25. circle.style.height = 2 * radius + "px";
  26. circle.style.top = cy + "px";
  27. circle.style.left = cx + "px";
  28. }
  29. let button = document.createElement("button");
  30. button.innerText = "showCircle(150,150,100)";
  31. button.onclick = function () {
  32. showCircle(150, 150, 100);
  33. };
  34. document.body.append(button);
  35. </script>
  36. </body>
  37. </html>