html5+vue无法拖拽,vue+mousemove实现鼠标拖动功能(拖动过快失效问题解决方法)

今天用vue+原生js的mousemove事件,写了个拖动,发现只能慢慢拖动才行,鼠标只要移动快了,就失效,不能拖动了;

搞了半天在,总算解决了,但是问题的深层原理还没搞清楚,知道的大侠可以留言分享,下面直接上代码:

只能慢速拖动的代码:

vue结合原生js实现拖动

{{ site.name }}

{{ index }} : {{ site.name }}

new Vue({

el: '#app',

data: {

list1: [{name:'拖动我', index:0}],

list2: [{name:'a', index:0}, {name:'b', index:1}, {name:'c', index: 2}, {name:'d', index: 3}],

vm:'',

sb_bkx: 0,

sb_bky: 0,

is_moving: false

},

methods: {

mousedown: function (site, event) {

var startx=event.x;

var starty=event.y;

this.sb_bkx=startx - event.target.offsetLeft;

this.sb_bky=starty - event.target.offsetTop;

this.is_moving = true;

},

mousemove: function (site, event) {

var endx=event.x - this.sb_bkx;

var endy=event.y - this.sb_bky;

var _this = this

if(this.is_moving){

event.target.style.left=endx+'px';

event.target.style.top=endy+'px';

}

},

mouseup: function (e) {

this.is_moving = false;

}

}

})

.ctn{

line-height: 50px;

cursor: pointer;

font-size: 20px;

text-align: center;

float: left;

}

.sub:hover{

background: #e6dcdc;

color: white;

width: 100px;

}

.ctn1{

border: 1px solid green;

width: 100px;

}

.ctn2{

border: 1px solid black;

width: 100px;

margin-left: 50px;

}

.fixed{

width: 100px;

height: 100px;

position: fixed;

background: red;

left: 10px;

top: 10px;

cursor: move;

}

可以快速拖动的代码:

vue结合原生js实现拖动

{{ site.name }}

{{ index }} : {{ site.name }}

new Vue({

el: '#app',

data: {

list1: [{name:'拖动我', index:0}],

list2: [{name:'a', index:0}, {name:'b', index:1}, {name:'c', index: 2}, {name:'d', index: 3}],

vm:'',

sb_bkx: 0,

sb_bky: 0,

},

methods: {

mousedown: function (site, event) {

var event=event||window.event;

var _target = event.target

var startx=event.clientX;

var starty=event.clientY;

var sb_bkx=startx-event.target.offsetLeft;

var sb_bky=starty-event.target.offsetTop;

var ww=document.documentElement.clientWidth;

var wh = window.innerHeight;

if (event.preventDefault) {

event.preventDefault();

} else{

event.returnValue=false;

};

document.οnmοusemοve=function (ev) {

var event=ev||window.event;

var scrolltop=document.documentElement.scrollTop||document.body.scrollTop;

if (event.clientY < 0 || event.clientX < 0 || event.clientY > wh || event.clientX > ww) {

return false;

};

var endx=event.clientX-sb_bkx;

var endy=event.clientY-sb_bky;

_target.style.left=endx+'px';

_target.style.top=endy+'px';

}

},

mouseup: function (e) {

document.οnmοusemοve=null;

}

}

})

.ctn{

line-height: 50px;

cursor: pointer;

font-size: 20px;

text-align: center;

float: left;

}

.sub:hover{

background: #e6dcdc;

color: white;

width: 100px;

}

.ctn1{

border: 1px solid green;

width: 100px;

}

.ctn2{

border: 1px solid black;

width: 100px;

margin-left: 50px;

}

.fixed{

width: 100px;

height: 100px;

position: fixed;

background: red;

left: 10px;

top: 15px;

cursor: move;

}

补充:vue 自定义指令-拖拽

主要思想: 获取拖拽的dom元素,在oDiv.onmousedown事件内获取鼠标相对dom元素本身的位置:

var disX=ev.clientX-oDiv.offsetLeft;

var disY=ev.clientY-oDiv.offsetTop;

再通过document.onmousemove事件计算dom元素左上角相对 视口的距离:

var l=ev.clientX-disX;

var t=ev.clientY-disY;

oDiv.style.left=l+'px';

oDiv.style.top=t+'px';

完整代码:

/* vue-自定义指令-拖拽 */

Vue.directive('drag',function(){

var oDiv=this.el;

oDiv.οnmοusedοwn=function(ev){

var disX=ev.clientX-oDiv.offsetLeft;

var disY=ev.clientY-oDiv.offsetTop;

document.οnmοusemοve=function(ev){

var l=ev.clientX-disX;

var t=ev.clientY-disY;

oDiv.style.left=l+'px';

oDiv.style.top=t+'px';

};

document.οnmοuseup=function(){

document.οnmοusemοve=null;

document.οnmοuseup=null;

};

};

});

window.οnlοad=function(){

var vm=new Vue({

el:'#box',

data:{

msg:'welcome'

}

});

};

总结

以上所述是小编给大家介绍的vue+mousemove实现鼠标拖动功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现可调整节点的线,可以考虑使用SVG元素和JavaScript来实现。以下是一个基本的实现步骤: 1. 创建SVG元素,包括线和圆圈节点 ```html <svg id="svg-container"> <line id="line" x1="100" y1="100" x2="300" y2="100"></line> <circle id="start-node" cx="100" cy="100" r="6"></circle> <circle id="end-node" cx="300" cy="100" r="6"></circle> </svg> ``` 2. 使用JavaScript获取SVG元素和节点,并添加事件监听器 ```javascript const svgContainer = document.getElementById('svg-container'); const line = document.getElementById('line'); const startNode = document.getElementById('start-node'); const endNode = document.getElementById('end-node'); startNode.addEventListener('mousedown', startDrag); endNode.addEventListener('mousedown', startDrag); svgContainer.addEventListener('mousemove', drag); svgContainer.addEventListener('mouseup', endDrag); ``` 3. 编写事件处理函数,实现节点拖动和线的更新 ```javascript let activeNode = null; function startDrag(event) { activeNode = event.target; } function drag(event) { if (activeNode) { const rect = svgContainer.getBoundingClientRect(); const x = event.clientX - rect.left; const y = event.clientY - rect.top; activeNode.setAttribute('cx', x); activeNode.setAttribute('cy', y); updateLine(); } } function endDrag() { activeNode = null; } function updateLine() { const x1 = startNode.getAttribute('cx'); const y1 = startNode.getAttribute('cy'); const x2 = endNode.getAttribute('cx'); const y2 = endNode.getAttribute('cy'); line.setAttribute('x1', x1); line.setAttribute('y1', y1); line.setAttribute('x2', x2); line.setAttribute('y2', y2); } ``` 4. 可以根据需求修改代码,例如添加限制条件、计算线的角度等等。 上述代码只是一个简单的示例,如果要实现更复杂的功能,可以考虑使用现有的图表库,例如ECharts。以下是一个使用Vue和ECharts实现拖动节点的折线图的示例代码: ```vue <template> <div ref="chart" style="height: 400px;"></div> </template> <script> import * as echarts from 'echarts'; export default { data() { return { chartData: { nodes: [ { id: 'A', x: 100, y: 100 }, { id: 'B', x: 300, y: 100 }, ], links: [ { source: 'A', target: 'B' }, ], }, activeNode: null, }; }, mounted() { this.initChart(); }, methods: { initChart() { const chart = echarts.init(this.$refs.chart); chart.setOption({ series: [ { type: 'graph', layout: 'none', draggable: true, roam: true, symbolSize: 50, edgeSymbol: ['none', 'arrow'], edgeLabel: { show: true, }, data: this.chartData.nodes.map(node => ({ id: node.id, x: node.x, y: node.y, })), edges: this.chartData.links.map(link => ({ source: link.source, target: link.target, })), lineStyle: { width: 2, }, }, ], }); chart.on('mousedown', this.startDrag); chart.on('mousemove', this.drag); chart.on('mouseup', this.endDrag); window.addEventListener('mouseup', this.endDrag); }, startDrag(event) { if (event.target.dataType === 'node') { this.activeNode = event.target; } }, drag(event) { if (this.activeNode) { const chart = this.$refs.chart.getEchartsInstance(); const node = this.chartData.nodes.find(n => n.id === this.activeNode.id); const { offsetX, offsetY } = chart.convertFromPixel({ seriesIndex: 0 }, [event.offsetX, event.offsetY]); node.x = offsetX; node.y = offsetY; this.updateLinks(); } }, endDrag() { this.activeNode = null; }, updateLinks() { const chart = this.$refs.chart.getEchartsInstance(); const nodes = chart.getOption().series[0].data; const links = chart.getOption().series[0].edges; this.chartData.links.forEach(link => { const sourceNode = nodes.find(node => node.id === link.source); const targetNode = nodes.find(node => node.id === link.target); const [x1, y1] = chart.convertToPixel({ seriesIndex: 0 }, [sourceNode.x, sourceNode.y]); const [x2, y2] = chart.convertToPixel({ seriesIndex: 0 }, [targetNode.x, targetNode.y]); link.lineStyle = { width: 2, curveness: 0.2, type: 'solid', }; link.label = { show: true, position: 'middle', }; link.data = [ { coord: [x1, y1] }, { coord: [x2, y2] }, ]; }); chart.setOption({ series: [{ data: nodes, edges: links, }], }); }, }, }; </script> ``` 这个示例使用了ECharts的图形组件和坐标系组件,实现了可以拖动节点的折线图,并且支持拖动方向和上下限的设置。具体实现过程可以参考ECharts的官方文档和示例代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值