怎么使这个小圆球可以自动在折线上滑动呢
时间: 2023-11-22 19:56:35 浏览: 58
Android利用ViewPager实现带小圆球的图片滑动
要让小圆球自动在折线上滑动,你需要实现以下几个步骤:
1. 确定小圆球的起点和终点位置。
2. 计算折线上每个点之间的距离。
3. 根据小圆球在折线上的移动速度,计算出它每次移动的距离。
4. 在小圆球到达终点之前,不断更新小圆球的位置。
5. 在更新小圆球的位置时,可以使用动画效果,使其在折线上平滑移动。
以下是一个简单的实现示例:
```html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>自动滑动小球</title>
<style>
#line {
position: relative;
width: 400px;
height: 200px;
border: 1px solid black;
}
#ball {
position: absolute;
top: 0;
left: 0;
width: 20px;
height: 20px;
border-radius: 50%;
background-color: red;
transition: top 0.5s ease-in-out, left 0.5s ease-in-out;
}
</style>
</head>
<body>
<div id="line">
<div class="point" style="top: 50px; left: 50px;"></div>
<div class="point" style="top: 100px; left: 150px;"></div>
<div class="point" style="top: 150px; left: 250px;"></div>
</div>
<script>
var ball = document.getElementById('ball');
var line = document.getElementById('line');
var points = line.querySelectorAll('.point');
var speed = 50; // 移动速度,单位:像素/秒
var currentPointIndex = 0; // 当前所在的点的索引
var distanceMap = []; // 保存每个点之间的距离
var totalDistance = 0; // 折线的总长度
var startTime = null; // 动画开始时间
// 初始化距离映射表和折线总长度
for (var i = 1; i < points.length; i++) {
var p1 = points[i - 1];
var p2 = points[i];
var distance = Math.sqrt(Math.pow(p2.offsetTop - p1.offsetTop, 2) + Math.pow(p2.offsetLeft - p1.offsetLeft, 2));
distanceMap.push(distance);
totalDistance += distance;
}
function updateBallPosition(timestamp) {
if (!startTime) startTime = timestamp;
var elapsed = timestamp - startTime;
var distance = speed * (elapsed / 1000);
// 如果当前点到达了终点,则跳到下一个点
if (distance > distanceMap[currentPointIndex]) {
distance -= distanceMap[currentPointIndex];
currentPointIndex++;
if (currentPointIndex >= points.length - 1) {
currentPointIndex = 0;
}
}
// 计算小球在当前点和下一个点之间的位置
var p1 = points[currentPointIndex];
var p2 = points[currentPointIndex + 1];
var ratio = distance / distanceMap[currentPointIndex];
var x = p1.offsetLeft + (p2.offsetLeft - p1.offsetLeft) * ratio;
var y = p1.offsetTop + (p2.offsetTop - p1.offsetTop) * ratio;
// 更新小球位置
ball.style.left = x + 'px';
ball.style.top = y + 'px';
// 如果小球还没有到达终点,则继续更新位置
if (currentPointIndex < points.length - 1 || distance < distanceMap[0]) {
requestAnimationFrame(updateBallPosition);
} else {
// 动画结束后重置一些变量
currentPointIndex = 0;
startTime = null;
setTimeout(function() {
requestAnimationFrame(updateBallPosition);
}, 1000); // 等待1秒后重新开始动画
}
}
// 启动动画
requestAnimationFrame(updateBallPosition);
</script>
</body>
</html>
```
在这个示例中,我们根据折线上的点来确定小圆球的起点和终点位置,并且计算出每个点之间的距离。然后,我们根据小圆球的移动速度来计算它每次移动的距离,并在每次移动时更新小圆球的位置。在更新小圆球的位置时,我们使用了CSS3的`transition`属性,让小圆球在折线上平滑移动。最后,我们使用`requestAnimationFrame`来不断更新小圆球的位置,直到它到达终点。当小圆球到达终点时,我们可以让它暂停一段时间,然后重新开始动画。
阅读全文