5.1 贝塞尔曲线
贝塞尔曲线的特点:
- 控制点不总是在曲线上。
- 曲线的阶次等于控制点的数量减一。 对于两个点我们能得到一条线性曲线(直线),三个点 — 一条二阶曲线,四个点 — 一条三阶曲线。
- 曲线总是在控制点的凸包内部
贝塞尔曲线沿控制点的顺序延伸
贝塞尔曲线的两种定义方法:
- 使用数学方程式。
- 使用绘图过程:德卡斯特里奥算法
贝塞尔曲线的优点:
- 我们可以通过控制点移动来用鼠标绘制平滑线条。
- 复杂的形状可以由多条贝塞尔曲线组成。
5.2 CSS 动画
transition
css 动画结束之后,会触发 transitionend 事件
有多少个 transition-property,就会触发多少次 transitionend 事件
boat.onclick = function () {//...let times = 1;function go() {if (times % 2) {// 向右移动boat.classList.remove("back");boat.style.marginLeft = 100 * times + 200 + "px";} else {// 向左移动boat.classList.add("back");boat.style.marginLeft = 100 * times - 200 + "px";}}go();boat.addEventListener("transitionend", function () {times++;go();});};
练习题 1: 放大图片动画
<!DOCTYPE html><html><head><meta charset="utf-8" /><style>img {cursor: pointer;}</style><style>#flyjet {width: 40px;/* -> 400px */height: 24px;/* -> 240px */}/* ID选择器优先级大于类选择器 */#flyjet.enlarge {width: 400px;height: 240px;transition: all 3s cubic-bezier(0.1, 0.65, 0.72, 1.49);}</style></head><body><img id="flyjet" src="https://en.js.cx/clipart/flyjet.jpg" /><script>flyjet.onclick = function () {this.classList.add("enlarge");// 有多少个transition-property就触发多少次let transFlag = false;flyjet.addEventListener("transitionend", function () {if (!transFlag) {alert("done!");}transFlag = true;});};</script></body></html>
练习题 2: 画一个圆圈动画
<!DOCTYPE html><html><head><meta charset="utf-8" /><style>.circle {transition-property: width, height, margin-left, margin-top;transition-duration: 2s;position: fixed;transform: translateX(-50%) translateY(-50%);background-color: red;border-radius: 50%;/* transition必须有初始值,否则看不到变化 */width: 0;height: 0;}</style></head><body><div class="circle"></div><script>function showCircle(cx, cy, radius) {let circle = document.getElementsByClassName("circle")[0];circle.style.width = 2 * radius + "px";circle.style.height = 2 * radius + "px";circle.style.top = cy + "px";circle.style.left = cx + "px";}let button = document.createElement("button");button.innerText = "showCircle(150,150,100)";button.onclick = function () {showCircle(150, 150, 100);};document.body.append(button);</script></body></html>
