面试题答案
一键面试构思阶段
- 明确动画需求:确定元素要沿特定路径移动,这需要明确路径的形状(例如直线、曲线等)以及移动的起始点、终点和中间可能的控制点。
- 规划动画函数:思考如何通过数学函数来描述元素在路径上的位置随时间的变化。对于直线移动,可以简单地使用线性插值;对于曲线,可能需要用到贝塞尔曲线等相关算法。
代码实现阶段
- 定义动画函数:
- 以直线移动为例,假设元素要从点
(x1, y1)
移动到(x2, y2)
,动画时间为duration
。可以定义如下函数:
function linearAnimation(t, x1, y1, x2, y2, duration) { const progress = Math.min(t / duration, 1); const newX = x1 + (x2 - x1) * progress; const newY = y1 + (y2 - y1) * progress; return { x: newX, y: newY }; }
- 如果是更复杂的曲线,例如三次贝塞尔曲线,其公式为:
- $B(t) = (1 - t)^3P_0 + 3(1 - t)^2tP_1 + 3(1 - t)t^2P_2 + t^3P_3$,其中 $P_0$ 为起始点,$P_1$、$P_2$ 为控制点,$P_3$ 为终点。代码实现如下:
function cubicBezierAnimation(t, p0, p1, p2, p3, duration) { const progress = Math.min(t / duration, 1); const oneMinusT = 1 - progress; const x = oneMinusT * oneMinusT * oneMinusT * p0.x + 3 * oneMinusT * oneMinusT * progress * p1.x + 3 * oneMinusT * progress * progress * p2.x + progress * progress * progress * p3.x; const y = oneMinusT * oneMinusT * oneMinusT * p0.y + 3 * oneMinusT * oneMinusT * progress * p1.y + 3 * oneMinusT * progress * progress * p2.y + progress * progress * progress * p3.y; return { x, y }; }
- 以直线移动为例,假设元素要从点
- 在组件中使用动画函数:
- 首先在 Svelte 组件中导入动画函数:
<script> import { cubicBezierAnimation } from './animationFunctions.js'; let startTime; let isAnimating = false; let position = { x: 0, y: 0 }; const p0 = { x: 0, y: 0 }; const p1 = { x: 100, y: 200 }; const p2 = { x: 300, y: 100 }; const p3 = { x: 400, y: 400 }; const duration = 3000; // 3 seconds function startAnimation() { startTime = Date.now(); isAnimating = true; const interval = setInterval(() => { const elapsedTime = Date.now() - startTime; position = cubicBezierAnimation(elapsedTime, p0, p1, p2, p3, duration); if (elapsedTime >= duration) { clearInterval(interval); isAnimating = false; } }, 16); // 大约 60fps } </script> <button on:click={startAnimation}>Start Animation</button> {#if isAnimating} <div style="position: absolute; left: {position.x}px; top: {position.y}px; background-color: blue; width: 50px; height: 50px;"></div> {/if}
- Svelte 响应式原理:
- 在 Svelte 中,当变量(如
position
)发生变化时,Svelte 的响应式系统会自动检测到这种变化。 - 由于
position
用于设置div
元素的left
和top
样式属性,当position
改变时,Svelte 会重新计算并更新 DOM 中div
的样式,从而实现动画效果。这种响应式机制基于 JavaScript 的赋值操作,Svelte 会在编译时对组件代码进行转换,添加必要的依赖跟踪和更新逻辑,使得状态变化能够高效地反映到视图上。
- 在 Svelte 中,当变量(如