实现思路
- 组件结构设计:
- 外层包裹一个容器元素,用于承载动画展示区域。
- 在组件内定义用于存储动画参数(如速度、幅度)的变量。
- 处理交互事件:
- 鼠标拖拽:利用
mousedown
、mousemove
和mouseup
事件。mousedown
记录初始位置和动画参数初始值,mousemove
根据鼠标移动距离更新动画参数,mouseup
停止参数更新。
- 鼠标悬停:使用
mouseenter
和mouseleave
事件,在悬停时修改动画的视觉效果参数(如颜色、透明度等)。
- 鼠标按下:通过
mousedown
和mouseup
事件,按下时改变动画的另一组视觉效果参数。
- 编写动画逻辑:
- 使用Svelte的
transition
或animate
功能来实现动画效果。根据不同的状态和参数值,调整动画的过渡效果。
关键代码片段
<script>
let speed = 1; // 动画速度初始值
let amplitude = 50; // 动画幅度初始值
let isDragging = false;
let initialX;
let initialSpeed;
const handleMouseDown = (e) => {
isDragging = true;
initialX = e.clientX;
initialSpeed = speed;
};
const handleMouseMove = (e) => {
if (isDragging) {
const dx = e.clientX - initialX;
speed = initialSpeed + dx * 0.1; // 根据鼠标移动调整速度
}
};
const handleMouseUp = () => {
isDragging = false;
};
let hovered = false;
let pressed = false;
</script>
<div
on:mousedown={handleMouseDown}
on:mousemove={handleMouseMove}
on:mouseup={handleMouseUp}
on:mouseenter={() => hovered = true}
on:mouseleave={() => hovered = false}
on:mousedown={() => pressed = true}
on:mouseup={() => pressed = false}
style="width: 200px; height: 200px; background-color: {hovered? 'lightblue' : 'gray'};
transform: translateX({pressed? '50px' : '0px'}) scale({amplitude / 50});
animation: move {1 / speed}s linear infinite;"
>
<!-- 动画展示区域 -->
</div>
<style>
@keyframes move {
from {
transform: translateY(0);
}
to {
transform: translateY(100px);
}
}
</style>