使用vue模拟一个无人机飞行轨迹,即控制一个图片随机移动,首先先生成下一次图片的位置,然后慢慢移动过去,并且能看到移动轨迹(虚线),请给我写个详细的例子
时间: 2024-02-21 16:59:37 浏览: 113
好的,以下是一个基于Vue的无人机飞行轨迹的例子:
HTML部分:
```html
<div id="app">
<div class="container">
<img class="drone" :src="droneSrc" :style="droneStyle" />
<svg class="path" :width="pathWidth" :height="pathHeight">
<path :d="path" stroke-dasharray="5,5" stroke="#ccc" fill="none"></path>
</svg>
</div>
</div>
```
CSS部分:
```css
.container {
position: relative;
width: 500px;
height: 500px;
border: 1px solid #ccc;
}
.drone {
position: absolute;
}
.path {
position: absolute;
top: 0;
left: 0;
pointer-events: none;
}
```
JavaScript部分:
```javascript
new Vue({
el: "#app",
data() {
return {
droneSrc: "https://picsum.photos/50",
droneStyle: {},
pathWidth: 500,
pathHeight: 500,
path: "",
duration: 1000 // 移动时间,单位为毫秒
}
},
mounted() {
this.moveDrone();
},
methods: {
moveDrone() {
const container = document.querySelector(".container");
const drone = document.querySelector(".drone");
const path = document.querySelector(".path path");
const containerWidth = container.clientWidth;
const containerHeight = container.clientHeight;
const droneWidth = drone.clientWidth;
const droneHeight = drone.clientHeight;
const x1 = Math.floor(Math.random() * (containerWidth - droneWidth));
const y1 = Math.floor(Math.random() * (containerHeight - droneHeight));
const x2 = Math.floor(Math.random() * (containerWidth - droneWidth));
const y2 = Math.floor(Math.random() * (containerHeight - droneHeight));
const pathData = `M${x1},${y1} L${x2},${y2}`;
path.setAttribute("d", pathData);
this.droneStyle = {
left: `${x1}px`,
top: `${y1}px`,
transition: `transform ${this.duration}ms linear`
};
setTimeout(() => {
this.droneStyle.transform = `translate(${x2 - x1}px, ${y2 - y1}px)`;
}, 0);
setTimeout(() => {
this.moveDrone();
}, this.duration);
}
}
})
```
解释一下代码:
1. 首先在HTML中定义了一个容器,包含了一个无人机图片和一个SVG路径。图片使用了绝对定位,SVG路径使用了相对定位,将其放置在图片上方,并使用CSS中的`pointer-events: none`使其不会阻挡鼠标事件。
2. 在Vue实例中定义了一些数据,包括无人机图片的路径和样式,SVG路径的宽度、高度和路径数据,以及无人机移动的时间。
3. 在Vue的`mounted`生命周期钩子中调用了`moveDrone`方法,开始执行无人机的移动。
4. `moveDrone`方法中首先获取了容器、无人机图片和SVG路径的一些信息,包括宽度、高度和位置。
5. 然后使用`Math.random`方法生成了下一次无人机的位置,并根据这个位置生成了SVG路径的数据。路径数据的格式为`Mx1,y1 Lx2,y2`,表示从`x1,y1`到`x2,y2`的一条直线。
6. 将路径数据设置给SVG路径的`d`属性,将无人机的样式设置为绝对定位,并使用`transition`属性设置了移动的时间和动画效果。
7. 通过`setTimeout`方法将无人机的`transform`属性设置为`translate(x2 - x1, y2 - y1)`,实现无人机的移动。
8. 在移动完成后,通过`setTimeout`方法再次调用`moveDrone`方法,开始下一次移动。
这样就实现了一个无人机飞行轨迹的效果,同时也能看到移动的轨迹。
阅读全文