svg.draggable.js-实现svg拖拽的js插件
时间: 2024-01-04 10:11:08 浏览: 207
`svg.draggable.js` 是一个 JavaScript 插件,可用于实现 SVG 元素的拖拽功能。该插件非常轻量级,大小仅有不到 1KB。
使用该插件非常简单,只需在页面中引入插件文件,然后调用 `draggable()` 方法即可使 SVG 元素可拖拽。例如:
```html
<!DOCTYPE html>
<html>
<head>
<script src="https://cdn.jsdelivr.net/npm/svg.draggable.js"></script>
</head>
<body>
<svg width="200" height="200">
<rect id="myRect" x="50" y="50" width="100" height="100" fill="blue"/>
</svg>
<script>
// 将 ID 为 "myRect" 的矩形元素设为可拖拽
SVG.get('myRect').draggable();
</script>
</body>
</html>
```
此外,该插件还提供了一些可选的配置选项,例如限制拖拽范围、设置拖拽时的光标样式等。更多信息可以参考官方文档:https://github.com/wout/svg.draggable.js
相关问题
vue-draggable-resizable不规则图形
Vue draggable resizable是一个强大的JavaScript库,它允许你在Vue应用中轻松地创建可拖动和可调整大小的元素,通常用于布局管理。对于不规则图形的支持,它默认适用于矩形元素,即每个元素都有固定的宽高。然而,你可以通过一些技巧来模拟不规则图形:
1. **自定义渲染**:如果需要非矩形形状,可以创建一个自定义的Vue组件,并利用`v-if`或`v-for`循环来渲染每个小块。将这些小块作为不可单独拖动和调整大小的基本单元,然后通过CSS组合来实现复杂的形状。
2. **使用SVG**:如果你的形状可以用矢量图表示,可以在每个小块中嵌套SVG元素,利用SVG的路径工具描绘出不规则形状,然后通过改变其样式或位置来控制形状的变换。
3. **计算定位**:在后台计算每个小块的准确位置和尺寸,当用户尝试调整时,更新这些值并相应地更新DOM来模拟新的形状。
请注意,虽然不是原生支持,但通过一些巧妙的设计和编码,大部分不规则图形的需求都可以在vue-draggable-resizable中实现。如果你有特定的形状需求,可能需要结合其他库或者自定义解决方案。
生成vue代码,实现使用svg画一条path路径,使用鼠标点击拖动可以沿着path拖动一个元素
好的,对于这个问题,我可以给你提供一段生成 Vue 代码的示例。首先,在你的 Vue 项目中,你需要安装 SVG 插件,可以使用如下命令:
```
npm install vue-svg-loader --save-dev
```
接下来,在你的 Vue 组件中,你可以使用如下代码来生成一条 path 路径和一个可拖动的元素:
```
<template>
<div>
<svg viewBox="0 0 100 100">
<path d="M10,10 L90,90" stroke="black" stroke-width="2" fill="none" ref="path" />
<circle cx="10" cy="10" r="5" fill="blue" v-draggable />
</svg>
</div>
</template>
<script>
export default {
directives: {
draggable: {
inserted: function (el) {
var path = el.parentNode.querySelector('path');
var pathLength = path.getTotalLength();
var startOffset = path.getPointAtLength(0);
var endOffset = path.getPointAtLength(pathLength);
var bbox = el.getBBox();
var startX = bbox.x + bbox.width/2;
var startY = bbox.y + bbox.height/2;
var transform = el.getAttribute('transform');
transform = transform ? transform + ' ' : '';
el.setAttribute('transform', transform + 'translate(' + startX + ',' + startY + ')');
var drag = function (e) {
var x = e.clientX - el.offsetLeft;
var y = e.clientY - el.offsetTop;
var angle = Math.atan2(endOffset.y - startOffset.y, endOffset.x - startOffset.x);
var offset = Math.min(Math.max(0, (x - startX) * Math.cos(angle) + (y - startY) * Math.sin(angle)), pathLength);
var point = path.getPointAtLength(offset);
el.setAttribute('transform', transform + 'translate(' + point.x + ',' + point.y + ')');
};
el.addEventListener('mousedown', function (e) {
el.classList.add('dragging');
document.addEventListener('mousemove', drag);
});
el.addEventListener('mouseup', function (e) {
el.classList.remove('dragging');
document.removeEventListener('mousemove', drag);
});
}
}
}
}
</script>
```
这段代码中,我们首先在 SVG 中创建了一个 path 路径,并设置了其 stroke 和 stroke-width 属性,然后创建了一个圆形元素,并添加了 v-draggable 指令,用于实现拖动功能。
在 directive 中,我们首先获取 path 路径的长度和开始结束点的坐标,以及圆形元素的起始位置。然后在鼠标拖动时,根据鼠标位置计算出当前所在的 path 路径位置,并使用 path.getPointAtLength() 方法获取该位置的坐标,最后将圆形元素移动到该位置即可。
希望这个示例对你有帮助!
阅读全文